Version 0.1.6 from FTP
[asterisk/asterisk.git] / include / asterisk / module.h
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Module definitions
5  * 
6  * Copyright (C) 1999, Adtran Inc. and Linux Support Services, LLC
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #ifndef _ASTERISK_MODULE_H
15 #define _ASTERISK_MODULE_H
16
17 #if defined(__cplusplus) || defined(c_plusplus)
18 extern "C" {
19 #endif
20
21 /* Every module must provide these functions */
22
23 int load_module(void);                  /* Initialize the module */
24 int unload_module(void);                /* Cleanup all module structures, 
25                                            sockets, etc */
26 int usecount(void);                     /* How many channels provided by this module are in use? */
27 char *description(void);                /* Description of this module */
28
29 #define AST_MODULE_CONFIG "modules.conf" /* Module configuration file */
30
31 #define AST_FORCE_SOFT 0
32 #define AST_FORCE_FIRM 1
33 #define AST_FORCE_HARD 2
34
35 /* Load a module */
36 int ast_load_resource(char *resource_name);
37
38 /* Unload a module.  Force unloading a module is not recommended. */
39 int ast_unload_resource(char *resource_name, int force);
40
41 /* Notify when usecount has been changed */
42 void ast_update_use_count(void);
43
44 /* Ask for a list of modules, descriptions, and use counts */
45 int ast_update_module_list(int (*modentry)(char *module, char *description, int usecnt));
46
47 /* Ask this procedure to be run with modules have been updated */
48 int ast_loader_register(int (*updater)(void));
49
50 /* No longer run me when modules are updated */
51 int ast_loader_unregister(int (*updater)(void));
52
53 /* Local user routines keep track of which channels are using a given module resource.
54    They can help make removing modules safer, particularly if they're in use at the time
55    they have been requested to be removed */
56
57 #define STANDARD_LOCAL_USER struct localuser { \
58                                                                 struct ast_channel *chan; \
59                                                                 struct localuser *next; \
60                                                         }
61
62 #define LOCAL_USER_DECL static pthread_mutex_t localuser_lock = PTHREAD_MUTEX_INITIALIZER; \
63                                                 static struct localuser *localusers = NULL; \
64                                                 static int localusecnt = 0;
65
66 #define LOCAL_USER_ADD(u) { \
67  \
68         if (!(u=malloc(sizeof(struct localuser)))) { \
69                 ast_log(LOG_WARNING, "Out of memory\n"); \
70                 return -1; \
71         } \
72         pthread_mutex_lock(&localuser_lock); \
73         u->chan = chan; \
74         u->next = localusers; \
75         localusers = u; \
76         localusecnt++; \
77         pthread_mutex_unlock(&localuser_lock); \
78         ast_update_use_count(); \
79 }
80
81 #define LOCAL_USER_REMOVE(u) { \
82         struct localuser *uc, *ul = NULL; \
83         pthread_mutex_lock(&localuser_lock); \
84         uc = localusers; \
85         while (uc) { \
86                 if (uc == u) { \
87                         if (ul) \
88                                 ul->next = uc->next; \
89                         else \
90                                 localusers = uc->next; \
91                         break; \
92                 } \
93                 ul = uc; \
94                 uc = uc->next; \
95         }\
96         free(u); \
97         localusecnt--; \
98         pthread_mutex_unlock(&localuser_lock); \
99         ast_update_use_count(); \
100 }
101
102 #define STANDARD_HANGUP_LOCALUSERS { \
103         struct localuser *u, *ul; \
104         pthread_mutex_lock(&localuser_lock); \
105         u = localusers; \
106         while(u) { \
107                 ast_softhangup(u->chan); \
108                 ul = u; \
109                 u = u->next; \
110                 free(ul); \
111         } \
112         pthread_mutex_unlock(&localuser_lock); \
113         localusecnt=0; \
114 }
115
116 #define STANDARD_USECOUNT(res) { \
117         pthread_mutex_lock(&localuser_lock); \
118         res = localusecnt; \
119         pthread_mutex_unlock(&localuser_lock); \
120 }
121         
122         
123
124 #if defined(__cplusplus) || defined(c_plusplus)
125 }
126 #endif
127 #endif