papi: Use CMSG_SPACE for sizing ancillary buffer space
[vpp.git] / src / vlib / stats / init.c
index d81916a..8b382da 100644 (file)
@@ -8,16 +8,25 @@
 
 #define STAT_SEGMENT_SOCKET_FILENAME "stats.sock"
 
+static u32 vlib_loops_stats_counter_index;
+
 static void
 vector_rate_collector_fn (vlib_stats_collector_data_t *d)
 {
   vlib_main_t *this_vlib_main;
-  counter_t **counters = d->entry->data;
-  counter_t *cb = counters[0];
+  counter_t **counters, **loops_counters;
+  counter_t *cb, *loops_cb;
   f64 vector_rate = 0.0;
   u32 i, n_threads = vlib_get_n_threads ();
 
-  vlib_stats_validate_counter_vector (d->entry_index, n_threads - 1);
+  vlib_stats_validate (d->entry_index, 0, n_threads - 1);
+  counters = d->entry->data;
+  cb = counters[0];
+
+  vlib_stats_validate (vlib_loops_stats_counter_index, 0, n_threads - 1);
+  loops_counters =
+    vlib_stats_get_entry_data_pointer (vlib_loops_stats_counter_index);
+  loops_cb = loops_counters[0];
 
   for (i = 0; i < n_threads; i++)
     {
@@ -26,9 +35,10 @@ vector_rate_collector_fn (vlib_stats_collector_data_t *d)
 
       this_vector_rate = vlib_internal_node_vector_rate (this_vlib_main);
       vlib_clear_internal_node_vector_rate (this_vlib_main);
-
       cb[i] = this_vector_rate;
       vector_rate += this_vector_rate;
+
+      loops_cb[i] = this_vlib_main->loops_per_second;
     }
 
   /* And set the system average rate */
@@ -43,7 +53,6 @@ vlib_stats_init (vlib_main_t *vm)
   vlib_stats_shared_header_t *shared_header;
   vlib_stats_collector_reg_t reg = {};
 
-  void *oldheap;
   uword memory_size, sys_page_sz;
   int mfd;
   char *mem_name = "stat segment";
@@ -88,17 +97,18 @@ vlib_stats_init (vlib_main_t *vm)
   shared_header->base = memaddr;
 
   sm->stat_segment_lockp = clib_mem_alloc (sizeof (clib_spinlock_t));
+  sm->locking_thread_index = ~0;
+  sm->n_locks = 0;
   clib_spinlock_init (sm->stat_segment_lockp);
 
-  oldheap = clib_mem_set_heap (sm->heap);
-
   /* Set up the name to counter-vector hash table */
-  sm->directory_vector = 0;
+  sm->directory_vector =
+    vec_new_heap (typeof (sm->directory_vector[0]), STAT_COUNTERS, heap);
+  sm->dir_vector_first_free_elt = CLIB_U32_MAX;
 
   shared_header->epoch = 1;
 
   /* Scalar stats and node counters */
-  vec_validate (sm->directory_vector, STAT_COUNTERS - 1);
 #define _(E, t, n, p)                                                         \
   strcpy (sm->directory_vector[STAT_COUNTER_##E].name, p "/" #n);             \
   sm->directory_vector[STAT_COUNTER_##E].type = STAT_DIR_TYPE_##t;
@@ -107,16 +117,18 @@ vlib_stats_init (vlib_main_t *vm)
     /* Save the vector in the shared segment, for clients */
     shared_header->directory_vector = sm->directory_vector;
 
-  clib_mem_set_heap (oldheap);
-
   vlib_stats_register_mem_heap (heap);
 
   reg.collect_fn = vector_rate_collector_fn;
   reg.private_data = vlib_stats_add_gauge ("/sys/vector_rate");
   reg.entry_index =
     vlib_stats_add_counter_vector ("/sys/vector_rate_per_worker");
+  vlib_loops_stats_counter_index =
+    vlib_stats_add_counter_vector ("/sys/loops_per_worker");
   vlib_stats_register_collector_fn (&reg);
-  vlib_stats_validate_counter_vector (reg.entry_index, vlib_get_n_threads ());
+  vlib_stats_validate (reg.entry_index, 0, vlib_get_n_threads ());
+  vlib_stats_validate (vlib_loops_stats_counter_index, 0,
+                      vlib_get_n_threads ());
 
   return 0;
 }