Fix load_unaligned undefined and other possible build failures
[vpp.git] / src / vppinfra / pool.h
index 62d5b54..0f64262 100644 (file)
@@ -190,6 +190,8 @@ do {                                                                    \
   pool_header_t * _pool_var (p) = pool_header (P);                      \
   uword _pool_var (l);                                                  \
                                                                         \
+  STATIC_ASSERT(A==0 || ((A % sizeof(P[0]))==0) || ((sizeof(P[0]) % A) == 0), \
+                "Pool aligned alloc of incorrectly sized object");      \
   _pool_var (l) = 0;                                                    \
   if (P)                                                                \
     _pool_var (l) = vec_len (_pool_var (p)->free_indices);              \
@@ -233,9 +235,10 @@ do {                                                                    \
   _pool_var (l) = 0;                                                    \
   if (P)                                                                \
     {                                                                   \
-    if (_pool_var (p)->max_elts)                                        \
-      return 0;                                                         \
-    _pool_var (l) = vec_len (_pool_var (p)->free_indices);              \
+      if (_pool_var (p)->max_elts)                                      \
+        _pool_var (l) = _pool_var (p)->max_elts;                       \
+      else                                                             \
+        _pool_var (l) = vec_len (_pool_var (p)->free_indices);          \
     }                                                                   \
                                                                         \
   /* Free elements, certainly won't expand */                           \
@@ -472,6 +475,9 @@ do {                                                                        \
     (_pool_var (rv) < vec_len (P) ?                                     \
      clib_bitmap_next_clear (_pool_var (p)->free_bitmap, _pool_var(rv)) \
      : ~0);                                                             \
+  _pool_var(rv) =                                                       \
+    (_pool_var (rv) < vec_len (P) ?                                     \
+     _pool_var (rv) : ~0);                                             \
   _pool_var(rv);                                                        \
 })