Author: cseket Date: Fri Dec 12 05:20:25 2008 New Revision: 10729 Log: memory leak version of MODAPP-177 Modified: freeswitch/branches/cseket/src/mod/applications/mod_voicemail/mod_voicemail.c Modified: freeswitch/branches/cseket/src/mod/applications/mod_voicemail/mod_voicemail.c ============================================================================== --- freeswitch/branches/cseket/src/mod/applications/mod_voicemail/mod_voicemail.c (original) +++ freeswitch/branches/cseket/src/mod/applications/mod_voicemail/mod_voicemail.c Fri Dec 12 05:20:25 2008 @@ -266,7 +266,7 @@ static switch_status_t load_config(void) { char *cf = "voicemail.conf"; - vm_profile_t *profile = NULL, *oldprofile = NULL; + vm_profile_t *profile = NULL; switch_xml_t cfg, xml, settings, param, x_profile, x_profiles, x_email; switch_hash_index_t *hi; void *val; @@ -376,6 +376,7 @@ char *record_title = "FreeSWITCH Voicemail"; char *record_comment = "FreeSWITCH Voicemail"; char *record_copyright = "http://www.freeswitch.org"; + int change_profile = 0; switch_bool_t auto_playback_recordings = SWITCH_TRUE; @@ -389,8 +390,12 @@ continue; } - oldprofile = switch_core_hash_find(globals.profile_hash, name); - profile = create_profile(name); + if (!(profile = switch_core_hash_find(globals.profile_hash, name))) { + profile = create_profile(name); + } else { + change_profile = 1; + switch_thread_rwlock_wrlock(profile->rwlock); + } if ((x_email = switch_xml_child(x_profile, "email"))) { if ((param = switch_xml_child(x_email, "body"))) { @@ -672,6 +677,15 @@ } } +#ifdef SWITCH_HAVE_ODBC + if (profile->odbc_dsn && profile->master_odbc) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Closing ODBC Database! %s\n", profile->name); + switch_odbc_handle_destroy(&profile->master_odbc); + profile->odbc_dsn = NULL; + profile->odbc_user = NULL; + profile->odbc_pass = NULL; + } +#endif if (!switch_strlen_zero(odbc_dsn) && !switch_strlen_zero(odbc_user) && !switch_strlen_zero(odbc_pass)) { profile->odbc_dsn = odbc_dsn; @@ -818,23 +832,13 @@ switch_copy_string(profile->file_ext, file_ext, sizeof(profile->file_ext)); switch_mutex_init(&profile->mutex, SWITCH_MUTEX_NESTED, profile->pool); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added Profile %s\n", profile->name); - if (oldprofile) { - - /* wait */ - /* deadlock on concurrent voicemail rescan */ - while (switch_thread_rwlock_trywrlock_timeout(oldprofile->rwlock, 10) != SWITCH_STATUS_SUCCESS); - + if (change_profile) { + switch_thread_rwlock_unlock(profile->rwlock); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added Profile %s\n", profile->name); switch_mutex_lock(globals.mutex); - /* change the profile*/ - switch_core_hash_delete(globals.profile_hash, oldprofile->name); switch_core_hash_insert(globals.profile_hash, profile->name, profile); switch_mutex_unlock(globals.mutex); - - destroy_profile(oldprofile); - - } else { - switch_core_hash_insert(globals.profile_hash, profile->name, profile); } }