]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7500: add switch_inthash variety of hash that can key on int
authorAnthony Minessale <anthm@freeswitch.org>
Fri, 9 Jan 2015 19:35:42 +0000 (13:35 -0600)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:46:53 +0000 (12:46 -0500)
src/include/switch_core.h
src/include/switch_hashtable.h
src/include/switch_types.h
src/mod/endpoints/mod_dingaling/mod_dingaling.c
src/switch_core_hash.c
src/switch_ivr.c

index 1d83cb364938e783213f8cd9e6dd99a007af1028..f234fb129fbaab282d2beea182f9987a60669f15 100644 (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
   \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);
 
 ///\}
 
index 1fdbeb9736baaf9f24b2a67f512227cda9a4ce41..20c18276bcb2f108dba595335814a42258fef4b0 100644 (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(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;
index d2aecbd7565954980e0e2b9d7bc37f8cb0bbb7fd..ecec0b850147674858e8d44c9476e67f05655388 100644 (file)
@@ -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;
index 1592def64434de544bd392199625cb9c61588cc2..05012fb3b5c33a23a86304d5c37e12932c99bfcb 100644 (file)
@@ -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);
                        }
                }
index ddf08c0c6c7d0c777aab11441a371a9a1258395c..e3f4aaf171dd20a83a3fde1ea417534241229463 100644 (file)
@@ -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
index 17289cec2e3e1a95e5b1ef2a8ba281eae954f676..3abdb40e81628ddbb1e08096b31a5ef757cc28bd 100644 (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;
 
        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) {