stats: enable/disable segments polls
[vpp.git] / src / vpp / stats / stat_segment.c
index 1ca9f5b..cebd5e3 100644 (file)
@@ -780,9 +780,10 @@ do_stat_segment_updates (vlib_main_t *vm, stat_segment_main_t *sm)
   /* *INDENT-OFF* */
   stat_segment_gauges_pool_t *g;
   pool_foreach (g, sm->gauges)
-   {
-    g->fn(&sm->directory_vector[g->directory_index], g->caller_index);
-  }
+    {
+      if (g->enabled)
+       g->fn (&sm->directory_vector[g->directory_index], g->caller_index);
+    }
   /* *INDENT-ON* */
 
   /* Heartbeat, so clients detect we're still here */
@@ -880,9 +881,9 @@ stat_segment_collector_process (vlib_main_t * vm, vlib_node_runtime_t * rt,
  * Add a data provider (via callback) for a given stats entry.
  * TODO: Add support for per-provider interval.
  */
-void
+uword
 stat_segment_poll_add (u32 vector_index, stat_segment_update_fn update_fn,
-                      u32 caller_index, u32 interval)
+                      u32 caller_index, u32 interval, u8 enabled)
 {
   stat_segment_main_t *sm = &stat_segment_main;
   stat_segment_gauges_pool_t *gauge;
@@ -891,8 +892,23 @@ stat_segment_poll_add (u32 vector_index, stat_segment_update_fn update_fn,
   gauge->fn = update_fn;
   gauge->caller_index = caller_index;
   gauge->directory_index = vector_index;
+  gauge->enabled = enabled;
+
+  return pool_elts (sm->gauges) - 1;
+}
+
+/*
+ * Enable (or disable) a callback for a stats entry
+ */
+void
+stat_segment_poll_state (uword index, u8 enabled)
+{
+  stat_segment_main_t *sm = &stat_segment_main;
+  stat_segment_gauges_pool_t *gauge = pool_elt_at_index (sm->gauges, index);
+
+  ASSERT (gauge);
 
-  return;
+  gauge->enabled = enabled;
 }
 
 /*
@@ -900,20 +916,14 @@ stat_segment_poll_add (u32 vector_index, stat_segment_update_fn update_fn,
  * Deprecated, replace with stat_segment_new_entry + stat_segment_pool_add
  */
 clib_error_t *
-stat_segment_register_gauge (u8 * name, stat_segment_update_fn update_fn,
+stat_segment_register_gauge (u8 *name, stat_segment_update_fn update_fn,
                             u32 caller_index)
 {
-  stat_segment_main_t *sm = &stat_segment_main;
-  stat_segment_gauges_pool_t *gauge;
-
   u32 vector_index = stat_segment_new_entry (name, STAT_DIR_TYPE_SCALAR_INDEX);
   if (vector_index == ~0) /* Already registered */
     return clib_error_return (0, "%v is already registered", name);
 
-  pool_get (sm->gauges, gauge);
-  gauge->fn = update_fn;
-  gauge->caller_index = caller_index;
-  gauge->directory_index = vector_index;
+  stat_segment_poll_add (vector_index, update_fn, caller_index, -1, true);
 
   return NULL;
 }