don't hold loadable_modules.mutex while a module shutdown function is run, so that we do not prevent new channels from being created.

This commit is contained in:
Mathieu Rene 2011-01-24 17:54:43 -05:00
parent 4eb5bbf41c
commit 24bcd10582
1 changed files with 10 additions and 6 deletions

View File

@ -1047,20 +1047,24 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_unload_module(char *dir,
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Module is not unloadable.\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Module is not unloadable.\n");
*err = "Module is not unloadable"; *err = "Module is not unloadable";
status = SWITCH_STATUS_NOUNLOAD; status = SWITCH_STATUS_NOUNLOAD;
goto end; goto unlock;
} else { } else {
if ((status = do_shutdown(module, SWITCH_TRUE, SWITCH_TRUE, !force, err) != SWITCH_STATUS_SUCCESS)) { /* Prevent anything from using the module while it's shutting down */
goto end; switch_core_hash_delete(loadable_modules.module_hash, fname);
switch_mutex_unlock(loadable_modules.mutex);
if ((status = do_shutdown(module, SWITCH_TRUE, SWITCH_TRUE, !force, err)) != SWITCH_STATUS_SUCCESS) {
/* Something went wrong in the module's shutdown function, add it again */
switch_core_hash_insert_locked(loadable_modules.module_hash, fname, module, loadable_modules.mutex);
} }
goto end;
} }
switch_core_hash_delete(loadable_modules.module_hash, fname);
} else { } else {
*err = "No such module!"; *err = "No such module!";
status = SWITCH_STATUS_FALSE; status = SWITCH_STATUS_FALSE;
} }
end: unlock:
switch_mutex_unlock(loadable_modules.mutex); switch_mutex_unlock(loadable_modules.mutex);
end:
if (force) { if (force) {
switch_yield(1000000); switch_yield(1000000);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "PHEW!\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "PHEW!\n");