vppinfra: add STATIC_ASSERT macro 49/3649/2
authorDamjan Marion <[email protected]>
Tue, 1 Nov 2016 14:16:30 +0000 (15:16 +0100)
committerDave Barach <[email protected]>
Tue, 1 Nov 2016 16:19:13 +0000 (16:19 +0000)
Change-Id: Icc4e74ae1627c5b97746ed64955a3dc089e3998f
Signed-off-by: Damjan Marion <[email protected]>
vlib/vlib/node.c
vnet/vnet/devices/dpdk/init.c
vnet/vnet/ip/lookup.c
vppinfra/vppinfra/error_bootstrap.h

index fccc37a..23f7ea0 100644 (file)
@@ -433,7 +433,8 @@ register_node (vlib_main_t * vm, vlib_node_registration_t * r)
     for (i = 0; i < vec_len (rt->errors); i++)
       rt->errors[i] = vlib_error_set (n->index, i);
 
-    ASSERT (sizeof (vlib_node_runtime_t) == 2 * CLIB_CACHE_LINE_BYTES);
+    STATIC_ASSERT (sizeof (vlib_node_runtime_t) == 2 * CLIB_CACHE_LINE_BYTES,
+                  "Size of vlib_node_runtime_t must be equal to 2 cachelines");
     ASSERT (vec_len (n->runtime_data) <= sizeof (vlib_node_runtime_t) -
            STRUCT_OFFSET_OF (vlib_node_runtime_t, runtime_data));
 
index c57fcde..01bd27d 100644 (file)
@@ -1707,10 +1707,15 @@ dpdk_init (vlib_main_t * vm)
   vlib_thread_main_t *tm = vlib_get_thread_main ();
 
   /* verify that structs are cacheline aligned */
-  ASSERT (offsetof (dpdk_device_t, cacheline0) == 0);
-  ASSERT (offsetof (dpdk_device_t, cacheline1) == CLIB_CACHE_LINE_BYTES);
-  ASSERT (offsetof (dpdk_worker_t, cacheline0) == 0);
-  ASSERT (offsetof (frame_queue_trace_t, cacheline0) == 0);
+  STATIC_ASSERT (offsetof (dpdk_device_t, cacheline0) == 0,
+                "Cache line marker must be 1st element in dpdk_device_t");
+  STATIC_ASSERT (offsetof (dpdk_device_t, cacheline1) ==
+                CLIB_CACHE_LINE_BYTES,
+                "Data in cache line 0 is bigger than cache line size");
+  STATIC_ASSERT (offsetof (dpdk_worker_t, cacheline0) == 0,
+                "Cache line marker must be 1st element in dpdk_worker_t");
+  STATIC_ASSERT (offsetof (frame_queue_trace_t, cacheline0) == 0,
+                "Cache line marker must be 1st element in frame_queue_trace_t");
 
   dm->vlib_main = vm;
   dm->vnet_main = vnet_get_main ();
index 4ddbb54..511a5cc 100644 (file)
@@ -165,8 +165,10 @@ ip_interface_address_add_del (ip_lookup_main_t * lm,
 void ip_lookup_init (ip_lookup_main_t * lm, u32 is_ip6)
 {
   /* ensure that adjacency is cacheline aligned and sized */
-  ASSERT(STRUCT_OFFSET_OF(ip_adjacency_t, cacheline0) == 0);
-  ASSERT(STRUCT_OFFSET_OF(ip_adjacency_t, cacheline1) == CLIB_CACHE_LINE_BYTES);
+  STATIC_ASSERT(STRUCT_OFFSET_OF(ip_adjacency_t, cacheline0) == 0,
+               "Cache line marker must be 1st element in struct");
+  STATIC_ASSERT(STRUCT_OFFSET_OF(ip_adjacency_t, cacheline1) == CLIB_CACHE_LINE_BYTES,
+               "Data in cache line 0 is bigger than cache line size");
 
   /* Preallocate three "special" adjacencies */
   lm->adjacency_heap = adj_pool;
index 3fa0a18..ad60062 100644 (file)
@@ -79,6 +79,8 @@ do {                                                  \
     }                                                  \
 } while (0)
 
+#define STATIC_ASSERT(truth,...) _Static_assert(truth, __VA_ARGS__)
+
 /* Assert without allocating memory. */
 #define ASSERT_AND_PANIC(truth)                        \
 do {                                           \