From 836e2b28886da0b6c35d6090e9ad069bc22fa702 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 9 Jan 2015 13:35:42 -0600 Subject: [PATCH] FS-7500: add switch_inthash variety of hash that can key on int --- src/include/switch_core.h | 9 +++- src/include/switch_hashtable.h | 13 ++++++ src/include/switch_types.h | 2 + .../endpoints/mod_dingaling/mod_dingaling.c | 4 +- src/switch_core_hash.c | 42 ++++++++++++++++--- src/switch_ivr.c | 2 +- 6 files changed, 62 insertions(+), 10 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 1d83cb3649..f234fb129f 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -1400,9 +1400,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_hash_insert_wrlock(switch_hash_t *ha \brief Delete data from a hash based on desired key \param hash the hash to delete from \param key the key from which to delete the data - \return SWITCH_STATUS_SUCCESS if the data is deleted + \return The value stored if the data is deleted otherwise NULL */ -SWITCH_DECLARE(switch_status_t) switch_core_hash_delete(_In_ switch_hash_t *hash, _In_z_ const char *key); +SWITCH_DECLARE(void *) switch_core_hash_delete(_In_ switch_hash_t *hash, _In_z_ const char *key); /*! \brief Delete data from a hash based on desired key @@ -1491,6 +1491,11 @@ SWITCH_DECLARE(void) switch_core_hash_this(_In_ switch_hash_index_t *hi, _Out_op const void **key, _Out_opt_ switch_ssize_t *klen, _Out_ void **val); +SWITCH_DECLARE(switch_status_t) switch_core_inthash_init(switch_inthash_t **hash); +SWITCH_DECLARE(switch_status_t) switch_core_inthash_destroy(switch_inthash_t **hash); +SWITCH_DECLARE(switch_status_t) switch_core_inthash_insert(switch_inthash_t *hash, uint32_t key, const void *data); +SWITCH_DECLARE(void *) switch_core_inthash_delete(switch_inthash_t *hash, uint32_t key); +SWITCH_DECLARE(void *) switch_core_inthash_find(switch_inthash_t *hash, uint32_t key); ///\} diff --git a/src/include/switch_hashtable.h b/src/include/switch_hashtable.h index 1fdbeb9736..20c18276bc 100644 --- a/src/include/switch_hashtable.h +++ b/src/include/switch_hashtable.h @@ -197,6 +197,19 @@ SWITCH_DECLARE(switch_hashtable_iterator_t*) switch_hashtable_first_iter(switch_ 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); +static inline uint32_t switch_hash_default_int(void *ky) { + uint32_t x = *((uint32_t *)ky); + x = ((x >> 16) ^ x) * 0x45d9f3b; + x = ((x >> 16) ^ x) * 0x45d9f3b; + x = ((x >> 16) ^ x); + return x; +} + +static inline int switch_hash_equalkeys_int(void *k1, void *k2) +{ + return *(uint32_t *)k1 == *(uint32_t *)k2; +} + static inline int switch_hash_equalkeys(void *k1, void *k2) { return strcmp((char *) k1, (char *) k2) ? 0 : 1; diff --git a/src/include/switch_types.h b/src/include/switch_types.h index d2aecbd756..ecec0b8501 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -735,6 +735,7 @@ typedef enum { SWITCH_RTP_FLAG_PLI, SWITCH_RTP_FLAG_RESET, SWITCH_RTP_FLAG_MUTE, + SWITCH_RTP_FLAG_NACK, SWITCH_RTP_FLAG_INVALID } switch_rtp_flag_t; @@ -2340,6 +2341,7 @@ typedef switch_xml_t(*switch_xml_search_function_t) (const char *section, struct switch_hashtable; struct switch_hashtable_iterator; typedef struct switch_hashtable switch_hash_t; +typedef struct switch_hashtable switch_inthash_t; typedef struct switch_hashtable_iterator switch_hash_index_t; struct switch_network_list; diff --git a/src/mod/endpoints/mod_dingaling/mod_dingaling.c b/src/mod/endpoints/mod_dingaling/mod_dingaling.c index 1592def644..05012fb3b5 100644 --- a/src/mod/endpoints/mod_dingaling/mod_dingaling.c +++ b/src/mod/endpoints/mod_dingaling/mod_dingaling.c @@ -2025,7 +2025,7 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session) if (tech_pvt->profile->purge) { mdl_profile_t *profile = tech_pvt->profile; - if (switch_core_hash_delete(globals.profile_hash, profile->name) == SWITCH_STATUS_SUCCESS) { + if (switch_core_hash_delete(globals.profile_hash, profile->name)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile %s deleted successfully\n", profile->name); } } @@ -3261,7 +3261,7 @@ static switch_status_t destroy_profile(char *name) ldl_handle_stop(profile->handle); } - if (switch_core_hash_delete(globals.profile_hash, profile->name) == SWITCH_STATUS_SUCCESS) { + if (switch_core_hash_delete(globals.profile_hash, profile->name)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile %s deleted successfully\n", profile->name); } } diff --git a/src/switch_core_hash.c b/src/switch_core_hash.c index ddf08c0c6c..e3f4aaf171 100644 --- a/src/switch_core_hash.c +++ b/src/switch_core_hash.c @@ -92,11 +92,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_hash_insert_wrlock(switch_hash_t *ha return SWITCH_STATUS_SUCCESS; } -SWITCH_DECLARE(switch_status_t) switch_core_hash_delete(switch_hash_t *hash, const char *key) +SWITCH_DECLARE(void *) switch_core_hash_delete(switch_hash_t *hash, const char *key) { - switch_hashtable_remove(hash, (void *)key); - - return SWITCH_STATUS_SUCCESS; + return switch_hashtable_remove(hash, (void *)key); } SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_locked(switch_hash_t *hash, const char *key, switch_mutex_t *mutex) @@ -154,7 +152,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_multi(switch_hash_t *has /* now delete them */ for (header = event->headers; header; header = header->next) { - if (switch_core_hash_delete(hash, header->value) == SWITCH_STATUS_SUCCESS) { + if (switch_core_hash_delete(hash, header->value)) { status = SWITCH_STATUS_SUCCESS; } } @@ -234,6 +232,40 @@ SWITCH_DECLARE(void) switch_core_hash_this(switch_hash_index_t *hi, const void * } +SWITCH_DECLARE(switch_status_t) switch_core_inthash_init(switch_inthash_t **hash) +{ + return switch_create_hashtable(hash, 16, switch_hash_default_int, switch_hash_equalkeys_int); +} + +SWITCH_DECLARE(switch_status_t) switch_core_inthash_destroy(switch_inthash_t **hash) +{ + switch_hashtable_destroy(hash); + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_DECLARE(switch_status_t) switch_core_inthash_insert(switch_inthash_t *hash, uint32_t key, const void *data) +{ + uint32_t *k = NULL; + + switch_zmalloc(k, sizeof(k)); + *k = key; + switch_hashtable_insert_destructor(hash, k, (void *)data, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_DUP_CHECK, NULL); + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_DECLARE(void *) switch_core_inthash_delete(switch_inthash_t *hash, uint32_t key) +{ + return switch_hashtable_remove(hash, (void *)&key); +} + +SWITCH_DECLARE(void *) switch_core_inthash_find(switch_inthash_t *hash, uint32_t key) +{ + return switch_hashtable_search(hash, (void *)&key); +} + + /* For Emacs: * Local Variables: * mode:c diff --git a/src/switch_ivr.c b/src/switch_ivr.c index 17289cec2e..3abdb40e81 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -2065,7 +2065,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_del_event(switch_ switch_status_t status = SWITCH_STATUS_FALSE; if (parser != NULL && digits != NULL && *digits) { - status = switch_core_hash_delete(parser->hash, digits); + status = switch_core_hash_delete(parser->hash, digits) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; } if (status != SWITCH_STATUS_SUCCESS) {