diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-12-09 23:55:17 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-12-09 23:55:17 +0000 |
commit | dcfebf7bf6b94894f65fd5c6241cd639bdaaf110 (patch) | |
tree | e5e5eb37bd50d00a0215049ce584d248a60da5df | |
parent | 5d20155225cb149d6326defea641e47809d67fe6 (diff) |
Cleanup unload calls
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@1850 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-x | channels/chan_iax.c | 51 | ||||
-rwxr-xr-x | channels/chan_iax2.c | 51 | ||||
-rwxr-xr-x | channels/chan_modem.c | 117 | ||||
-rwxr-xr-x | channels/chan_nbs.c | 23 | ||||
-rwxr-xr-x | channels/chan_phone.c | 117 | ||||
-rwxr-xr-x | channels/chan_vofr.c | 115 | ||||
-rwxr-xr-x | channels/chan_vpb.c | 110 | ||||
-rwxr-xr-x | channels/chan_zap.c | 16 |
8 files changed, 315 insertions, 285 deletions
diff --git a/channels/chan_iax.c b/channels/chan_iax.c index 39515dbb8..091c8a1fc 100755 --- a/channels/chan_iax.c +++ b/channels/chan_iax.c @@ -5330,6 +5330,33 @@ static struct ast_switch iax_switch = matchmore: iax_matchmore, }; +static int __unload_module(void) +{ + int x; + /* Cancel the network thread, close the net socket */ + pthread_cancel(netthreadid); + pthread_join(netthreadid, NULL); + close(netsocket); + for (x=0;x<AST_IAX_MAX_CALLS;x++) + if (iaxs[x]) + iax_destroy(x); + ast_manager_unregister( "IAXpeers" ); + ast_cli_unregister(&cli_show_users); + ast_cli_unregister(&cli_show_channels); + ast_cli_unregister(&cli_show_peers); + ast_cli_unregister(&cli_set_jitter); + ast_cli_unregister(&cli_show_stats); + ast_cli_unregister(&cli_show_cache); + ast_unregister_switch(&iax_switch); + delete_users(); + return 0; +} + +int unload_module() +{ + return __unload_module(); +} + int load_module(void) { char *config = "iax.conf"; @@ -5379,7 +5406,7 @@ int load_module(void) if (ast_channel_register(type, tdesc, iax_capability, iax_request)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); - unload_module(); + __unload_module(); return -1; } @@ -5426,28 +5453,6 @@ char *description() return desc; } -int unload_module() -{ - int x; - /* Cancel the network thread, close the net socket */ - pthread_cancel(netthreadid); - pthread_join(netthreadid, NULL); - close(netsocket); - for (x=0;x<AST_IAX_MAX_CALLS;x++) - if (iaxs[x]) - iax_destroy(x); - ast_manager_unregister( "IAXpeers" ); - ast_cli_unregister(&cli_show_users); - ast_cli_unregister(&cli_show_channels); - ast_cli_unregister(&cli_show_peers); - ast_cli_unregister(&cli_set_jitter); - ast_cli_unregister(&cli_show_stats); - ast_cli_unregister(&cli_show_cache); - ast_unregister_switch(&iax_switch); - delete_users(); - return 0; -} - int usecount() { int res; diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index e77871651..9273d5233 100755 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -5986,6 +5986,33 @@ static struct ast_switch iax2_switch = matchmore: iax2_matchmore, }; +static int __unload_module(void) +{ + int x; + /* Cancel the network thread, close the net socket */ + pthread_cancel(netthreadid); + pthread_join(netthreadid, NULL); + close(netsocket); + for (x=0;x<IAX_MAX_CALLS;x++) + if (iaxs[x]) + iax2_destroy(x); + ast_manager_unregister( "IAXpeers" ); + ast_cli_unregister(&cli_show_users); + ast_cli_unregister(&cli_show_channels); + ast_cli_unregister(&cli_show_peers); + ast_cli_unregister(&cli_set_jitter); + ast_cli_unregister(&cli_show_stats); + ast_cli_unregister(&cli_show_cache); + ast_unregister_switch(&iax2_switch); + delete_users(); + return 0; +} + +int unload_module() +{ + return __unload_module(); +} + int load_module(void) { char *config = "iax.conf"; @@ -6048,7 +6075,7 @@ int load_module(void) if (ast_channel_register(type, tdesc, iax2_capability, iax2_request)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); - unload_module(); + __unload_module(); return -1; } @@ -6095,28 +6122,6 @@ char *description() return desc; } -int unload_module() -{ - int x; - /* Cancel the network thread, close the net socket */ - pthread_cancel(netthreadid); - pthread_join(netthreadid, NULL); - close(netsocket); - for (x=0;x<IAX_MAX_CALLS;x++) - if (iaxs[x]) - iax2_destroy(x); - ast_manager_unregister( "IAXpeers" ); - ast_cli_unregister(&cli_show_users); - ast_cli_unregister(&cli_show_channels); - ast_cli_unregister(&cli_show_peers); - ast_cli_unregister(&cli_set_jitter); - ast_cli_unregister(&cli_show_stats); - ast_cli_unregister(&cli_show_cache); - ast_unregister_switch(&iax2_switch); - delete_users(); - return 0; -} - int usecount() { int res; diff --git a/channels/chan_modem.c b/channels/chan_modem.c index 1da77d321..48571af3e 100755 --- a/channels/chan_modem.c +++ b/channels/chan_modem.c @@ -840,6 +840,64 @@ static unsigned int get_group(char *s) return group; } +static int __unload_module(void) +{ + struct ast_modem_pvt *p, *pl; + /* First, take us out of the channel loop */ + ast_channel_unregister(type); + if (!ast_mutex_lock(&iflock)) { + /* Hangup all interfaces if they have an owner */ + p = iflist; + while(p) { + if (p->owner) + ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD); + p = p->next; + } + iflist = NULL; + ast_mutex_unlock(&iflock); + } else { + ast_log(LOG_WARNING, "Unable to lock the monitor\n"); + return -1; + } + if (!ast_mutex_lock(&monlock)) { + if (monitor_thread != (pthread_t) -1 && monitor_thread != (pthread_t) -2) { + pthread_cancel(monitor_thread); + pthread_join(monitor_thread, NULL); + } + monitor_thread = (pthread_t) -2; + ast_mutex_unlock(&monlock); + } else { + ast_log(LOG_WARNING, "Unable to lock the monitor\n"); + return -1; + } + + if (!ast_mutex_lock(&iflock)) { + /* Destroy all the interfaces and free their memory */ + p = iflist; + while(p) { + /* Close the socket, assuming it's real */ + if (p->fd > -1) + close(p->fd); + pl = p; + p = p->next; + /* Free associated memory */ + free(pl); + } + iflist = NULL; + ast_mutex_unlock(&iflock); + } else { + ast_log(LOG_WARNING, "Unable to lock the monitor\n"); + return -1; + } + + return 0; +} + +int unload_module() +{ + return __unload_module(); +} + int load_module() { struct ast_config *cfg; @@ -871,7 +929,7 @@ int load_module() ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value); ast_destroy(cfg); ast_mutex_unlock(&iflock); - unload_module(); + __unload_module(); return -1; } } else if (!strcasecmp(v->name, "driver")) { @@ -883,7 +941,7 @@ int load_module() ast_log(LOG_ERROR, "Failed to load driver %s\n", driver); ast_destroy(cfg); ast_mutex_unlock(&iflock); - unload_module(); + __unload_module(); return -1; } } else if (!strcasecmp(v->name, "mode")) { @@ -921,7 +979,7 @@ int load_module() AST_FORMAT_SLINEAR, modem_request)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); ast_destroy(cfg); - unload_module(); + __unload_module(); return -1; } ast_destroy(cfg); @@ -930,59 +988,6 @@ int load_module() return 0; } -int unload_module() -{ - struct ast_modem_pvt *p, *pl; - /* First, take us out of the channel loop */ - ast_channel_unregister(type); - if (!ast_mutex_lock(&iflock)) { - /* Hangup all interfaces if they have an owner */ - p = iflist; - while(p) { - if (p->owner) - ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD); - p = p->next; - } - iflist = NULL; - ast_mutex_unlock(&iflock); - } else { - ast_log(LOG_WARNING, "Unable to lock the monitor\n"); - return -1; - } - if (!ast_mutex_lock(&monlock)) { - if (monitor_thread != (pthread_t) -1 && monitor_thread != (pthread_t) -2) { - pthread_cancel(monitor_thread); - pthread_join(monitor_thread, NULL); - } - monitor_thread = (pthread_t) -2; - ast_mutex_unlock(&monlock); - } else { - ast_log(LOG_WARNING, "Unable to lock the monitor\n"); - return -1; - } - - if (!ast_mutex_lock(&iflock)) { - /* Destroy all the interfaces and free their memory */ - p = iflist; - while(p) { - /* Close the socket, assuming it's real */ - if (p->fd > -1) - close(p->fd); - pl = p; - p = p->next; - /* Free associated memory */ - free(pl); - } - iflist = NULL; - ast_mutex_unlock(&iflock); - } else { - ast_log(LOG_WARNING, "Unable to lock the monitor\n"); - return -1; - } - - return 0; -} - int usecount(void) { int res; diff --git a/channels/chan_nbs.c b/channels/chan_nbs.c index 0cf50f56c..cd40ce167 100755 --- a/channels/chan_nbs.c +++ b/channels/chan_nbs.c @@ -252,27 +252,30 @@ static struct ast_channel *nbs_request(char *type, int format, void *data) return tmp; } +static int __unload_module(void) +{ + /* First, take us out of the channel loop */ + ast_channel_unregister(type); + return 0; +} + +int unload_module(void) +{ + return __unload_module(); +} + int load_module() { /* Make sure we can register our Adtranphone channel type */ if (ast_channel_register(type, tdesc, AST_FORMAT_SLINEAR, nbs_request)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); - unload_module(); + __unload_module(); return -1; } return 0; } - - -int unload_module() -{ - /* First, take us out of the channel loop */ - ast_channel_unregister(type); - return 0; -} - int usecount() { int res; diff --git a/channels/chan_phone.c b/channels/chan_phone.c index 64b241365..775734842 100755 --- a/channels/chan_phone.c +++ b/channels/chan_phone.c @@ -1051,6 +1051,64 @@ static int parse_gain_value(char *gain_type, char *value) return (int)gain; } +static int __unload_module(void) +{ + struct phone_pvt *p, *pl; + /* First, take us out of the channel loop */ + ast_channel_unregister(type); + if (!ast_mutex_lock(&iflock)) { + /* Hangup all interfaces if they have an owner */ + p = iflist; + while(p) { + if (p->owner) + ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD); + p = p->next; + } + iflist = NULL; + ast_mutex_unlock(&iflock); + } else { + ast_log(LOG_WARNING, "Unable to lock the monitor\n"); + return -1; + } + if (!ast_mutex_lock(&monlock)) { + if (monitor_thread > -1) { + pthread_cancel(monitor_thread); + pthread_join(monitor_thread, NULL); + } + monitor_thread = -2; + ast_mutex_unlock(&monlock); + } else { + ast_log(LOG_WARNING, "Unable to lock the monitor\n"); + return -1; + } + + if (!ast_mutex_lock(&iflock)) { + /* Destroy all the interfaces and free their memory */ + p = iflist; + while(p) { + /* Close the socket, assuming it's real */ + if (p->fd > -1) + close(p->fd); + pl = p; + p = p->next; + /* Free associated memory */ + free(pl); + } + iflist = NULL; + ast_mutex_unlock(&iflock); + } else { + ast_log(LOG_WARNING, "Unable to lock the monitor\n"); + return -1; + } + + return 0; +} + +int unload_module(void) +{ + return __unload_module(); +} + int load_module() { struct ast_config *cfg; @@ -1083,7 +1141,7 @@ int load_module() ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value); ast_destroy(cfg); ast_mutex_unlock(&iflock); - unload_module(); + __unload_module(); return -1; } } else if (!strcasecmp(v->name, "silencesupression")) { @@ -1136,7 +1194,7 @@ int load_module() AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW, phone_request)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); ast_destroy(cfg); - unload_module(); + __unload_module(); return -1; } ast_destroy(cfg); @@ -1145,61 +1203,6 @@ int load_module() return 0; } - - -int unload_module() -{ - struct phone_pvt *p, *pl; - /* First, take us out of the channel loop */ - ast_channel_unregister(type); - if (!ast_mutex_lock(&iflock)) { - /* Hangup all interfaces if they have an owner */ - p = iflist; - while(p) { - if (p->owner) - ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD); - p = p->next; - } - iflist = NULL; - ast_mutex_unlock(&iflock); - } else { - ast_log(LOG_WARNING, "Unable to lock the monitor\n"); - return -1; - } - if (!ast_mutex_lock(&monlock)) { - if (monitor_thread > -1) { - pthread_cancel(monitor_thread); - pthread_join(monitor_thread, NULL); - } - monitor_thread = -2; - ast_mutex_unlock(&monlock); - } else { - ast_log(LOG_WARNING, "Unable to lock the monitor\n"); - return -1; - } - - if (!ast_mutex_lock(&iflock)) { - /* Destroy all the interfaces and free their memory */ - p = iflist; - while(p) { - /* Close the socket, assuming it's real */ - if (p->fd > -1) - close(p->fd); - pl = p; - p = p->next; - /* Free associated memory */ - free(pl); - } - iflist = NULL; - ast_mutex_unlock(&iflock); - } else { - ast_log(LOG_WARNING, "Unable to lock the monitor\n"); - return -1; - } - - return 0; -} - int usecount() { int res; diff --git a/channels/chan_vofr.c b/channels/chan_vofr.c index 37d8a1f52..289e101a9 100755 --- a/channels/chan_vofr.c +++ b/channels/chan_vofr.c @@ -1136,61 +1136,7 @@ static struct ast_channel *vofr_request(char *type, int format, void *data) return tmp; } -int load_module() -{ - struct ast_config *cfg; - struct ast_variable *v; - struct vofr_pvt *tmp; - cfg = ast_load(config); - - /* We *must* have a config file otherwise stop immediately */ - if (!cfg) { - ast_log(LOG_ERROR, "Unable to load config %s\n", config); - return -1; - } - if (ast_mutex_lock(&iflock)) { - /* It's a little silly to lock it, but we mind as well just to be sure */ - ast_log(LOG_ERROR, "Unable to lock interface list???\n"); - return -1; - } - v = ast_variable_browse(cfg, "interfaces"); - while(v) { - /* Create the interface list */ - if (!strcasecmp(v->name, "user") || - !strcasecmp(v->name, "network")) { - tmp = mkif(v->name, v->value); - if (tmp) { - tmp->next = iflist; - iflist = tmp; - } else { - ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value); - ast_destroy(cfg); - ast_mutex_unlock(&iflock); - unload_module(); - return -1; - } - } else if (!strcasecmp(v->name, "context")) { - strncpy(context, v->value, sizeof(context)-1); - } else if (!strcasecmp(v->name, "language")) { - strncpy(language, v->value, sizeof(language)-1); - } - v = v->next; - } - ast_mutex_unlock(&iflock); - /* Make sure we can register our AdtranVoFR channel type */ - if (ast_channel_register(type, tdesc, AST_FORMAT_G723_1, vofr_request)) { - ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); - ast_destroy(cfg); - unload_module(); - return -1; - } - ast_destroy(cfg); - /* And start the monitor for the first time */ - restart_monitor(); - return 0; -} - -int unload_module() +static int __unload_module(void) { struct vofr_pvt *p, *pl; /* First, take us out of the channel loop */ @@ -1244,6 +1190,65 @@ int unload_module() return 0; } +int unload_module() +{ + return __unload_module(); +} + +int load_module() +{ + struct ast_config *cfg; + struct ast_variable *v; + struct vofr_pvt *tmp; + cfg = ast_load(config); + + /* We *must* have a config file otherwise stop immediately */ + if (!cfg) { + ast_log(LOG_ERROR, "Unable to load config %s\n", config); + return -1; + } + if (ast_mutex_lock(&iflock)) { + /* It's a little silly to lock it, but we mind as well just to be sure */ + ast_log(LOG_ERROR, "Unable to lock interface list???\n"); + return -1; + } + v = ast_variable_browse(cfg, "interfaces"); + while(v) { + /* Create the interface list */ + if (!strcasecmp(v->name, "user") || + !strcasecmp(v->name, "network")) { + tmp = mkif(v->name, v->value); + if (tmp) { + tmp->next = iflist; + iflist = tmp; + } else { + ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value); + ast_destroy(cfg); + ast_mutex_unlock(&iflock); + __unload_module(); + return -1; + } + } else if (!strcasecmp(v->name, "context")) { + strncpy(context, v->value, sizeof(context)-1); + } else if (!strcasecmp(v->name, "language")) { + strncpy(language, v->value, sizeof(language)-1); + } + v = v->next; + } + ast_mutex_unlock(&iflock); + /* Make sure we can register our AdtranVoFR channel type */ + if (ast_channel_register(type, tdesc, AST_FORMAT_G723_1, vofr_request)) { + ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); + ast_destroy(cfg); + __unload_module(); + return -1; + } + ast_destroy(cfg); + /* And start the monitor for the first time */ + restart_monitor(); + return 0; +} + int usecount() { int res; diff --git a/channels/chan_vpb.c b/channels/chan_vpb.c index d4aee06f5..b2a54d37c 100755 --- a/channels/chan_vpb.c +++ b/channels/chan_vpb.c @@ -1112,6 +1112,62 @@ static float parse_gain_value(char *gain_type, char *value) return gain; } +static int __unload_module(void) +{ + struct vpb_pvt *p; + /* First, take us out of the channel loop */ + ast_channel_unregister(type); + + ast_mutex_lock(&iflock); { + /* Hangup all interfaces if they have an owner */ + p = iflist; + while(p) { + if (p->owner) + ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD); + p = p->next; + } + iflist = NULL; + } ast_mutex_unlock(&iflock); + + ast_mutex_lock(&monlock); { + if (mthreadactive > -1) { + pthread_cancel(monitor_thread); + pthread_join(monitor_thread, NULL); + } + mthreadactive = -2; + } ast_mutex_unlock(&monlock); + + ast_mutex_lock(&iflock); { + /* Destroy all the interfaces and free their memory */ + + while(iflist) { + p = iflist; + ast_mutex_destroy(&p->lock); + pthread_cancel(p->readthread); + p->readthread = 0; + + iflist = iflist->next; + + free(p); + } + iflist = NULL; + } ast_mutex_unlock(&iflock); + + ast_mutex_lock(&bridge_lock); { + memset(bridges, 0, sizeof bridges); + } ast_mutex_unlock(&bridge_lock); + ast_mutex_destroy(&bridge_lock); + + tcounter = 0; + + return 0; +} + +int unload_module(void) +{ + return __unload_module(); +} + int load_module() { struct ast_config *cfg; @@ -1213,65 +1269,13 @@ int load_module() if (error) - unload_module(); + __unload_module(); else restart_monitor(); /* And start the monitor for the first time */ return error; } - -int unload_module() -{ - struct vpb_pvt *p; - /* First, take us out of the channel loop */ - ast_channel_unregister(type); - - ast_mutex_lock(&iflock); { - /* Hangup all interfaces if they have an owner */ - p = iflist; - while(p) { - if (p->owner) - ast_softhangup(p->owner, AST_SOFTHANGUP_APPUNLOAD); - p = p->next; - } - iflist = NULL; - } ast_mutex_unlock(&iflock); - - ast_mutex_lock(&monlock); { - if (mthreadactive > -1) { - pthread_cancel(monitor_thread); - pthread_join(monitor_thread, NULL); - } - mthreadactive = -2; - } ast_mutex_unlock(&monlock); - - ast_mutex_lock(&iflock); { - /* Destroy all the interfaces and free their memory */ - - while(iflist) { - p = iflist; - ast_mutex_destroy(&p->lock); - pthread_cancel(p->readthread); - p->readthread = 0; - - iflist = iflist->next; - - free(p); - } - iflist = NULL; - } ast_mutex_unlock(&iflock); - - ast_mutex_lock(&bridge_lock); { - memset(bridges, 0, sizeof bridges); - } ast_mutex_unlock(&bridge_lock); - ast_mutex_destroy(&bridge_lock); - - tcounter = 0; - - return 0; -} - int usecount() { int res; diff --git a/channels/chan_zap.c b/channels/chan_zap.c index e366dc5d8..ffeedc19f 100755 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -6914,7 +6914,7 @@ static int action_zapdialoffhook(struct mansession *s, struct message *m) return 0; } -static int zt_unload(void) +static int __unload_module(void) { struct zt_pvt *p, *pl; /* First, take us out of the channel loop */ @@ -6977,7 +6977,7 @@ static int zt_unload(void) int unload_module() { - return zt_unload(); + return __unload_module(); } static int setup_zap(void) @@ -7016,7 +7016,7 @@ static int setup_zap(void) ast_log(LOG_ERROR, "Signalling must be specified before any channels are.\n"); ast_destroy(cfg); ast_mutex_unlock(&iflock); - zt_unload(); + __unload_module(); return -1; } c = v->value; @@ -7033,7 +7033,7 @@ static int setup_zap(void) ast_log(LOG_ERROR, "Syntax error parsing '%s' at '%s'\n", v->value, chan); ast_destroy(cfg); ast_mutex_unlock(&iflock); - zt_unload(); + __unload_module(); return -1; } if (finish < start) { @@ -7051,7 +7051,7 @@ static int setup_zap(void) ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value); ast_destroy(cfg); ast_mutex_unlock(&iflock); - zt_unload(); + __unload_module(); return -1; } } @@ -7293,7 +7293,7 @@ static int setup_zap(void) ast_log(LOG_ERROR, "Unknown switchtype '%s'\n", v->value); ast_destroy(cfg); ast_mutex_unlock(&iflock); - zt_unload(); + __unload_module(); return -1; } } else if (!strcasecmp(v->name, "minunused")) { @@ -7354,12 +7354,12 @@ int load_module(void) /* Make sure we can register our Zap channel type */ if (ast_channel_register(type, tdesc, AST_FORMAT_SLINEAR | AST_FORMAT_ULAW, zt_request)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", type); - zt_unload(); + __unload_module(); return -1; } if (ast_channel_register(typecompat, tdesc, AST_FORMAT_SLINEAR | AST_FORMAT_ULAW, zt_request)) { ast_log(LOG_ERROR, "Unable to register channel class %s\n", typecompat); - zt_unload(); + __unload_module(); return -1; } #ifdef ZAPATA_PRI |