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";
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;
/* 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;
vlib_stats_create_counter (vlib_stats_entry_t *e)
{
vlib_stats_segment_t *sm = vlib_stats_get_segment ();
- void *oldheap;
u32 index;
- oldheap = clib_mem_set_heap (sm->heap);
-
if (sm->dir_vector_first_free_elt != CLIB_U32_MAX)
{
index = sm->dir_vector_first_free_elt;
sm->directory_vector[index] = *e;
- clib_mem_set_heap (oldheap);
hash_set_str_key_alloc (&sm->directory_vector_by_name, e->name, index);
return index;
{
vlib_stats_segment_t *sm = vlib_stats_get_segment ();
vlib_stats_entry_t *e = vlib_stats_get_entry (sm, entry_index);
- void *oldheap;
counter_t **c;
vlib_counter_t **vc;
u32 i;
if (entry_index >= vec_len (sm->directory_vector))
return;
- oldheap = clib_mem_set_heap (sm->heap);
-
vlib_stats_segment_lock ();
switch (e->type)
vlib_stats_segment_unlock ();
- clib_mem_set_heap (oldheap);
hash_unset_str_key_free (&sm->directory_vector_by_name, e->name);
memset (e, 0, sizeof (*e));