vppinfra: fix pool_free_elts 07/35607/5
authorFlorin Coras <fcoras@cisco.com>
Wed, 9 Mar 2022 21:34:12 +0000 (13:34 -0800)
committerFlorin Coras <fcoras@cisco.com>
Wed, 9 Mar 2022 22:03:48 +0000 (14:03 -0800)
Type: fix
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I3425350f5e874df79716bd726900540629793beb

src/vppinfra/pool.h

index 3b5a900..9dd05a3 100644 (file)
@@ -162,27 +162,26 @@ pool_header_bytes (void *v)
 /** Local variable naming macro. */
 #define _pool_var(v) _pool_##v
 
-/** Queries whether pool has at least N_FREE free elements. */
-always_inline uword
-pool_free_elts (void *v)
-{
-  pool_header_t *p = pool_header (v);
-  uword n_free = 0;
+/** Number of bytes that can fit into pool with current allocation */
+#define pool_capacity(P) vec_capacity (P, pool_aligned_header_bytes)
 
-  if (v)
-    {
-      n_free += vec_len (p->free_indices);
-
-      /*
-       * Space left at end of vector?
-       * Fixed-size pools have max_elts set non-zero,
-       */
-      if (p->max_elts == 0)
-       n_free += vec_capacity (v, sizeof (p[0])) - vec_len (v);
-    }
+/** Number of elements that can fit into pool with current allocation */
+#define pool_max_len(P) (pool_capacity (P) / sizeof (P[0]))
 
-  return n_free;
-}
+/** Number of free elements in pool */
+#define pool_free_elts(P)                                                     \
+  ({                                                                          \
+    pool_header_t *_pool_var (p) = pool_header (P);                           \
+    uword n_free = 0;                                                         \
+    if (P)                                                                    \
+      {                                                                       \
+       n_free += vec_len (_pool_var (p)->free_indices);                      \
+       /* Fixed-size pools have max_elts set non-zero */                     \
+       if (_pool_var (p)->max_elts == 0)                                     \
+         n_free += pool_max_len (P) - vec_len (P);                           \
+      }                                                                       \
+    n_free;                                                                   \
+  })
 
 /** Allocate an object E from a pool P (general version).