From 464e44e325f1d14cdac0cd5440018455103aec0a Mon Sep 17 00:00:00 2001 From: Tilghman Lesher <tilghman@meg.abyt.es> Date: Tue, 1 Jun 2010 18:02:24 +0000 Subject: [PATCH] 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: https://origsvn.digium.com/svn/asterisk/trunk@266735 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_smdi.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/res/res_smdi.c b/res/res_smdi.c index c59bd4afa4..fcd7155155 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; -- GitLab