diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-06-01 18:02:24 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-06-01 18:02:24 +0000 |
commit | a6ec9128f6455778fd8e83d3561db38c75639efb (patch) | |
tree | 2b8a71de5b776f7899cf377cbdda3a4e016473ac /res/res_smdi.c | |
parent | 4cbe8fda7eb8af542a10aee760513251d9ebf42e (diff) |
Don't register functions until the last possible point, so they're not unloaded unnecessarily.
(closes issue #15996)
Reported by: junky
Patches:
sdmi_wait.diff uploaded by junky (license 177)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@266735 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res/res_smdi.c')
-rw-r--r-- | res/res_smdi.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/res/res_smdi.c b/res/res_smdi.c index c59bd4afa..fcd715515 100644 --- a/res/res_smdi.c +++ b/res/res_smdi.c @@ -1389,37 +1389,37 @@ static struct ast_custom_function smdi_msg_function = { .read = smdi_msg_read, }; -static int unload_module(void); +static int _unload_module(int fromload); static int load_module(void) { int res; - + /* initialize our containers */ memset(&smdi_ifaces, 0, sizeof(smdi_ifaces)); ASTOBJ_CONTAINER_INIT(&smdi_ifaces); - + ast_mutex_init(&mwi_monitor.lock); ast_cond_init(&mwi_monitor.cond, NULL); - ast_custom_function_register(&smdi_msg_retrieve_function); - ast_custom_function_register(&smdi_msg_function); - /* load the config and start the listener threads*/ res = smdi_load(0); if (res < 0) { - unload_module(); + _unload_module(1); return res; } else if (res == 1) { - unload_module(); + _unload_module(1); ast_log(LOG_NOTICE, "No SMDI interfaces are available to listen on, not starting SMDI listener.\n"); return AST_MODULE_LOAD_DECLINE; } - + + ast_custom_function_register(&smdi_msg_retrieve_function); + ast_custom_function_register(&smdi_msg_function); + return AST_MODULE_LOAD_SUCCESS; } -static int unload_module(void) +static int _unload_module(int fromload) { /* this destructor stops any running smdi_read threads */ ASTOBJ_CONTAINER_DESTROYALL(&smdi_ifaces, ast_smdi_interface_destroy); @@ -1436,12 +1436,19 @@ static int unload_module(void) pthread_join(mwi_monitor.thread, NULL); } - ast_custom_function_unregister(&smdi_msg_retrieve_function); - ast_custom_function_unregister(&smdi_msg_function); + if (!fromload) { + ast_custom_function_unregister(&smdi_msg_retrieve_function); + ast_custom_function_unregister(&smdi_msg_function); + } return 0; } +static int unload_module(void) +{ + return _unload_module(0); +} + static int reload(void) { int res; |