VPP API: Memory trace
[vpp.git] / src / vppinfra / hash.h
index 6206dd2..de155e6 100644 (file)
@@ -77,6 +77,7 @@ typedef struct hash_header
 #define KEY_FUNC_POINTER_UWORD (1)     /*< sum = *(uword *) key */
 #define KEY_FUNC_POINTER_U32   (2)     /*< sum = *(u32 *) key */
 #define KEY_FUNC_STRING         (3)    /*< sum = string_key_sum, etc. */
+#define KEY_FUNC_MEM           (4)     /*< sum = mem_key_sum */
 
   /* key comparison function */
   hash_key_equal_function_t *key_equal;
@@ -294,10 +295,12 @@ always_inline void
 hash_unset_mem_free (uword ** h, void *key)
 {
   hash_pair_t *hp = hash_get_pair_mem (*h, key);
-  ASSERT (hp);
-  key = uword_to_pointer (hp->key, void *);
-  hash_unset_mem (*h, key);
-  clib_mem_free (key);
+  if (PREDICT_TRUE (hp != NULL))
+    {
+      key = uword_to_pointer (hp->key, void *);
+      hash_unset_mem (*h, key);
+      clib_mem_free (key);
+    }
 }
 
 /* internal routine to free a hash table */
@@ -670,6 +673,20 @@ extern uword string_key_sum (hash_t * h, uword key);
 extern uword string_key_equal (hash_t * h, uword key1, uword key2);
 extern u8 *string_key_format_pair (u8 * s, va_list * args);
 
+/*
+ * Note: if you plan to put a hash into shared memory,
+ * the key sum and key equal functions MUST be set to magic constants!
+ * PIC means that whichever process sets up the hash won't have
+ * the actual key sum functions at the same place, leading to
+ * very hard-to-find bugs...
+ */
+
+#define hash_create_shmem(elts,key_bytes,value_bytes)           \
+  hash_create2((elts),(key_bytes),(value_bytes),                \
+               (hash_key_sum_function_t *) KEY_FUNC_MEM,        \
+               (hash_key_equal_function_t *)KEY_FUNC_MEM,       \
+               0, 0)
+
 #define hash_create_string(elts,value_bytes)                    \
   hash_create2((elts),0,(value_bytes),                          \
                (hash_key_sum_function_t *) KEY_FUNC_STRING,     \