diff --git a/res/res_smdi.c b/res/res_smdi.c index c59bd4afa4dd702b8fc17ca7c5cf7b4926c6d85f..fcd715515581f7d95810a76b4f0eea1ea690f105 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;