}
void
-vlib_stats_pop_heap (void *cm_arg, void *oldheap)
+vlib_stats_pop_heap (void *cm_arg, void *oldheap, stat_directory_type_t type)
{
vlib_simple_counter_main_t *cm = (vlib_simple_counter_main_t *) cm_arg;
stats_main_t *sm = &stats_main;
}
name_copy = format (0, "%s%c", stat_segment_name, 0);
ep = clib_mem_alloc (sizeof (*ep));
- ep->type = STAT_DIR_TYPE_COUNTER_VECTOR;
+ ep->type = type;
ep->value = cm->counters;
hash_set_mem (sm->counter_vector_by_name, name_copy, ep);
sm->input_rate_ptr = (scalar_data + 1);
sm->last_runtime_ptr = (scalar_data + 2);
sm->last_runtime_stats_clear_ptr = (scalar_data + 3);
+ sm->heartbeat_ptr = (scalar_data + 4);
name = format (0, "/sys/vector_rate%c", 0);
ep = clib_mem_alloc (sizeof (*ep));
hash_set_mem (sm->counter_vector_by_name, name, ep);
+ name = format (0, "/sys/heartbeat%c", 0);
+ ep = clib_mem_alloc (sizeof (*ep));
+ ep->type = STAT_DIR_TYPE_SCALAR_POINTER;
+ ep->value = sm->heartbeat_ptr;
+
+ hash_set_mem (sm->counter_vector_by_name, name, ep);
+
/* Publish the hash table */
shared_header->opaque[STAT_SEGMENT_OPAQUE_DIR] = sm->counter_vector_by_name;
type_name = "VectorPtr";
break;
- case STAT_DIR_TYPE_COUNTER_VECTOR:
+ case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
+ case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED:
type_name = "CMainPtr";
break;
if (sm->serialize_nodes)
update_serialized_nodes (sm);
+
+ /* Heartbeat, so clients detect we're still here */
+ (*sm->heartbeat_ptr)++;
}
static clib_error_t *