add switch_hashtable_insert_destructor so you can insert a pointer into a hash with a custom destructor and use it in spandsp to fix a leak on reloadxml with the tone_descriptor tables and fix a bunch of random tiny leaks etc

This commit is contained in:
Anthony Minessale
2014-04-09 23:26:41 +05:00
parent d789c6470a
commit 4178688b4a
12 changed files with 56 additions and 37 deletions
+11 -11
View File
@@ -2071,49 +2071,49 @@ static switch_status_t do_config(void)
profile->auth_scheme = auth_scheme;
profile->timeout = timeout;
profile->url = strdup(url);
profile->url = switch_core_strdup(globals.pool, url);
switch_assert(profile->url);
if (bind_local != NULL) {
profile->bind_local = strdup(bind_local);
profile->bind_local = switch_core_strdup(globals.pool, bind_local);
}
if (method != NULL) {
profile->method = strdup(method);
profile->method = switch_core_strdup(globals.pool, method);
} else {
profile->method = NULL;
}
if (bind_cred) {
profile->cred = strdup(bind_cred);
profile->cred = switch_core_strdup(globals.pool, bind_cred);
}
profile->disable100continue = disable100continue;
profile->enable_cacert_check = enable_cacert_check;
if (ssl_cert_file) {
profile->ssl_cert_file = strdup(ssl_cert_file);
profile->ssl_cert_file = switch_core_strdup(globals.pool, ssl_cert_file);
}
if (ssl_key_file) {
profile->ssl_key_file = strdup(ssl_key_file);
profile->ssl_key_file = switch_core_strdup(globals.pool, ssl_key_file);
}
if (ssl_key_password) {
profile->ssl_key_password = strdup(ssl_key_password);
profile->ssl_key_password = switch_core_strdup(globals.pool, ssl_key_password);
}
if (ssl_version) {
profile->ssl_version = strdup(ssl_version);
profile->ssl_version = switch_core_strdup(globals.pool, ssl_version);
}
if (ssl_cacert_file) {
profile->ssl_cacert_file = strdup(ssl_cacert_file);
profile->ssl_cacert_file = switch_core_strdup(globals.pool, ssl_cacert_file);
}
profile->enable_ssl_verifyhost = enable_ssl_verifyhost;
if (cookie_file) {
profile->cookie_file = strdup(cookie_file);
profile->cookie_file = switch_core_strdup(globals.pool, cookie_file);
}
profile->vars_map = vars_map;
@@ -2138,7 +2138,7 @@ static switch_status_t do_config(void)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Profile [%s] JSON Function [%s]\n",
zstr(bname) ? "N/A" : bname, profile->url);
profile->name = strdup(bname);
profile->name = switch_core_strdup(globals.pool, bname);
switch_core_hash_insert(globals.profile_hash, bname, profile);
+10 -1
View File
@@ -476,6 +476,12 @@ void mod_spandsp_indicate_data(switch_core_session_t *session, switch_bool_t sel
/* **************************************************************************
CONFIGURATION
************************************************************************* */
static void destroy_descriptor(void *ptr)
{
tone_descriptor_t *d = (tone_descriptor_t *) ptr;
super_tone_rx_free_descriptor(d->spandsp_tone_descriptor);
}
switch_status_t load_configuration(switch_bool_t reload)
{
@@ -657,7 +663,8 @@ switch_status_t load_configuration(switch_bool_t reload)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Unable to allocate tone_descriptor: %s\n", name);
switch_goto_status(SWITCH_STATUS_FALSE, done);
}
switch_core_hash_insert(spandsp_globals.tones, name, descriptor);
switch_core_hash_insert_destructor(spandsp_globals.tones, name, descriptor, destroy_descriptor);
/* add tones to descriptor */
for (tone = switch_xml_child(xdescriptor, "tone"); tone; tone = switch_xml_next(tone)) {
@@ -830,6 +837,8 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_spandsp_shutdown)
switch_core_destroy_memory_pool(&spandsp_globals.config_pool);
}
memset(&spandsp_globals, 0, sizeof(spandsp_globals));
return SWITCH_STATUS_UNLOAD;
}
@@ -1645,7 +1645,6 @@ void mod_spandsp_fax_shutdown(void)
t38_state_list.thread_running = 0;
wake_thread(1);
switch_thread_join(&tstatus, t38_state_list.thread);
memset(&spandsp_globals, 0, sizeof(spandsp_globals));
}
static const switch_state_handler_table_t t38_gateway_state_handlers;
+1
View File
@@ -872,6 +872,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_v8_shutdown)
switch_mutex_destroy(globals.event_mutex);
switch_core_hash_destroy(&module_manager.load_hash);
switch_core_destroy_memory_pool(&module_manager.pool);
return SWITCH_STATUS_SUCCESS;
}
+12 -18
View File
@@ -313,6 +313,17 @@ static switch_status_t mod_logfile_logger(const switch_log_node_t *node, switch_
return process_node(node, level);
}
static void cleanup_profile(void *ptr)
{
logfile_profile_t *profile = (logfile_profile_t *) ptr;
switch_core_hash_destroy(&profile->log_hash);
switch_file_close(profile->log_afd);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Closing %s\n", profile->logfile);
switch_safe_free(profile->logfile);
}
static switch_status_t load_profile(switch_xml_t xml)
{
switch_xml_t param, settings;
@@ -365,7 +376,7 @@ static switch_status_t load_profile(switch_xml_t xml)
return SWITCH_STATUS_GENERR;
}
switch_core_hash_insert(profile_hash, new_profile->name, (void *) new_profile);
switch_core_hash_insert_destructor(profile_hash, new_profile->name, (void *) new_profile, cleanup_profile);
return SWITCH_STATUS_SUCCESS;
}
@@ -454,26 +465,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_logfile_load)
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_logfile_shutdown)
{
switch_hash_index_t *hi;
const void *var;
void *val;
switch_log_unbind_logger(mod_logfile_logger);
switch_event_unbind(&globals.node);
for (hi = switch_core_hash_first(profile_hash); hi; hi = switch_core_hash_next(&hi)) {
logfile_profile_t *profile;
switch_core_hash_this(hi, &var, NULL, &val);
if ((profile = (logfile_profile_t *) val)) {
switch_file_close(profile->log_afd);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Closing %s\n", profile->logfile);
switch_safe_free(profile->logfile);
}
}
switch_core_hash_destroy(&profile_hash);
return SWITCH_STATUS_SUCCESS;
}