Version 0.1.7 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, Mark Spencer
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 char *key(void);                /* Return the below mentioned key, unmodified */
29
30 int reload(void);
31
32 #define ASTERISK_GPL_KEY \
33         "This paragraph is Copyright (C) 2000, Linux Support Services, Inc.  \
34 In order for your module to load, it must return this key via a function \
35 called \"key\".  Any code which includes this paragraph must be licensed under \
36 the GNU General Public License version 2 or later (at your option).   Linux \
37 Support Services, Inc. reserves the right to allow other parties to license \
38 this paragraph under other terms as well."
39
40 #define AST_MODULE_CONFIG "modules.conf" /* Module configuration file */
41
42 #define AST_FORCE_SOFT 0
43 #define AST_FORCE_FIRM 1
44 #define AST_FORCE_HARD 2
45
46 /* Load a module */
47 int ast_load_resource(char *resource_name);
48
49 /* Unload a module.  Force unloading a module is not recommended. */
50 int ast_unload_resource(char *resource_name, int force);
51
52 /* Notify when usecount has been changed */
53 void ast_update_use_count(void);
54
55 /* Ask for a list of modules, descriptions, and use counts */
56 int ast_update_module_list(int (*modentry)(char *module, char *description, int usecnt));
57
58 /* Ask this procedure to be run with modules have been updated */
59 int ast_loader_register(int (*updater)(void));
60
61 /* No longer run me when modules are updated */
62 int ast_loader_unregister(int (*updater)(void));
63
64 /* Local user routines keep track of which channels are using a given module resource.
65    They can help make removing modules safer, particularly if they're in use at the time
66    they have been requested to be removed */
67
68 #define STANDARD_LOCAL_USER struct localuser { \
69                                                                 struct ast_channel *chan; \
70                                                                 struct localuser *next; \
71                                                         }
72
73 #define LOCAL_USER_DECL static pthread_mutex_t localuser_lock = PTHREAD_MUTEX_INITIALIZER; \
74                                                 static struct localuser *localusers = NULL; \
75                                                 static int localusecnt = 0;
76
77 #define LOCAL_USER_ADD(u) { \
78  \
79         if (!(u=malloc(sizeof(struct localuser)))) { \
80                 ast_log(LOG_WARNING, "Out of memory\n"); \
81                 return -1; \
82         } \
83         pthread_mutex_lock(&localuser_lock); \
84         u->chan = chan; \
85         u->next = localusers; \
86         localusers = u; \
87         localusecnt++; \
88         pthread_mutex_unlock(&localuser_lock); \
89         ast_update_use_count(); \
90 }
91
92 #define LOCAL_USER_REMOVE(u) { \
93         struct localuser *uc, *ul = NULL; \
94         pthread_mutex_lock(&localuser_lock); \
95         uc = localusers; \
96         while (uc) { \
97                 if (uc == u) { \
98                         if (ul) \
99                                 ul->next = uc->next; \
100                         else \
101                                 localusers = uc->next; \
102                         break; \
103                 } \
104                 ul = uc; \
105                 uc = uc->next; \
106         }\
107         free(u); \
108         localusecnt--; \
109         pthread_mutex_unlock(&localuser_lock); \
110         ast_update_use_count(); \
111 }
112
113 #define STANDARD_HANGUP_LOCALUSERS { \
114         struct localuser *u, *ul; \
115         pthread_mutex_lock(&localuser_lock); \
116         u = localusers; \
117         while(u) { \
118                 ast_softhangup(u->chan); \
119                 ul = u; \
120                 u = u->next; \
121                 free(ul); \
122         } \
123         pthread_mutex_unlock(&localuser_lock); \
124         localusecnt=0; \
125 }
126
127 #define STANDARD_USECOUNT(res) { \
128         pthread_mutex_lock(&localuser_lock); \
129         res = localusecnt; \
130         pthread_mutex_unlock(&localuser_lock); \
131 }
132         
133         
134
135 #if defined(__cplusplus) || defined(c_plusplus)
136 }
137 #endif
138 #endif