diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 3b13db4eb2..90dcc1c7a7 100644 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -5530,7 +5530,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_freetdm_shutdown) void *val; /* destroy ss7 configs */ - for (hi = switch_core_hash_first( globals.ss7_configs); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.ss7_configs); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); ftdm_conf_node_destroy(val); } diff --git a/src/include/switch_core.h b/src/include/switch_core.h index a9752cac4a..d636542bbd 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -1459,7 +1459,15 @@ SWITCH_DECLARE(void *) switch_core_hash_find_rdlock(_In_ switch_hash_t *hash, _I \param hash the hashtable to use \return The element, or NULL if it wasn't found */ -SWITCH_DECLARE(switch_hash_index_t *) switch_core_hash_first(_In_ switch_hash_t *hash); +SWITCH_DECLARE(switch_hash_index_t *) switch_core_hash_first_iter(_In_ switch_hash_t *hash, switch_hash_index_t *hi); +#define switch_core_hash_first(_h) switch_core_hash_first_iter(_h, NULL) + +/*! + \brief tells if a hash is empty + \param hash the hashtable + \return TRUE or FALSE depending on if the hash is empty +*/ +SWITCH_DECLARE(switch_bool_t) switch_core_hash_empty(switch_hash_t *hash); /*! \brief Gets the next element of a hashtable diff --git a/src/include/switch_hashtable.h b/src/include/switch_hashtable.h index 40cd74abd3..4a588586a0 100644 --- a/src/include/switch_hashtable.h +++ b/src/include/switch_hashtable.h @@ -190,7 +190,8 @@ switch_hashtable_count(switch_hashtable_t *h); SWITCH_DECLARE(void) switch_hashtable_destroy(switch_hashtable_t **h); -SWITCH_DECLARE(switch_hashtable_iterator_t*) switch_hashtable_first(switch_hashtable_t *h); +SWITCH_DECLARE(switch_hashtable_iterator_t*) switch_hashtable_first_iter(switch_hashtable_t *h, switch_hashtable_iterator_t *it); +#define switch_hashtable_first(_h) switch_hashtable_first_iter(_h, NULL) SWITCH_DECLARE(switch_hashtable_iterator_t*) switch_hashtable_next(switch_hashtable_iterator_t **iP); SWITCH_DECLARE(void) switch_hashtable_this(switch_hashtable_iterator_t *i, const void **key, switch_ssize_t *klen, void **val); diff --git a/src/mod/applications/mod_blacklist/mod_blacklist.c b/src/mod/applications/mod_blacklist/mod_blacklist.c index 0abde7ecec..1aa3c82a5c 100644 --- a/src/mod/applications/mod_blacklist/mod_blacklist.c +++ b/src/mod/applications/mod_blacklist/mod_blacklist.c @@ -116,7 +116,7 @@ static switch_status_t do_config(switch_bool_t reload) { /* Load up blacklists */ switch_xml_t xml, cfg, lists, list; - switch_hash_index_t *hi; + switch_hash_index_t *hi = NULL; if (!(xml = switch_xml_open_cfg("mod_blacklist.conf", &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't load configuration section\n"); @@ -126,7 +126,7 @@ static switch_status_t do_config(switch_bool_t reload) switch_mutex_lock(globals.lists_mutex); /* Destroy any active lists */ - while ((hi = switch_core_hash_first( globals.lists))) { + while ((hi = switch_core_hash_first_iter( globals.lists, hi))) { const void *key; void *val; switch_core_hash_this(hi, &key, NULL, &val); @@ -282,7 +282,7 @@ SWITCH_STANDARD_API(blacklist_api_function) switch_mutex_lock(globals.lists_mutex); if (switch_file_open(&fd, filename, SWITCH_FOPEN_WRITE | SWITCH_FOPEN_TRUNCATE | SWITCH_FOPEN_CREATE, SWITCH_FPROT_OS_DEFAULT, globals.pool) == SWITCH_STATUS_SUCCESS) { - for (hi = switch_core_hash_first( bl->list); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(bl->list); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); switch_file_printf(fd, "%s\n", (char *)var); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "adding %s to the dump file\n", (char *)var); diff --git a/src/mod/applications/mod_callcenter/mod_callcenter.c b/src/mod/applications/mod_callcenter/mod_callcenter.c index e27746a5e2..99dab869bd 100644 --- a/src/mod/applications/mod_callcenter/mod_callcenter.c +++ b/src/mod/applications/mod_callcenter/mod_callcenter.c @@ -3198,7 +3198,7 @@ SWITCH_STANDARD_API(cc_config_api_function) switch_hash_index_t *hi; stream->write_function(stream, "%s", "name|strategy|moh_sound|time_base_score|tier_rules_apply|tier_rule_wait_second|tier_rule_wait_multiply_level|tier_rule_no_agent_no_wait|discard_abandoned_after|abandoned_resume_allowed|max_wait_time|max_wait_time_with_no_agent|max_wait_time_with_no_agent_time_reached|record_template\n"); switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.queue_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.queue_hash); hi; hi = switch_core_hash_next(&hi)) { void *val = NULL; const void *key; switch_ssize_t keylen; @@ -3251,7 +3251,7 @@ SWITCH_STANDARD_API(cc_config_api_function) switch_hash_index_t *hi; int queue_count = 0; switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.queue_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.queue_hash); hi; hi = switch_core_hash_next(&hi)) { queue_count++; } switch_mutex_unlock(globals.mutex); @@ -3373,7 +3373,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_callcenter_load) Macro expands to: switch_status_t mod_callcenter_shutdown() */ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_callcenter_shutdown) { - switch_hash_index_t *hi; + switch_hash_index_t *hi = NULL; cc_queue_t *queue; void *val = NULL; const void *key; @@ -3394,7 +3394,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_callcenter_shutdown) } switch_mutex_lock(globals.mutex); - while ((hi = switch_core_hash_first( globals.queue_hash))) { + while ((hi = switch_core_hash_first_iter( globals.queue_hash, hi))) { switch_core_hash_this(hi, &key, &keylen, &val); queue = (cc_queue_t *) val; diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index ba262116c6..6066ed3343 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -5291,7 +5291,7 @@ static switch_status_t list_conferences(const char *line, const char *cursor, sw const void *vvar; switch_mutex_lock(globals.hash_mutex); - for (hi = switch_core_hash_first( globals.conference_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.conference_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &vvar, NULL, &val); switch_console_push_match(&my_matches, (const char *) vvar); } @@ -5783,7 +5783,7 @@ static switch_status_t conf_api_sub_list(conference_obj_t *conference, switch_st if (conference == NULL) { switch_mutex_lock(globals.hash_mutex); - for (hi = switch_core_hash_first( globals.conference_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.conference_hash); hi; hi = switch_core_hash_next(&hi)) { int fcount = 0; switch_core_hash_this(hi, NULL, NULL, &val); conference = (conference_obj_t *) val; @@ -6262,7 +6262,7 @@ static switch_status_t conf_api_sub_xml_list(conference_obj_t *conference, switc if (conference == NULL) { switch_mutex_lock(globals.hash_mutex); - for (hi = switch_core_hash_first( globals.conference_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.conference_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); conference = (conference_obj_t *) val; diff --git a/src/mod/applications/mod_directory/mod_directory.c b/src/mod/applications/mod_directory/mod_directory.c index 5a1d056881..bf5b4fd92c 100644 --- a/src/mod/applications/mod_directory/mod_directory.c +++ b/src/mod/applications/mod_directory/mod_directory.c @@ -1070,7 +1070,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_directory_shutdown) switch_mutex_lock(globals.mutex); - while ((hi = switch_core_hash_first( globals.profile_hash))) { + while ((hi = switch_core_hash_first(globals.profile_hash))) { switch_core_hash_this(hi, &key, &keylen, &val); profile = (dir_profile_t *) val; diff --git a/src/mod/applications/mod_fifo/mod_fifo.c b/src/mod/applications/mod_fifo/mod_fifo.c index 28cef8f691..cea09ac0e8 100644 --- a/src/mod/applications/mod_fifo/mod_fifo.c +++ b/src/mod/applications/mod_fifo/mod_fifo.c @@ -975,7 +975,7 @@ static int node_idle_consumers(fifo_node_t *node) int total = 0; switch_mutex_lock(node->mutex); - for (hi = switch_core_hash_first( node->consumer_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(node->consumer_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); session = (switch_core_session_t *) val; channel = switch_core_session_get_channel(session); @@ -3802,7 +3802,7 @@ static int xml_hash(switch_xml_t xml, switch_hash_t *hash, char *container, char x_tmp = switch_xml_add_child_d(xml, container, cc_off++); switch_assert(x_tmp); - for (hi = switch_core_hash_first( hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(hash); hi; hi = switch_core_hash_next(&hi)) { int c_off = 0, d_off = 0; const char *status; const char *ts; @@ -3987,7 +3987,7 @@ void dump_hash(switch_hash_t *hash, switch_stream_handle_t *stream) const void *var; switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); stream->write_function(stream, " %s\n", (char *)var); } @@ -4002,7 +4002,7 @@ void node_dump(switch_stream_handle_t *stream) fifo_node_t *node; void *val; switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.fifo_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.fifo_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); if ((node = (fifo_node_t *) val)) { stream->write_function(stream, "node: %s\n" @@ -4100,7 +4100,7 @@ SWITCH_STANDARD_API(fifo_api_function) switch_assert(x_report); if (argc < 2) { - for (hi = switch_core_hash_first( globals.fifo_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.fifo_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); node = (fifo_node_t *) val; @@ -4137,7 +4137,7 @@ SWITCH_STANDARD_API(fifo_api_function) } } else if (!strcasecmp(argv[0], "count")) { if (argc < 2) { - for (hi = switch_core_hash_first( globals.fifo_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.fifo_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); node = (fifo_node_t *) val; switch_mutex_lock(node->update_mutex); @@ -4158,7 +4158,7 @@ SWITCH_STANDARD_API(fifo_api_function) } } else if (!strcasecmp(argv[0], "has_outbound")) { if (argc < 2) { - for (hi = switch_core_hash_first( globals.fifo_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.fifo_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); node = (fifo_node_t *) val; switch_mutex_lock(node->update_mutex); @@ -4359,7 +4359,7 @@ static switch_status_t load_config(int reload, int del_all) fifo_node_t *node; void *val; switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.fifo_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.fifo_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); if ((node = (fifo_node_t *) val) && node->is_static && node->ready == 1) { node->ready = -1; diff --git a/src/mod/applications/mod_hash/mod_hash.c b/src/mod/applications/mod_hash/mod_hash.c index a003110779..9af63045b3 100644 --- a/src/mod/applications/mod_hash/mod_hash.c +++ b/src/mod/applications/mod_hash/mod_hash.c @@ -291,7 +291,7 @@ SWITCH_LIMIT_RELEASE(limit_release_hash) /* clear for uuid */ if (realm == NULL && resource == NULL) { /* Loop through the channel's hashtable which contains mapping to all the limit_hash_item_t referenced by that channel */ - while ((hi = switch_core_hash_first( pvt->hash))) { + while ((hi = switch_core_hash_first(pvt->hash))) { void *val = NULL; const void *key; switch_ssize_t keylen; @@ -391,7 +391,7 @@ SWITCH_LIMIT_STATUS(limit_status_hash) switch_thread_rwlock_rdlock(globals.limit_hash_rwlock); - for (hi = switch_core_hash_first( globals.limit_hash); hi; switch_core_hash_next(hi)) { + for (hi = switch_core_hash_first(globals.limit_hash); hi; switch_core_hash_next(hi)) { count++; } @@ -623,7 +623,7 @@ SWITCH_STANDARD_API(hash_dump_function) if (mode & 1) { switch_thread_rwlock_rdlock(globals.limit_hash_rwlock); - for (hi = switch_core_hash_first( globals.limit_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.limit_hash); hi; hi = switch_core_hash_next(&hi)) { void *val = NULL; const void *key; switch_ssize_t keylen; @@ -639,7 +639,7 @@ SWITCH_STANDARD_API(hash_dump_function) if (mode & 2) { switch_thread_rwlock_rdlock(globals.db_hash_rwlock); - for (hi = switch_core_hash_first( globals.db_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.db_hash); hi; hi = switch_core_hash_next(&hi)) { void *val = NULL; const void *key; switch_ssize_t keylen; @@ -679,7 +679,7 @@ SWITCH_STANDARD_API(hash_remote_function) stream->write_function(stream, "Remote connections:\nName\t\t\tState\n"); switch_thread_rwlock_rdlock(globals.remote_hash_rwlock); - for (hi = switch_core_hash_first( globals.remote_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.remote_hash); hi; hi = switch_core_hash_next(&hi)) { void *val; const void *key; switch_ssize_t keylen; @@ -780,7 +780,7 @@ void limit_remote_destroy(limit_remote_t **r) switch_thread_rwlock_wrlock((*r)->rwlock); /* Free hashtable data */ - for (hi = switch_core_hash_first( (*r)->index); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first((*r)->index); hi; hi = switch_core_hash_next(&hi)) { void *val; const void *key; switch_ssize_t keylen; @@ -803,7 +803,7 @@ static limit_hash_item_t get_remote_usage(const char *key) { switch_hash_index_t *hi; switch_thread_rwlock_rdlock(globals.remote_hash_rwlock); - for (hi = switch_core_hash_first( globals.remote_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.remote_hash); hi; hi = switch_core_hash_next(&hi)) { void *val; const void *hashkey; switch_ssize_t keylen; @@ -1018,7 +1018,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_hash_load) SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_hash_shutdown) { - switch_hash_index_t *hi; + switch_hash_index_t *hi = NULL; switch_bool_t remote_clean = SWITCH_TRUE; switch_scheduler_del_task_group("mod_hash"); @@ -1031,7 +1031,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_hash_shutdown) limit_remote_t *item = NULL; switch_thread_rwlock_rdlock(globals.remote_hash_rwlock); - if ((hi = switch_core_hash_first( globals.remote_hash))) { + if ((hi = switch_core_hash_first(globals.remote_hash))) { switch_core_hash_this(hi, &key, &keylen, &val); item = (limit_remote_t *)val; } @@ -1050,7 +1050,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_hash_shutdown) switch_thread_rwlock_wrlock(globals.limit_hash_rwlock); switch_thread_rwlock_wrlock(globals.db_hash_rwlock); - while ((hi = switch_core_hash_first( globals.limit_hash))) { + while ((hi = switch_core_hash_first_iter( globals.limit_hash, hi))) { void *val = NULL; const void *key; switch_ssize_t keylen; @@ -1059,7 +1059,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_hash_shutdown) switch_core_hash_delete(globals.limit_hash, key); } - while ((hi = switch_core_hash_first( globals.db_hash))) { + while ((hi = switch_core_hash_first_iter( globals.db_hash, hi))) { void *val = NULL; const void *key; switch_ssize_t keylen; diff --git a/src/mod/applications/mod_httapi/mod_httapi.c b/src/mod/applications/mod_httapi/mod_httapi.c index 0581034c66..c7877299dd 100644 --- a/src/mod/applications/mod_httapi/mod_httapi.c +++ b/src/mod/applications/mod_httapi/mod_httapi.c @@ -3088,7 +3088,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_httapi_shutdown) void *val; const void *vvar; - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &vvar, NULL, &val); profile = (client_profile_t *) val; switch_event_destroy(&profile->dial_params.app_list); diff --git a/src/mod/applications/mod_lcr/mod_lcr.c b/src/mod/applications/mod_lcr/mod_lcr.c index 389f769cfc..7fda9487b1 100644 --- a/src/mod/applications/mod_lcr/mod_lcr.c +++ b/src/mod/applications/mod_lcr/mod_lcr.c @@ -2052,7 +2052,7 @@ SWITCH_STANDARD_API(dialplan_lcr_admin_function) } switch_assert(argv[0]); if (!strcasecmp(argv[0], "show") && !strcasecmp(argv[1], "profiles")) { - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); profile = (profile_t *) val; diff --git a/src/mod/applications/mod_redis/mod_redis.c b/src/mod/applications/mod_redis/mod_redis.c index 43bc37f215..3c8fc3f79d 100644 --- a/src/mod/applications/mod_redis/mod_redis.c +++ b/src/mod/applications/mod_redis/mod_redis.c @@ -172,7 +172,7 @@ SWITCH_LIMIT_RELEASE(limit_release_redis) /* clear for uuid */ if (realm == NULL && resource == NULL) { /* Loop through the channel's hashtable which contains mapping to all the limit_redis_item_t referenced by that channel */ - while ((hi = switch_core_hash_first( pvt->hash))) { + while ((hi = switch_core_hash_first(pvt->hash))) { void *p_val = NULL; const void *p_key; char *p_uuid_key = NULL; diff --git a/src/mod/applications/mod_spy/mod_spy.c b/src/mod/applications/mod_spy/mod_spy.c index 974973659f..4f4c8ebdf9 100644 --- a/src/mod/applications/mod_spy/mod_spy.c +++ b/src/mod/applications/mod_spy/mod_spy.c @@ -139,7 +139,7 @@ SWITCH_STANDARD_API(dump_hash) switch_thread_rwlock_rdlock(globals.spy_hash_lock); - for (hi = switch_core_hash_first( globals.spy_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.spy_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &key, NULL, &val); spy = (spy_t *) val; diff --git a/src/mod/applications/mod_translate/mod_translate.c b/src/mod/applications/mod_translate/mod_translate.c index 026e3eed83..b711815e34 100644 --- a/src/mod/applications/mod_translate/mod_translate.c +++ b/src/mod/applications/mod_translate/mod_translate.c @@ -170,7 +170,7 @@ static void do_unload(void) { switch_mutex_lock(MUTEX); - while ((hi = switch_core_hash_first( globals.translate_profiles))) { + while ((hi = switch_core_hash_first_iter( globals.translate_profiles, hi))) { void *val = NULL; const void *key; switch_ssize_t keylen; diff --git a/src/mod/applications/mod_valet_parking/mod_valet_parking.c b/src/mod/applications/mod_valet_parking/mod_valet_parking.c index c067205826..90f20233d3 100644 --- a/src/mod/applications/mod_valet_parking/mod_valet_parking.c +++ b/src/mod/applications/mod_valet_parking/mod_valet_parking.c @@ -105,7 +105,7 @@ static void check_timeouts(void) valet_lot_t *lot; switch_console_callback_match_t *matches = NULL; switch_console_callback_match_node_t *m; - switch_hash_index_t *i_hi; + switch_hash_index_t *i_hi = NULL; const void *i_var; void *i_val; char *i_ext; @@ -120,7 +120,7 @@ static void check_timeouts(void) } globals.last_timeout_check = now; - for (hi = switch_core_hash_first( globals.hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); switch_console_push_match(&matches, (const char *) var); } @@ -135,7 +135,7 @@ static void check_timeouts(void) top: - for (i_hi = switch_core_hash_first( lot->hash); i_hi; i_hi = switch_core_hash_next(&i_hi)) { + for (i_hi = switch_core_hash_first_iter( lot->hash, i_hi); i_hi; i_hi = switch_core_hash_next(&i_hi)) { switch_core_hash_this(i_hi, &i_var, NULL, &i_val); i_ext = (char *) i_var; token = (valet_token_t *) i_val; @@ -146,6 +146,7 @@ static void check_timeouts(void) goto top; } } + switch_safe_free(i_hi); switch_mutex_unlock(lot->mutex); } @@ -167,7 +168,7 @@ static int find_longest(valet_lot_t *lot, int min, int max) time_t now = switch_epoch_time_now(NULL); switch_mutex_lock(lot->mutex); - for (i_hi = switch_core_hash_first( lot->hash); i_hi; i_hi = switch_core_hash_next(&i_hi)) { + for (i_hi = switch_core_hash_first(lot->hash); i_hi; i_hi = switch_core_hash_next(&i_hi)) { int i; switch_core_hash_this(i_hi, &i_var, NULL, &i_val); token = (valet_token_t *) i_val; @@ -257,7 +258,7 @@ static int valet_lot_count(valet_lot_t *lot) now = switch_epoch_time_now(NULL); switch_mutex_lock(lot->mutex); - for (i_hi = switch_core_hash_first( lot->hash); i_hi; i_hi = switch_core_hash_next(&i_hi)) { + for (i_hi = switch_core_hash_first(lot->hash); i_hi; i_hi = switch_core_hash_next(&i_hi)) { switch_core_hash_this(i_hi, &i_var, NULL, &i_val); token = (valet_token_t *) i_val; if (token->timeout > 0 && (token->timeout < now || token->timeout == 1)) { @@ -738,7 +739,7 @@ SWITCH_STANDARD_API(valet_info_function) stream->write_function(stream, "\n"); switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.hash); hi; hi = switch_core_hash_next(&hi)) { switch_hash_index_t *i_hi; const void *i_var; void *i_val; @@ -754,7 +755,7 @@ SWITCH_STANDARD_API(valet_info_function) stream->write_function(stream, " \n", name); switch_mutex_lock(lot->mutex); - for (i_hi = switch_core_hash_first( lot->hash); i_hi; i_hi = switch_core_hash_next(&i_hi)) { + for (i_hi = switch_core_hash_first(lot->hash); i_hi; i_hi = switch_core_hash_next(&i_hi)) { valet_token_t *token; switch_core_hash_this(i_hi, &i_var, NULL, &i_val); @@ -848,7 +849,7 @@ static void pres_event_handler(switch_event_t *event) const char *nvar; switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); nvar = (const char *) var; diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c index 5538f64432..0d985d9c74 100644 --- a/src/mod/applications/mod_voicemail/mod_voicemail.c +++ b/src/mod/applications/mod_voicemail/mod_voicemail.c @@ -3866,7 +3866,7 @@ SWITCH_STANDARD_API(boxcount_api_function) /* Kept for backwards-compatibility */ switch_hash_index_t *hi; switch_mutex_lock(globals.mutex); - if ((hi = switch_core_hash_first( globals.profile_hash))) { + if ((hi = switch_core_hash_first(globals.profile_hash))) { void *val; switch_core_hash_this(hi, NULL, NULL, &val); profile = (vm_profile_t *) val; @@ -4020,7 +4020,7 @@ static void actual_message_query_handler(switch_event_t *event) "Cound not find a profile for domain: [%s] Returning 0 messages\nWhen message-query-exact-match is enabled you must have a dedicated vm profile per distinct domain name you wish to use.\n", domain); } } else { - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); profile = (vm_profile_t *) val; parse_profile(); @@ -4029,6 +4029,7 @@ static void actual_message_query_handler(switch_event_t *event) break; } } + switch_safe_free(hi); } switch_safe_free(dup); @@ -4923,7 +4924,7 @@ SWITCH_STANDARD_API(voicemail_api_function) } else if (!strcasecmp(argv[0], "status")) { stream->write_function(stream, "============================\n"); switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); profile = (vm_profile_t *) val; stream->write_function(stream, "Profile: %s\n", profile->name); @@ -4958,7 +4959,7 @@ SWITCH_STANDARD_API(voicemail_api_function) void *value; switch_mutex_lock(globals.mutex); - for (index = switch_core_hash_first( globals.profile_hash); index; index = switch_core_hash_next(&index)) { + for (index = switch_core_hash_first(globals.profile_hash); index; index = switch_core_hash_next(&index)) { switch_core_hash_this(index, NULL, NULL, &value); profile = (vm_profile_t *) value; if (profile) { @@ -4966,6 +4967,7 @@ SWITCH_STANDARD_API(voicemail_api_function) break; } } + switch_safe_free(index); switch_mutex_unlock(globals.mutex); } @@ -6237,7 +6239,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_voicemail_load) SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_voicemail_shutdown) { - switch_hash_index_t *hi; + switch_hash_index_t *hi = NULL; vm_profile_t *profile; void *val = NULL; const void *key; @@ -6261,7 +6263,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_voicemail_shutdown) } switch_mutex_lock(globals.mutex); - while ((hi = switch_core_hash_first( globals.profile_hash))) { + while ((hi = switch_core_hash_first_iter( globals.profile_hash, hi))) { switch_core_hash_this(hi, &key, &keylen, &val); profile = (vm_profile_t *) val; diff --git a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c index 3ca0b2e02e..f9149e0735 100644 --- a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c +++ b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c @@ -1158,7 +1158,7 @@ static switch_status_t synth_channel_set_params(speech_channel_t *schannel, mrcp { /* loop through each param and add to synth header or vendor-specific-params */ switch_hash_index_t *hi = NULL; - for (hi = switch_core_hash_first( schannel->params); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(schannel->params); hi; hi = switch_core_hash_next(&hi)) { char *param_name = NULL, *param_val = NULL; const void *key; void *val; @@ -1633,7 +1633,7 @@ static switch_status_t synth_speech_open(switch_speech_handle_t *sh, const char } /* Set default TTS params */ - for (hi = switch_core_hash_first( profile->default_synth_params); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(profile->default_synth_params); hi; hi = switch_core_hash_next(&hi)) { char *param_name = NULL, *param_val = NULL; const void *key; void *val; @@ -2195,7 +2195,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel) r->timers_started = zstr(start_input_timers) || strcasecmp(start_input_timers, "false"); /* count enabled grammars */ - for (egk = switch_core_hash_first( r->enabled_grammars); egk; egk = switch_core_hash_next(&egk)) { + for (egk = switch_core_hash_first(r->enabled_grammars); egk; egk = switch_core_hash_next(&egk)) { // NOTE: This postponed type check is necessary to allow a non-URI-list grammar to execute alone if (grammar_uri_count == 1 && grammar->type != GRAMMAR_TYPE_URI) goto no_grammar_alone; @@ -2205,6 +2205,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel) no_grammar_alone: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Grammar '%s' can only be used alone (not a URI list)\n", schannel->name, key); status = SWITCH_STATUS_FALSE; + switch_safe_free(egk); goto done; } len = strlen(grammar->data); @@ -2227,7 +2228,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel) /* get the enabled grammars list */ grammar_uri_list = switch_core_alloc(schannel->memory_pool, grammar_uri_list_len + 1); grammar_uri_list_len = 0; - for (egk = switch_core_hash_first( r->enabled_grammars); egk; egk = switch_core_hash_next(&egk)) { + for (egk = switch_core_hash_first(r->enabled_grammars); egk; egk = switch_core_hash_next(&egk)) { switch_core_hash_this(egk, (void *) &key, NULL, (void *) &grammar); len = strlen(grammar->data); if (!len) @@ -2810,7 +2811,7 @@ static switch_status_t recog_channel_set_params(speech_channel_t *schannel, mrcp { /* loop through each param and add to recog header or vendor-specific-params */ switch_hash_index_t *hi = NULL; - for (hi = switch_core_hash_first( schannel->params); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(schannel->params); hi; hi = switch_core_hash_next(&hi)) { char *param_name = NULL, *param_val = NULL; const void *key; void *val; @@ -3132,7 +3133,7 @@ static switch_status_t recog_asr_open(switch_asr_handle_t *ah, const char *codec } /* Set default ASR params */ - for (hi = switch_core_hash_first( profile->default_recog_params); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(profile->default_recog_params); hi; hi = switch_core_hash_next(&hi)) { char *param_name = NULL, *param_val = NULL; const void *key; void *val; diff --git a/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c b/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c index 3d4e0a3c25..096a4c90a7 100644 --- a/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c +++ b/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c @@ -930,7 +930,7 @@ SWITCH_STANDARD_API(sangoma_function) #define STATS_FORMAT "%-10.10s %-10.10s %-10.10s %-10.10s %-10.10s %-10.10s %-10.10s %-10.10s %-10.10s %-10.10s %-15.15s %-15.15s\n" stream->write_function(stream, STATS_FORMAT, "Session", "Codec", "Enc", "Dec", "Enc Tx", "Enc Rx", "Dec Tx", "Dec Rx", "Enc Lost", "Dec Lost", "Enc AvgRxMs", "Dec AvgRxMs"); - for (hi = switch_core_hash_first( g_sessions_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(g_sessions_hash); hi; hi = switch_core_hash_next(&hi)) { struct sangoma_transcoding_session *sess; char sessid_str[25]; char encoder_tx_str[25]; diff --git a/src/mod/endpoints/mod_dingaling/mod_dingaling.c b/src/mod/endpoints/mod_dingaling/mod_dingaling.c index e48b2098cd..e6cc5735cf 100644 --- a/src/mod/endpoints/mod_dingaling/mod_dingaling.c +++ b/src/mod/endpoints/mod_dingaling/mod_dingaling.c @@ -569,7 +569,7 @@ static void pres_event_handler(switch_event_t *event) switch_mprintf("select sub_from, sub_to,'%q','%q','%q','%q' from jabber_subscriptions where sub_to = '%q%q'", type, rpid, status, proto, pstr, from); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); profile = (mdl_profile_t *) val; @@ -701,7 +701,7 @@ static void roster_event_handler(switch_event_t *event) sql = switch_mprintf("select *,'%q' from jabber_subscriptions", status ? status : ""); } - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); profile = (mdl_profile_t *) val; @@ -738,7 +738,7 @@ static void ipchanged_event_handler(switch_event_t *event) mdl_profile_t *profile; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "IP change detected [%s]->[%s]\n", old_ip4, new_ip4); if (globals.profile_hash) { - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); profile = (mdl_profile_t *) val; if (old_ip4 && profile->extip && !strcmp(profile->extip, old_ip4)) { @@ -799,7 +799,7 @@ static void sign_off(void) sql = switch_mprintf("select * from jabber_subscriptions"); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); profile = (mdl_profile_t *) val; @@ -2684,7 +2684,7 @@ static switch_status_t list_profiles(const char *line, const char *cursor, switc switch_console_callback_match_t *my_matches = NULL; switch_status_t status = SWITCH_STATUS_FALSE; - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &vvar, NULL, &val); profile = (mdl_profile_t *) val; if (!strncmp("dl_logout", line, 9)) { @@ -3090,7 +3090,7 @@ SWITCH_STANDARD_API(dingaling) if (argv[0] && !strncasecmp(argv[0], "status", 6)) { stream->write_function(stream, "--DingaLing status--\n"); stream->write_function(stream, "login | connected\n"); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); profile = (mdl_profile_t *) val; stream->write_function(stream, "%s | ", profile->login); @@ -3345,7 +3345,7 @@ static switch_status_t soft_reload(void) switch_xml_free(xml); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &data); profile = (mdl_profile_t *) data; @@ -3356,7 +3356,7 @@ static switch_status_t soft_reload(void) } } - for (hi = switch_core_hash_first( name_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(name_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &data); if ((profile = switch_core_hash_find(globals.profile_hash, (char *) data))) { diff --git a/src/mod/endpoints/mod_portaudio/mod_portaudio.c b/src/mod/endpoints/mod_portaudio/mod_portaudio.c index 5823b27dd3..8f19bacf81 100644 --- a/src/mod/endpoints/mod_portaudio/mod_portaudio.c +++ b/src/mod/endpoints/mod_portaudio/mod_portaudio.c @@ -2491,7 +2491,7 @@ static switch_status_t list_shared_streams(char **argv, int argc, switch_stream_ { switch_hash_index_t *hi; int cnt = 0; - for (hi = switch_core_hash_first( globals.sh_streams); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.sh_streams); hi; hi = switch_core_hash_next(&hi)) { const void *var; void *val; shared_audio_stream_t *s = NULL; @@ -2509,7 +2509,7 @@ static switch_status_t list_endpoints(char **argv, int argc, switch_stream_handl { switch_hash_index_t *hi; int cnt = 0; - for (hi = switch_core_hash_first( globals.endpoints); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.endpoints); hi; hi = switch_core_hash_next(&hi)) { const void *var; void *val; audio_endpoint_t *e = NULL; diff --git a/src/mod/endpoints/mod_rtmp/mod_rtmp.c b/src/mod/endpoints/mod_rtmp/mod_rtmp.c index 19a977afa4..6a7e4a45b7 100644 --- a/src/mod/endpoints/mod_rtmp/mod_rtmp.c +++ b/src/mod/endpoints/mod_rtmp/mod_rtmp.c @@ -818,7 +818,7 @@ switch_status_t rtmp_session_request(rtmp_profile_t *profile, rtmp_session_t **n static void rtmp_garbage_colletor(void) { - switch_hash_index_t *hi; + switch_hash_index_t *hi = NULL; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "RTMP Garbage Collection\n"); @@ -827,7 +827,7 @@ static void rtmp_garbage_colletor(void) top: - for (hi = switch_core_hash_first( rtmp_globals.session_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first_iter( rtmp_globals.session_hash, hi); hi; hi = switch_core_hash_next(&hi)) { void *val; const void *key; switch_ssize_t keylen; @@ -842,6 +842,7 @@ static void rtmp_garbage_colletor(void) } } } + switch_safe_free(hi); switch_thread_rwlock_unlock(rtmp_globals.session_rwlock); } @@ -868,7 +869,7 @@ switch_status_t rtmp_real_session_destroy(rtmp_session_t **rsession) int sess = 0; switch_thread_rwlock_rdlock((*rsession)->session_rwlock); - for (hi = switch_core_hash_first( (*rsession)->session_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first((*rsession)->session_hash); hi; hi = switch_core_hash_next(&hi)) { void *val; const void *key; switch_ssize_t keylen; @@ -1086,7 +1087,7 @@ switch_status_t rtmp_profile_destroy(rtmp_profile_t **profile) { switch_thread_rwlock_wrlock((*profile)->rwlock); /* Kill all sessions */ - while ((hi = switch_core_hash_first( (*profile)->session_hash))) { + while ((hi = switch_core_hash_first((*profile)->session_hash))) { void *val; rtmp_session_t *session; const void *key; @@ -1633,7 +1634,7 @@ SWITCH_STANDARD_API(rtmp_function) stream->write_function(stream, "\nSessions:\n"); stream->write_function(stream, "uuid,address,user,domain,flashVer,state\n"); switch_thread_rwlock_rdlock(profile->session_rwlock); - for (hi = switch_core_hash_first( profile->session_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(profile->session_hash); hi; hi = switch_core_hash_next(&hi)) { void *val; const void *key; switch_ssize_t keylen; @@ -1655,7 +1656,7 @@ SWITCH_STANDARD_API(rtmp_function) stream->write_function(stream, "user,nickname,uuid\n"); switch_thread_rwlock_rdlock(profile->reg_rwlock); - for (hi = switch_core_hash_first( profile->reg_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(profile->reg_hash); hi; hi = switch_core_hash_next(&hi)) { void *val; const void *key; switch_ssize_t keylen; @@ -1681,7 +1682,7 @@ SWITCH_STANDARD_API(rtmp_function) } else { switch_hash_index_t *hi; switch_thread_rwlock_rdlock(rtmp_globals.profile_rwlock); - for (hi = switch_core_hash_first( rtmp_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(rtmp_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { void *val; const void *key; switch_ssize_t keylen; @@ -1805,7 +1806,7 @@ static switch_status_t console_complete_hashtable(switch_hash_t *hash, const cha switch_console_callback_match_t *my_matches = NULL; switch_status_t status = SWITCH_STATUS_FALSE; - for (hi = switch_core_hash_first( hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &vvar, NULL, &val); switch_console_push_match(&my_matches, (const char *) vvar); } @@ -1930,10 +1931,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_rtmp_load) SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_rtmp_shutdown) { - switch_hash_index_t *hi; + switch_hash_index_t *hi = NULL; switch_mutex_lock(rtmp_globals.mutex); - while ((hi = switch_core_hash_first( rtmp_globals.profile_hash))) { + while ((hi = switch_core_hash_first_iter( rtmp_globals.profile_hash, hi))) { void *val; const void *key; switch_ssize_t keylen; diff --git a/src/mod/endpoints/mod_rtmp/rtmp.c b/src/mod/endpoints/mod_rtmp/rtmp.c index aad10e2fb4..277edcf8a6 100644 --- a/src/mod/endpoints/mod_rtmp/rtmp.c +++ b/src/mod/endpoints/mod_rtmp/rtmp.c @@ -243,7 +243,7 @@ switch_status_t rtmp_check_auth(rtmp_session_t *rsession, const char *user, cons if (disallow_multiple_registration) { switch_hash_index_t *hi; switch_thread_rwlock_rdlock(rsession->profile->session_rwlock); - for (hi = switch_core_hash_first( rsession->profile->session_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(rsession->profile->session_hash); hi; hi = switch_core_hash_next(&hi)) { void *val; const void *key; switch_ssize_t keylen; diff --git a/src/mod/endpoints/mod_skinny/mod_skinny.c b/src/mod/endpoints/mod_skinny/mod_skinny.c index 6c35e543e5..0b75bd5b92 100644 --- a/src/mod/endpoints/mod_skinny/mod_skinny.c +++ b/src/mod/endpoints/mod_skinny/mod_skinny.c @@ -197,7 +197,7 @@ skinny_profile_t *skinny_find_profile_by_domain(const char *domain_name) skinny_profile_t *profile = NULL, *tmp_profile; switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); tmp_profile = (skinny_profile_t *) val; @@ -210,6 +210,7 @@ skinny_profile_t *skinny_find_profile_by_domain(const char *domain_name) break; } } + switch_safe_free(hi); switch_mutex_unlock(globals.mutex); return profile; @@ -1401,7 +1402,7 @@ static void walk_listeners(skinny_listener_callback_func_t callback, void *pvt) /* walk listeners */ switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); profile = (skinny_profile_t *) val; @@ -2441,7 +2442,7 @@ static void skinny_trap_event_handler(switch_event_t *event) switch_mutex_lock(globals.mutex); if (globals.profile_hash) { - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((profile = (skinny_profile_t *) val) && profile->auto_restart) { if (!strcmp(profile->ip, old_ip4)) { @@ -2477,7 +2478,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_skinny_load) load_skinny_config(); /* at least one profile */ - if (!switch_core_hash_first( globals.profile_hash)) { + if (switch_core_hash_empty( globals.profile_hash)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No profile found!\n"); return SWITCH_STATUS_TERM; } @@ -2540,7 +2541,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_skinny_load) /* launch listeners */ switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { void *val; skinny_profile_t *profile; @@ -2587,7 +2588,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_skinny_shutdown) /* close sockets */ switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { skinny_profile_t *profile; switch_core_hash_this(hi, NULL, NULL, &val); profile = (skinny_profile_t *) val; diff --git a/src/mod/endpoints/mod_skinny/skinny_api.c b/src/mod/endpoints/mod_skinny/skinny_api.c index 03c319da0c..aba3abf97a 100644 --- a/src/mod/endpoints/mod_skinny/skinny_api.c +++ b/src/mod/endpoints/mod_skinny/skinny_api.c @@ -49,7 +49,7 @@ static switch_status_t skinny_api_list_profiles(const char *line, const char *cu /* walk profiles */ switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); profile = (skinny_profile_t *) val; diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 056a996be9..c70bc1771e 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -2474,7 +2474,7 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t stream->write_function(stream, "%25s\t%32s\t%s\t%s\t%s\n", "Profile::Gateway-Name", " Data ", "State", "IB Calls(F/T)", "OB Calls(F/T)"); stream->write_function(stream, "%s\n", line); switch_mutex_lock(mod_sofia_globals.hash_mutex); - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &vvar, NULL, &val); profile = (sofia_profile_t *) val; if (sofia_test_pflag(profile, PFLAG_RUNNING)) { @@ -2707,7 +2707,7 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t stream->write_function(stream, "%25s\t%s\t %40s\t%s\n", "Name", " Type", "Data", "State"); stream->write_function(stream, "%s\n", line); switch_mutex_lock(mod_sofia_globals.hash_mutex); - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &vvar, NULL, &val); profile = (sofia_profile_t *) val; if (sofia_test_pflag(profile, PFLAG_RUNNING)) { @@ -2819,7 +2819,7 @@ static switch_status_t cmd_xml_status(char **argv, int argc, switch_stream_handl stream->write_function(stream, "\n", header); switch_mutex_lock(mod_sofia_globals.hash_mutex); - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &vvar, NULL, &val); profile = (sofia_profile_t *) val; if (sofia_test_pflag(profile, PFLAG_RUNNING)) { @@ -2991,7 +2991,7 @@ static switch_status_t cmd_xml_status(char **argv, int argc, switch_stream_handl stream->write_function(stream, "%s\n", header); stream->write_function(stream, "\n"); switch_mutex_lock(mod_sofia_globals.hash_mutex); - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &vvar, NULL, &val); profile = (sofia_profile_t *) val; if (sofia_test_pflag(profile, PFLAG_RUNNING)) { @@ -3654,7 +3654,7 @@ SWITCH_STANDARD_API(sofia_contact_function) const void *var; void *val; - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((profile = (sofia_profile_t *) val) && !strcmp((char *)var, profile->name)) { select_from_profile(profile, user, domain, concat, exclude_contact, &mystream, SWITCH_TRUE); @@ -3839,7 +3839,7 @@ SWITCH_STANDARD_API(sofia_presence_data_function) const void *var; void *val; - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((profile = (sofia_profile_t *) val) && !strcmp((char *)var, profile->name)) { get_presence_data(profile, user, domain, search, stream); @@ -5230,7 +5230,7 @@ static void general_event_handler(switch_event_t *event) switch_mutex_lock(mod_sofia_globals.hash_mutex); if (mod_sofia_globals.profile_hash && !zstr(old_ip4) && !zstr(new_ip4)) { - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((profile = (sofia_profile_t *) val)) { @@ -5259,7 +5259,7 @@ static void general_event_handler(switch_event_t *event) switch_mutex_lock(mod_sofia_globals.hash_mutex); if (mod_sofia_globals.profile_hash) { - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { int rb = 0; uint32_t x = 0; switch_core_hash_this(hi, &var, NULL, &val); @@ -5372,7 +5372,7 @@ switch_status_t list_profiles_full(const char *line, const char *cursor, switch_ switch_status_t status = SWITCH_STATUS_FALSE; switch_mutex_lock(mod_sofia_globals.hash_mutex); - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &vvar, NULL, &val); profile = (sofia_profile_t *) val; @@ -5410,7 +5410,7 @@ static switch_status_t list_gateways(const char *line, const char *cursor, switc switch_status_t status = SWITCH_STATUS_FALSE; switch_mutex_lock(mod_sofia_globals.hash_mutex); - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &vvar, NULL, &val); profile = (sofia_profile_t *) val; if (sofia_test_pflag(profile, PFLAG_RUNNING)) { diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 0cd103ea7e..ac6600f94e 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -7196,7 +7196,7 @@ nua_handle_t *sofia_global_nua_handle_by_replaces(sip_replaces_t *replaces) switch_mutex_lock(mod_sofia_globals.hash_mutex); if (mod_sofia_globals.profile_hash) { - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((profile = (sofia_profile_t *) val)) { if (!(nh = nua_handle_by_replaces(profile->nua, replaces))) { @@ -7206,6 +7206,7 @@ nua_handle_t *sofia_global_nua_handle_by_replaces(sip_replaces_t *replaces) break; } } + switch_safe_free(hi); } switch_mutex_unlock(mod_sofia_globals.hash_mutex); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 8fb9df69f4..a69fb687d0 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -1653,7 +1653,7 @@ void sofia_glue_restart_all_profiles(void) switch_mutex_lock(mod_sofia_globals.hash_mutex); if (mod_sofia_globals.profile_hash) { - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((pptr = (sofia_profile_t *) val)) { int rsec = 10; @@ -1688,7 +1688,7 @@ void sofia_glue_global_siptrace(switch_bool_t on) switch_mutex_lock(mod_sofia_globals.hash_mutex); if (mod_sofia_globals.profile_hash) { - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((pptr = (sofia_profile_t *) val)) { nua_set_params(pptr->nua, TPTAG_LOG(on), TAG_END()); @@ -1708,7 +1708,7 @@ void sofia_glue_global_standby(switch_bool_t on) switch_mutex_lock(mod_sofia_globals.hash_mutex); if (mod_sofia_globals.profile_hash) { - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((pptr = (sofia_profile_t *) val)) { if (on) { @@ -1732,7 +1732,7 @@ void sofia_glue_global_capture(switch_bool_t on) switch_mutex_lock(mod_sofia_globals.hash_mutex); if (mod_sofia_globals.profile_hash) { - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((pptr = (sofia_profile_t *) val)) { nua_set_params(pptr->nua, TPTAG_CAPT(on ? mod_sofia_globals.capture_server : NULL), TAG_END()); @@ -1753,7 +1753,7 @@ void sofia_glue_global_watchdog(switch_bool_t on) switch_mutex_lock(mod_sofia_globals.hash_mutex); if (mod_sofia_globals.profile_hash) { - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((pptr = (sofia_profile_t *) val)) { pptr->watchdog_enabled = (on ? 1 : 0); @@ -1776,7 +1776,7 @@ void sofia_glue_del_profile(sofia_profile_t *profile) switch_mutex_lock(mod_sofia_globals.hash_mutex); if (mod_sofia_globals.profile_hash) { - for (hi = switch_core_hash_first( mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((pptr = (sofia_profile_t *) val) && pptr == profile) { aliases[i++] = strdup((char *) var); diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index bd0f424dad..2cc74dac32 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -1101,7 +1101,7 @@ static int debounce_check(sofia_profile_t *profile, const char *user, const char void sofia_reg_close_handles(sofia_profile_t *profile) { nua_handle_t *nh = NULL; - switch_hash_index_t *hi; + switch_hash_index_t *hi = NULL; const void *var; void *val; @@ -1109,7 +1109,7 @@ void sofia_reg_close_handles(sofia_profile_t *profile) switch_mutex_lock(profile->flag_mutex); if (profile->reg_nh_hash) { top: - for (hi = switch_core_hash_first( profile->reg_nh_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first_iter( profile->reg_nh_hash, hi); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((nh = (nua_handle_t *) val)) { nua_handle_unref(nh); @@ -1118,6 +1118,8 @@ void sofia_reg_close_handles(sofia_profile_t *profile) goto top; } } + switch_safe_free(hi); + } switch_mutex_unlock(profile->flag_mutex); @@ -3155,7 +3157,7 @@ sofia_gateway_t *sofia_reg_find_gateway_by_realm__(const char *file, const char void *val; switch_mutex_lock(mod_sofia_globals.hash_mutex); - for (hi = switch_core_hash_first( mod_sofia_globals.gateway_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(mod_sofia_globals.gateway_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if (key && (gateway = (sofia_gateway_t *) val) && !gateway->deleted && gateway->register_realm && !strcasecmp(gateway->register_realm, key)) { break; @@ -3163,6 +3165,7 @@ sofia_gateway_t *sofia_reg_find_gateway_by_realm__(const char *file, const char gateway = NULL; } } + switch_safe_free(hi); if (gateway) { if (!sofia_test_pflag(gateway->profile, PFLAG_RUNNING) || gateway->deleted) { diff --git a/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c b/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c index 9a2bdb9ae0..08c033262f 100644 --- a/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c +++ b/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c @@ -279,7 +279,7 @@ static void do_rotate_all() } switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.fd_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.fd_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); fd = (cdr_fd_t *) val; switch_mutex_lock(fd->mutex); @@ -296,7 +296,7 @@ static void do_teardown() void *val; cdr_fd_t *fd; switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( globals.fd_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.fd_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); fd = (cdr_fd_t *) val; switch_mutex_lock(fd->mutex); diff --git a/src/mod/event_handlers/mod_cdr_pg_csv/mod_cdr_pg_csv.c b/src/mod/event_handlers/mod_cdr_pg_csv/mod_cdr_pg_csv.c index 7136fd06f1..8753c846ea 100644 --- a/src/mod/event_handlers/mod_cdr_pg_csv/mod_cdr_pg_csv.c +++ b/src/mod/event_handlers/mod_cdr_pg_csv/mod_cdr_pg_csv.c @@ -401,7 +401,7 @@ static void event_handler(switch_event_t *event) } if (sig && !strcmp(sig, "HUP")) { - for (hi = switch_core_hash_first( globals.fd_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.fd_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); fd = (cdr_fd_t *) val; switch_mutex_lock(fd->mutex); diff --git a/src/mod/event_handlers/mod_erlang_event/handle_msg.c b/src/mod/event_handlers/mod_erlang_event/handle_msg.c index aff2fff67f..af28718982 100644 --- a/src/mod/event_handlers/mod_erlang_event/handle_msg.c +++ b/src/mod/event_handlers/mod_erlang_event/handle_msg.c @@ -1132,7 +1132,7 @@ static switch_status_t handle_ref_tuple(listener_t *listener, erlang_msg * msg, switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Hashed ref to %s\n", hash); switch_thread_rwlock_rdlock(listener->session_rwlock); - for (iter = switch_core_hash_first( listener->sessions); iter; iter = switch_core_hash_next(&iter)) { + for (iter = switch_core_hash_first(listener->sessions); iter; iter = switch_core_hash_next(&iter)) { switch_core_hash_this(iter, &key, NULL, &val); se = (session_elem_t*)val; if (se->spawn_reply && !strncmp(se->spawn_reply->hash, hash, 100)) { @@ -1154,6 +1154,7 @@ static switch_status_t handle_ref_tuple(listener_t *listener, erlang_msg * msg, break; } } + switch_safe_free(iter); switch_thread_rwlock_unlock(listener->session_rwlock); if (found) { diff --git a/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c b/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c index eee0f9c7e7..83850204fc 100644 --- a/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c +++ b/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c @@ -364,7 +364,7 @@ session_elem_t *find_session_elem_by_pid(listener_t *listener, erlang_pid *pid) session_elem_t *session = NULL; switch_thread_rwlock_rdlock(listener->session_rwlock); - for (iter = switch_core_hash_first( listener->sessions); iter; iter = switch_core_hash_next(&iter)) { + for (iter = switch_core_hash_first(listener->sessions); iter; iter = switch_core_hash_next(&iter)) { switch_core_hash_this(iter, &key, NULL, &val); if (((session_elem_t*)val)->process.type == ERLANG_PID && !ei_compare_pids(pid, &((session_elem_t*)val)->process.pid)) { @@ -373,6 +373,7 @@ session_elem_t *find_session_elem_by_pid(listener_t *listener, erlang_pid *pid) break; } } + switch_safe_free(iter); switch_thread_rwlock_unlock(listener->session_rwlock); return session; @@ -644,7 +645,7 @@ static switch_status_t check_attached_sessions(listener_t *listener, int *msgs_s /* TODO try to minimize critical section */ switch_thread_rwlock_rdlock(listener->session_rwlock); - for (iter = switch_core_hash_first( listener->sessions); iter; iter = switch_core_hash_next(&iter)) { + for (iter = switch_core_hash_first(listener->sessions); iter; iter = switch_core_hash_next(&iter)) { switch_core_hash_this(iter, &key, NULL, &value); sp = (session_elem_t*)value; if (switch_test_flag(sp, LFLAG_WAITING_FOR_PID)) { @@ -1333,7 +1334,7 @@ void destroy_listener(listener_t * listener) /* clean up all the attached sessions */ switch_thread_rwlock_wrlock(listener->session_rwlock); - for (iter = switch_core_hash_first( listener->sessions); iter; iter = switch_core_hash_next(&iter)) { + for (iter = switch_core_hash_first(listener->sessions); iter; iter = switch_core_hash_next(&iter)) { switch_core_hash_this(iter, &key, NULL, &value); s = (session_elem_t*)value; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Orphaning call %s\n", s->uuid_str); @@ -1529,7 +1530,7 @@ int count_listener_sessions(listener_t *listener) switch_hash_index_t *iter; switch_thread_rwlock_rdlock(listener->session_rwlock); - for (iter = switch_core_hash_first( listener->sessions); iter; iter = switch_core_hash_next(&iter)) { + for (iter = switch_core_hash_first(listener->sessions); iter; iter = switch_core_hash_next(&iter)) { count++; } switch_thread_rwlock_unlock(listener->session_rwlock); @@ -1750,7 +1751,7 @@ SWITCH_STANDARD_API(erlang_cmd) found = 1; switch_thread_rwlock_rdlock(l->session_rwlock); - for (iter = switch_core_hash_first( l->sessions); iter; iter = switch_core_hash_next(&iter)) { + for (iter = switch_core_hash_first(l->sessions); iter; iter = switch_core_hash_next(&iter)) { empty = 0; switch_core_hash_this(iter, &key, NULL, &value); sp = (session_elem_t*)value; @@ -1791,7 +1792,7 @@ SWITCH_STANDARD_API(erlang_cmd) } stream->write_function(stream, "CUSTOM:\n", switch_event_name(x)); - for (iter = switch_core_hash_first( l->event_hash); iter; iter = switch_core_hash_next(&iter)) { + for (iter = switch_core_hash_first(l->event_hash); iter; iter = switch_core_hash_next(&iter)) { switch_core_hash_this(iter, &key, NULL, &val); stream->write_function(stream, "\t%s\n", (char *)key); } diff --git a/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c b/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c index 70a76d79b0..b2eb95ce8b 100644 --- a/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c +++ b/src/mod/event_handlers/mod_event_multicast/mod_event_multicast.c @@ -247,7 +247,7 @@ static void event_handler(switch_event_t *event) struct peer_status *last; char *host; - for (cur = switch_core_hash_first( globals.peer_hash); cur; cur = switch_core_hash_next(&cur)) { + for (cur = switch_core_hash_first(globals.peer_hash); cur; cur = switch_core_hash_next(&cur)) { switch_core_hash_this(cur, &key, &keylen, &value); host = (char *) key; last = (struct peer_status *) value; @@ -351,7 +351,7 @@ SWITCH_STANDARD_API(multicast_peers) char *host; int i = 0; - for (cur = switch_core_hash_first( globals.peer_hash); cur; cur = switch_core_hash_next(&cur)) { + for (cur = switch_core_hash_first(globals.peer_hash); cur; cur = switch_core_hash_next(&cur)) { switch_core_hash_this(cur, &key, &keylen, &value); host = (char *) key; last = (struct peer_status *) value; diff --git a/src/mod/event_handlers/mod_format_cdr/mod_format_cdr.c b/src/mod/event_handlers/mod_format_cdr/mod_format_cdr.c index 80b671497a..57d3e1ba56 100644 --- a/src/mod/event_handlers/mod_format_cdr/mod_format_cdr.c +++ b/src/mod/event_handlers/mod_format_cdr/mod_format_cdr.c @@ -495,7 +495,7 @@ static switch_status_t my_on_reporting(switch_core_session_t *session) status = SWITCH_STATUS_SUCCESS; - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { cdr_profile_t *profile; switch_core_hash_this(hi, NULL, NULL, &val); profile = (cdr_profile_t *) val; @@ -518,7 +518,7 @@ static void event_handler(switch_event_t *event) const char *sig = switch_event_get_header(event, "Trapped-Signal"); if (sig && !strcmp(sig, "HUP")) { - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { cdr_profile_t *profile; switch_core_hash_this(hi, NULL, NULL, &val); profile = (cdr_profile_t *) val; @@ -785,7 +785,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_format_cdr_shutdown) switch_event_unbind(&globals.node); switch_core_remove_state_handler(&state_handlers); - for (hi = switch_core_hash_first( globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.profile_hash); hi; hi = switch_core_hash_next(&hi)) { cdr_profile_t *profile; switch_core_hash_this(hi, NULL, NULL, &val); profile = (cdr_profile_t *) val; diff --git a/src/mod/event_handlers/mod_rayo/mod_rayo.c b/src/mod/event_handlers/mod_rayo/mod_rayo.c index 558de801f7..017f0793de 100644 --- a/src/mod/event_handlers/mod_rayo/mod_rayo.c +++ b/src/mod/event_handlers/mod_rayo/mod_rayo.c @@ -508,6 +508,7 @@ static void pause_when_offline(void) break; } } + switch_safe_free(hi); if (is_online) { resume_inbound_calling(); diff --git a/src/mod/event_handlers/mod_rayo/rayo_cpa_component.c b/src/mod/event_handlers/mod_rayo/rayo_cpa_component.c index b77aaf7d1c..364a6b6176 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_cpa_component.c +++ b/src/mod/event_handlers/mod_rayo/rayo_cpa_component.c @@ -105,7 +105,7 @@ static void unsubscribe(const char *uuid, const char *signal_type, const char *j switch_log_printf(SWITCH_CHANNEL_UUID_LOG(uuid), SWITCH_LOG_DEBUG, "Unsubscribe %s => %s\n", signal_type, jid); /* clean up hash if empty */ - if (!switch_core_hash_first(signal_subscribers)) { + if (switch_core_hash_empty(signal_subscribers)) { switch_log_printf(SWITCH_CHANNEL_UUID_LOG(uuid), SWITCH_LOG_DEBUG, "Destroy %s subscriber hash\n", signal_type); switch_core_hash_destroy(&signal_subscribers); switch_core_hash_delete(globals.subscribers, key); diff --git a/src/mod/formats/mod_local_stream/mod_local_stream.c b/src/mod/formats/mod_local_stream/mod_local_stream.c index 77ce050ee5..35ea59d841 100644 --- a/src/mod/formats/mod_local_stream/mod_local_stream.c +++ b/src/mod/formats/mod_local_stream/mod_local_stream.c @@ -810,7 +810,7 @@ SWITCH_STANDARD_API(show_local_stream_function) switch_mutex_lock(globals.mutex); if (zstr(cmd)) { - for (hi = switch_core_hash_first( globals.source_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(globals.source_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((source = (local_stream_source_t *) val)) { stream->write_function(stream, "%s,%s\n", source->name, source->location); diff --git a/src/mod/languages/mod_v8/src/fsxml.cpp b/src/mod/languages/mod_v8/src/fsxml.cpp index 927989f847..7d20e00c0c 100644 --- a/src/mod/languages/mod_v8/src/fsxml.cpp +++ b/src/mod/languages/mod_v8/src/fsxml.cpp @@ -198,7 +198,7 @@ void FSXML::DestroyHash() } /* First destroy all objects in the hash */ - for (hi = switch_core_hash_first( tmp); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(tmp); hi; hi = switch_core_hash_next(&hi)) { const void *var = NULL; void *val = NULL; FSXML *obj; diff --git a/src/mod/loggers/mod_logfile/mod_logfile.c b/src/mod/loggers/mod_logfile/mod_logfile.c index 1388f728bd..d7024a07e7 100644 --- a/src/mod/loggers/mod_logfile/mod_logfile.c +++ b/src/mod/loggers/mod_logfile/mod_logfile.c @@ -264,7 +264,7 @@ static switch_status_t process_node(const switch_log_node_t *node, switch_log_le const void *var; logfile_profile_t *profile; - for (hi = switch_core_hash_first( profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(profile_hash); hi; hi = switch_core_hash_next(&hi)) { size_t mask = 0; size_t ok = 0; @@ -380,14 +380,14 @@ static void event_handler(switch_event_t *event) if (sig && !strcmp(sig, "HUP")) { if (globals.rotate) { - for (hi = switch_core_hash_first( profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); profile = val; mod_logfile_rotate(profile); } } else { switch_mutex_lock(globals.mutex); - for (hi = switch_core_hash_first( profile_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(profile_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); profile = val; switch_file_close(profile->log_afd); @@ -461,7 +461,7 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_logfile_shutdown) 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)) { + 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)) { diff --git a/src/switch_core.c b/src/switch_core.c index d966b441e7..b09a576ef8 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1023,7 +1023,7 @@ SWITCH_DECLARE(const char *) switch_core_mime_ext2type(const char *ext) SWITCH_DECLARE(switch_hash_index_t *) switch_core_mime_index(void) { - return switch_core_hash_first( runtime.mime_types); + return switch_core_hash_first(runtime.mime_types); } SWITCH_DECLARE(switch_status_t) switch_core_mime_add_type(const char *type, const char *ext) diff --git a/src/switch_core_hash.c b/src/switch_core_hash.c index e39b69d388..343f43e6b3 100644 --- a/src/switch_core_hash.c +++ b/src/switch_core_hash.c @@ -205,9 +205,22 @@ SWITCH_DECLARE(void *) switch_core_hash_find_rdlock(switch_hash_t *hash, const c return val; } -SWITCH_DECLARE(switch_hash_index_t *) switch_core_hash_first(switch_hash_t *hash) +SWITCH_DECLARE(switch_bool_t) switch_core_hash_empty(switch_hash_t *hash) { - return switch_hashtable_first(hash); + switch_hash_index_t *hi = switch_core_hash_first(hash); + + if (hi) { + switch_safe_free(hi); + return SWITCH_FALSE; + } + + return SWITCH_TRUE; + +} + +SWITCH_DECLARE(switch_hash_index_t *) switch_core_hash_first_iter(switch_hash_t *hash, switch_hash_index_t *hi) +{ + return switch_hashtable_first_iter(hash, hi); } SWITCH_DECLARE(switch_hash_index_t *) switch_core_hash_next(switch_hash_index_t **hi) diff --git a/src/switch_core_session.c b/src/switch_core_session.c index 346c54b09c..5fa3feb344 100644 --- a/src/switch_core_session.c +++ b/src/switch_core_session.c @@ -222,7 +222,7 @@ SWITCH_DECLARE(uint32_t) switch_core_session_hupall_matching_var_ans(const char return r; switch_mutex_lock(runtime.session_hash_mutex); - for (hi = switch_core_hash_first( session_manager.session_table); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(session_manager.session_table); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); if (val) { session = (switch_core_session_t *) val; @@ -275,7 +275,7 @@ SWITCH_DECLARE(switch_console_callback_match_t *) switch_core_session_findall_ma switch_core_new_memory_pool(&pool); switch_mutex_lock(runtime.session_hash_mutex); - for (hi = switch_core_hash_first( session_manager.session_table); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(session_manager.session_table); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); if (val) { session = (switch_core_session_t *) val; @@ -319,7 +319,7 @@ SWITCH_DECLARE(void) switch_core_session_hupall_endpoint(const switch_endpoint_i switch_core_new_memory_pool(&pool); switch_mutex_lock(runtime.session_hash_mutex); - for (hi = switch_core_hash_first( session_manager.session_table); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(session_manager.session_table); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); if (val) { session = (switch_core_session_t *) val; @@ -359,7 +359,7 @@ SWITCH_DECLARE(void) switch_core_session_hupall(switch_call_cause_t cause) switch_mutex_lock(runtime.session_hash_mutex); - for (hi = switch_core_hash_first( session_manager.session_table); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(session_manager.session_table); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); if (val) { session = (switch_core_session_t *) val; @@ -394,7 +394,7 @@ SWITCH_DECLARE(switch_console_callback_match_t *) switch_core_session_findall(vo switch_console_callback_match_t *my_matches = NULL; switch_mutex_lock(runtime.session_hash_mutex); - for (hi = switch_core_hash_first( session_manager.session_table); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(session_manager.session_table); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); if (val) { session = (switch_core_session_t *) val; diff --git a/src/switch_event.c b/src/switch_event.c index 2e5c943261..f55936fc46 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -576,7 +576,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_shutdown(void) } } - for (hi = switch_core_hash_first( CUSTOM_HASH); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(CUSTOM_HASH); hi; hi = switch_core_hash_next(&hi)) { switch_event_subclass_t *subclass; switch_core_hash_this(hi, &var, NULL, &val); if ((subclass = (switch_event_subclass_t *) val)) { @@ -2686,14 +2686,14 @@ static uint32_t switch_event_channel_unsub_head(switch_event_channel_func_t func static void unsub_all_switch_event_channel(void) { - switch_hash_index_t *hi; + switch_hash_index_t *hi = NULL; const void *var; void *val; switch_event_channel_sub_node_head_t *head; switch_thread_rwlock_wrlock(event_channel_manager.rwlock); - while ((hi = switch_core_hash_first( event_channel_manager.perm_hash))) { + while ((hi = switch_core_hash_first_iter( event_channel_manager.perm_hash, hi))) { switch_event_t *vals = NULL; switch_core_hash_this(hi, &var, NULL, &val); vals = (switch_event_t *) val; @@ -2701,7 +2701,7 @@ static void unsub_all_switch_event_channel(void) switch_event_destroy(&vals); } - while ((hi = switch_core_hash_first( event_channel_manager.hash))) { + while ((hi = switch_core_hash_first_iter( event_channel_manager.hash, hi))) { switch_core_hash_this(hi, NULL, NULL, &val); head = (switch_event_channel_sub_node_head_t *) val; switch_event_channel_unsub_head(NULL, head); @@ -2724,7 +2724,7 @@ static uint32_t switch_event_channel_unsub_channel(switch_event_channel_func_t f switch_hash_index_t *hi; void *val; - for (hi = switch_core_hash_first( event_channel_manager.hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(event_channel_manager.hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); if (val) { diff --git a/src/switch_hashtable.c b/src/switch_hashtable.c index 50383946fa..ab56b1ebac 100644 --- a/src/switch_hashtable.c +++ b/src/switch_hashtable.c @@ -294,11 +294,16 @@ SWITCH_DECLARE(switch_hashtable_iterator_t *) switch_hashtable_next(switch_hasht return NULL; } -SWITCH_DECLARE(switch_hashtable_iterator_t *) switch_hashtable_first(switch_hashtable_t *h) +SWITCH_DECLARE(switch_hashtable_iterator_t *) switch_hashtable_first_iter(switch_hashtable_t *h, switch_hashtable_iterator_t *it) { switch_hashtable_iterator_t *iterator; - switch_zmalloc(iterator, sizeof(*iterator)); + if (it) { + iterator = it; + } else { + switch_zmalloc(iterator, sizeof(*iterator)); + } + switch_assert(iterator); iterator->pos = 0; diff --git a/src/switch_loadable_module.c b/src/switch_loadable_module.c index 59756498c2..0f4b0aa6e6 100644 --- a/src/switch_loadable_module.c +++ b/src/switch_loadable_module.c @@ -118,7 +118,7 @@ static void switch_loadable_module_runtime(void) switch_loadable_module_t *module; switch_mutex_lock(loadable_modules.mutex); - for (hi = switch_core_hash_first( loadable_modules.module_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(loadable_modules.module_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); module = (switch_loadable_module_t *) val; @@ -620,7 +620,7 @@ static switch_status_t do_chat_send(switch_event_t *message_event) if (!switch_true(replying) && !switch_stristr("global", proto) && !switch_true(switch_event_get_header(message_event, "skip_global_process"))) { switch_mutex_lock(loadable_modules.mutex); - for (hi = switch_core_hash_first( loadable_modules.chat_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(loadable_modules.chat_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((ci = (switch_chat_interface_t *) val)) { @@ -647,6 +647,7 @@ static switch_status_t do_chat_send(switch_event_t *message_event) } } } + switch_safe_free(hi); switch_mutex_unlock(loadable_modules.mutex); } @@ -1639,7 +1640,7 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_enumerate_loaded(switch_m switch_loadable_module_t *module; switch_mutex_lock(loadable_modules.mutex); - for (hi = switch_core_hash_first( loadable_modules.module_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(loadable_modules.module_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); module = (switch_loadable_module_t *) val; @@ -1986,7 +1987,7 @@ SWITCH_DECLARE(void) switch_loadable_module_shutdown(void) } - for (hi = switch_core_hash_first( loadable_modules.module_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(loadable_modules.module_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); module = (switch_loadable_module_t *) val; if (!module->perm) { @@ -1996,7 +1997,7 @@ SWITCH_DECLARE(void) switch_loadable_module_shutdown(void) switch_yield(1000000); - for (hi = switch_core_hash_first( loadable_modules.module_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(loadable_modules.module_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); module = (switch_loadable_module_t *) val; if (!module->perm) { @@ -2196,7 +2197,7 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs(const switch_codec_impleme const switch_codec_implementation_t *imp; switch_mutex_lock(loadable_modules.mutex); - for (hi = switch_core_hash_first( loadable_modules.codec_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(loadable_modules.codec_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, NULL, NULL, &val); codec_interface = (switch_codec_interface_t *) val; @@ -2218,6 +2219,7 @@ SWITCH_DECLARE(int) switch_loadable_module_get_codecs(const switch_codec_impleme break; } } + switch_safe_free(hi); switch_mutex_unlock(loadable_modules.mutex); diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 52939f65c9..44afd1bedc 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -2017,7 +2017,7 @@ SWITCH_DECLARE(void) switch_rtp_shutdown(void) switch_mutex_lock(port_lock); - for (hi = switch_core_hash_first( alloc_hash); hi; hi = switch_core_hash_next(&hi)) { + for (hi = switch_core_hash_first(alloc_hash); hi; hi = switch_core_hash_next(&hi)) { switch_core_hash_this(hi, &var, NULL, &val); if ((alloc = (switch_core_port_allocator_t *) val)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Destroy port allocator for %s\n", (char *) var); diff --git a/src/switch_xml.c b/src/switch_xml.c index 94e998036f..62a34a365e 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -1945,7 +1945,7 @@ SWITCH_DECLARE(void) switch_xml_merge_user(switch_xml_t user, switch_xml_t domai SWITCH_DECLARE(uint32_t) switch_xml_clear_user_cache(const char *key, const char *user_name, const char *domain_name) { - switch_hash_index_t *hi; + switch_hash_index_t *hi = NULL; void *val; const void *var; char mega_key[1024]; @@ -1971,18 +1971,20 @@ SWITCH_DECLARE(uint32_t) switch_xml_clear_user_cache(const char *key, const char } else { - while ((hi = switch_core_hash_first( CACHE_HASH))) { + while ((hi = switch_core_hash_first_iter( CACHE_HASH, hi))) { switch_core_hash_this(hi, &var, NULL, &val); switch_xml_free(val); switch_core_hash_delete(CACHE_HASH, var); r++; } - while ((hi = switch_core_hash_first( CACHE_EXPIRES_HASH))) { + while ((hi = switch_core_hash_first_iter( CACHE_EXPIRES_HASH, hi))) { switch_core_hash_this(hi, &var, NULL, &val); switch_safe_free(val); switch_core_hash_delete(CACHE_EXPIRES_HASH, var); } + + switch_safe_free(hi); } switch_mutex_unlock(CACHE_MUTEX);