fix shutdown

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4930 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2007-04-13 23:19:51 +00:00
parent 110b476cc7
commit 98af688d7d
3 changed files with 24 additions and 9 deletions

View File

@ -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();

View File

@ -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];
};

View File

@ -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();