vppinfra: add bihash_init2 20/21720/2
authorDave Barach <dave@barachs.net>
Tue, 3 Sep 2019 14:57:19 +0000 (10:57 -0400)
committerFlorin Coras <florin.coras@gmail.com>
Tue, 3 Sep 2019 16:00:08 +0000 (16:00 +0000)
Add controls to list / not list a specific bihash in clib_all_bihashes,
to immediately initialize a bihash.

clib_bihash_init2 is now the primary API. It takes a typical args_t
structure. clib_bihash_init becomes a compatibility widget. It
fabricates an args_t and calls init2...

Type: refactor
Ticket: VPP-1758

Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: Ib3e1304884997cf7025af20bdc67a7dda290f15b

src/vppinfra/bihash_template.c
src/vppinfra/bihash_template.h

index 4ef32ef..97c4cd0 100644 (file)
@@ -46,18 +46,21 @@ void BV (clib_bihash_instantiate) (BVT (clib_bihash) * h)
   h->instantiated = 1;
 }
 
-void BV (clib_bihash_init)
-  (BVT (clib_bihash) * h, char *name, u32 nbuckets, uword memory_size)
+void BV (clib_bihash_init2) (BVT (clib_bihash_init2_args) * a)
 {
   int i;
   void *oldheap;
-  nbuckets = 1 << (max_log2 (nbuckets));
+  BVT (clib_bihash) * h = a->h;
 
-  h->name = (u8 *) name;
-  h->nbuckets = nbuckets;
-  h->log2_nbuckets = max_log2 (nbuckets);
-  h->memory_size = memory_size;
+  a->nbuckets = 1 << (max_log2 (a->nbuckets));
+
+  h->name = (u8 *) a->name;
+  h->nbuckets = a->nbuckets;
+  h->log2_nbuckets = max_log2 (a->nbuckets);
+  h->memory_size = a->memory_size;
   h->instantiated = 0;
+  h->fmt_fn = a->fmt_fn;
+
   alloc_arena (h) = 0;
 
   /*
@@ -66,19 +69,22 @@ void BV (clib_bihash_init)
    * If someone starts complaining that's not enough, we can shift
    * the offset by CLIB_LOG2_CACHE_LINE_BYTES...
    */
-  ASSERT (memory_size < (1ULL << BIHASH_BUCKET_OFFSET_BITS));
-  h->fmt_fn = NULL;
+  ASSERT (h->memory_size < (1ULL << BIHASH_BUCKET_OFFSET_BITS));
 
   /* Add this hash table to the list */
-  for (i = 0; i < vec_len (clib_all_bihashes); i++)
-    if (clib_all_bihashes[i] == h)
-      return;
-
-  /* Unfortunately, the heap push/pop is required.... */
-  oldheap = clib_all_bihash_set_heap ();
-  vec_add1 (clib_all_bihashes, (void *) h);
-  clib_mem_set_heap (oldheap);
+  if (a->dont_add_to_all_bihash_list == 0)
+    {
+      for (i = 0; i < vec_len (clib_all_bihashes); i++)
+       if (clib_all_bihashes[i] == h)
+         goto do_lock;
+      oldheap = clib_all_bihash_set_heap ();
+      vec_add1 (clib_all_bihashes, (void *) h);
+      clib_mem_set_heap (oldheap);
+    }
 
+do_lock:
+  if (h->alloc_lock)
+    clib_mem_free ((void *) h->alloc_lock);
 
   /*
    * Set up the lock now, so we can use it to make the first add
@@ -88,9 +94,23 @@ void BV (clib_bihash_init)
                                          CLIB_CACHE_LINE_BYTES);
   h->alloc_lock[0] = 0;
 
-#if BIHASH_INSTANTIATE_IMMEDIATELY
-  BV (clib_bihash_instantiate) (h);
-#endif
+  if (a->instantiate_immediately)
+    BV (clib_bihash_instantiate) (h);
+}
+
+void BV (clib_bihash_init)
+  (BVT (clib_bihash) * h, char *name, u32 nbuckets, uword memory_size)
+{
+  BVT (clib_bihash_init2_args) _a, *a = &_a;
+
+  memset (a, 0, sizeof (*a));
+
+  a->h = h;
+  a->name = name;
+  a->nbuckets = nbuckets;
+  a->memory_size = memory_size;
+
+  BV (clib_bihash_init2) (a);
 }
 
 #if BIHASH_32_64_SVM
index 0865c2b..ebd70c0 100644 (file)
@@ -159,6 +159,17 @@ BVS (clib_bihash)
 
 } BVT (clib_bihash);
 
+typedef struct
+{
+  BVT (clib_bihash) * h;
+  char *name;
+  u32 nbuckets;
+  uword memory_size;
+  format_function_t *fmt_fn;
+  u8 instantiate_immediately;
+  u8 dont_add_to_all_bihash_list;
+} BVT (clib_bihash_init2_args);
+
 extern void **clib_all_bihashes;
 
 #if BIHASH_32_64_SVM
@@ -291,6 +302,8 @@ static inline uword BV (clib_bihash_get_offset) (BVT (clib_bihash) * h,
 void BV (clib_bihash_init)
   (BVT (clib_bihash) * h, char *name, u32 nbuckets, uword memory_size);
 
+void BV (clib_bihash_init2) (BVT (clib_bihash_init2_args) * a);
+
 #if BIHASH_32_64_SVM
 void BV (clib_bihash_master_init_svm)
   (BVT (clib_bihash) * h, char *name, u32 nbuckets, u64 memory_size);