From 98af688d7dd945549f715d049f48092588e8a253 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 13 Apr 2007 23:19:51 +0000 Subject: [PATCH] fix shutdown git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4930 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/endpoints/mod_sofia/mod_sofia.c | 17 +++++++++++++---- src/mod/endpoints/mod_sofia/mod_sofia.h | 1 + src/mod/endpoints/mod_sofia/sofia.c | 15 ++++++++++----- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 40845af515..f96600fc08 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1002,8 +1002,13 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod switch_core_hash_init(&mod_sofia_globals.gateway_hash, module_pool); switch_mutex_init(&mod_sofia_globals.hash_mutex, SWITCH_MUTEX_NESTED, module_pool); - config_sofia(0); + if (config_sofia(0) != SWITCH_STATUS_SUCCESS) { + return SWITCH_STATUS_GENERR; + } + switch_mutex_lock(mod_sofia_globals.mutex); + mod_sofia_globals.running = 1; + switch_mutex_unlock(mod_sofia_globals.mutex); if (switch_event_bind((char *) modname, SWITCH_EVENT_PRESENCE_IN, SWITCH_EVENT_SUBCLASS_ANY, sofia_presence_event_handler, NULL) != SWITCH_STATUS_SUCCESS) { @@ -1045,17 +1050,21 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void) { - + int sanity = 0; + sofia_presence_cancel(); switch_mutex_lock(mod_sofia_globals.mutex); if (mod_sofia_globals.running == 1) { - mod_sofia_globals.running = -1; + mod_sofia_globals.running = 0; } switch_mutex_unlock(mod_sofia_globals.mutex); - while (mod_sofia_globals.running) { + while (mod_sofia_globals.threads) { switch_yield(1000); + if (++sanity >= 5000) { + break; + } } su_deinit(); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index a0eca49188..9bf621d232 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -146,6 +146,7 @@ struct mod_sofia_globals { switch_mutex_t *hash_mutex; uint32_t callid; int32_t running; + int32_t threads; switch_mutex_t *mutex; char guess_ip[80]; }; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index df3e0b6020..1734389c82 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -240,6 +240,10 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void uint32_t gateway_loops = 0; switch_event_t *s_event; + switch_mutex_lock(mod_sofia_globals.mutex); + mod_sofia_globals.threads++; + switch_mutex_unlock(mod_sofia_globals.mutex); + profile->s_root = su_root_create(NULL); profile->home = su_home_new(sizeof(*profile->home)); @@ -287,7 +291,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void if (!sofia_glue_init_sql(profile)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open SQL Database!\n"); - return NULL; + goto end; } @@ -350,8 +354,11 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void su_root_destroy(profile->s_root); pool = profile->pool; switch_core_destroy_memory_pool(&pool); + + end: + switch_mutex_lock(mod_sofia_globals.mutex); - mod_sofia_globals.running = 0; + mod_sofia_globals.threads--; switch_mutex_unlock(mod_sofia_globals.mutex); return NULL; @@ -402,9 +409,7 @@ switch_status_t config_sofia(int reload) switch_status_t status = SWITCH_STATUS_SUCCESS; sofia_profile_t *profile = NULL; char url[512] = ""; - switch_mutex_lock(mod_sofia_globals.mutex); - mod_sofia_globals.running = 1; - switch_mutex_unlock(mod_sofia_globals.mutex); + if (!reload) { su_init();