mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-07-14 11:06:36 +00:00
FS-7500: add switch_inthash variety of hash that can key on int
This commit is contained in:
parent
287a6c3cb4
commit
836e2b2888
@ -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);
|
||||||
|
|
||||||
///\}
|
///\}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user