FS-7500: add switch_inthash variety of hash that can key on int

This commit is contained in:
Anthony Minessale 2015-01-09 13:35:42 -06:00 committed by Michael Jerris
parent 287a6c3cb4
commit 836e2b2888
6 changed files with 62 additions and 10 deletions

View File

@ -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 \brief Delete data from a hash based on desired key
\param hash the hash to delete from \param hash the hash to delete from
\param key the key from which to delete the data \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 \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); 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);
///\} ///\}

View File

@ -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(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); 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) static inline int switch_hash_equalkeys(void *k1, void *k2)
{ {
return strcmp((char *) k1, (char *) k2) ? 0 : 1; return strcmp((char *) k1, (char *) k2) ? 0 : 1;

View File

@ -735,6 +735,7 @@ typedef enum {
SWITCH_RTP_FLAG_PLI, SWITCH_RTP_FLAG_PLI,
SWITCH_RTP_FLAG_RESET, SWITCH_RTP_FLAG_RESET,
SWITCH_RTP_FLAG_MUTE, SWITCH_RTP_FLAG_MUTE,
SWITCH_RTP_FLAG_NACK,
SWITCH_RTP_FLAG_INVALID SWITCH_RTP_FLAG_INVALID
} switch_rtp_flag_t; } 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;
struct switch_hashtable_iterator; struct switch_hashtable_iterator;
typedef struct switch_hashtable switch_hash_t; typedef struct switch_hashtable switch_hash_t;
typedef struct switch_hashtable switch_inthash_t;
typedef struct switch_hashtable_iterator switch_hash_index_t; typedef struct switch_hashtable_iterator switch_hash_index_t;
struct switch_network_list; struct switch_network_list;

View File

@ -2025,7 +2025,7 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session)
if (tech_pvt->profile->purge) { if (tech_pvt->profile->purge) {
mdl_profile_t *profile = tech_pvt->profile; 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); 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); 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); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile %s deleted successfully\n", profile->name);
} }
} }

View File

@ -92,11 +92,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_hash_insert_wrlock(switch_hash_t *ha
return SWITCH_STATUS_SUCCESS; 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_hashtable_remove(hash, (void *)key);
return SWITCH_STATUS_SUCCESS;
} }
SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_locked(switch_hash_t *hash, const char *key, switch_mutex_t *mutex) 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 */ /* now delete them */
for (header = event->headers; header; header = header->next) { 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; 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: /* For Emacs:
* Local Variables: * Local Variables:
* mode:c * mode:c

View File

@ -2065,7 +2065,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_del_event(switch_
switch_status_t status = SWITCH_STATUS_FALSE; switch_status_t status = SWITCH_STATUS_FALSE;
if (parser != NULL && digits != NULL && *digits) { 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) { if (status != SWITCH_STATUS_SUCCESS) {