summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/vlib/counter.c28
-rw-r--r--src/vlib/counter.h3
-rw-r--r--src/vlib/stat_weak_inlines.h5
-rw-r--r--src/vpp/stats/stat_segment.c39
4 files changed, 75 insertions, 0 deletions
diff --git a/src/vlib/counter.c b/src/vlib/counter.c
index 8573b794fd9..edba3754da4 100644
--- a/src/vlib/counter.c
+++ b/src/vlib/counter.c
@@ -91,6 +91,20 @@ vlib_validate_simple_counter (vlib_simple_counter_main_t * cm, u32 index)
}
void
+vlib_free_simple_counter (vlib_simple_counter_main_t * cm)
+{
+ int i;
+
+ vlib_stats_delete_cm (cm);
+
+ void *oldheap = vlib_stats_push_heap (cm->counters);
+ for (i = 0; i < vec_len (cm->counters); i++)
+ vec_free (cm->counters[i]);
+ vec_free (cm->counters);
+ clib_mem_set_heap (oldheap);
+}
+
+void
vlib_validate_combined_counter (vlib_combined_counter_main_t * cm, u32 index)
{
vlib_thread_main_t *tm = vlib_get_thread_main ();
@@ -105,6 +119,20 @@ vlib_validate_combined_counter (vlib_combined_counter_main_t * cm, u32 index)
3 /*STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED */ );
}
+void
+vlib_free_combined_counter (vlib_combined_counter_main_t * cm)
+{
+ int i;
+
+ vlib_stats_delete_cm (cm);
+
+ void *oldheap = vlib_stats_push_heap (cm->counters);
+ for (i = 0; i < vec_len (cm->counters); i++)
+ vec_free (cm->counters[i]);
+ vec_free (cm->counters);
+ clib_mem_set_heap (oldheap);
+}
+
u32
vlib_combined_counter_n_counters (const vlib_combined_counter_main_t * cm)
{
diff --git a/src/vlib/counter.h b/src/vlib/counter.h
index 292e137681e..7c9094727e2 100644
--- a/src/vlib/counter.h
+++ b/src/vlib/counter.h
@@ -304,6 +304,8 @@ vlib_zero_combined_counter (vlib_combined_counter_main_t * cm, u32 index)
void vlib_validate_simple_counter (vlib_simple_counter_main_t * cm,
u32 index);
+void vlib_free_simple_counter (vlib_simple_counter_main_t * cm);
+
/** validate a combined counter
@param cm - (vlib_combined_counter_main_t *) pointer to the counter
collection
@@ -312,6 +314,7 @@ void vlib_validate_simple_counter (vlib_simple_counter_main_t * cm,
void vlib_validate_combined_counter (vlib_combined_counter_main_t * cm,
u32 index);
+void vlib_free_combined_counter (vlib_combined_counter_main_t * cm);
/** Obtain the number of simple or combined counters allocated.
A macro which reduces to to vec_len(cm->maxi), the answer in either
diff --git a/src/vlib/stat_weak_inlines.h b/src/vlib/stat_weak_inlines.h
index d288a04c477..a1311e864b3 100644
--- a/src/vlib/stat_weak_inlines.h
+++ b/src/vlib/stat_weak_inlines.h
@@ -57,5 +57,10 @@ void
vlib_stat_segment_unlock (void)
{
}
+void vlib_stats_delete_cm (void *) __attribute__ ((weak));
+void
+vlib_stats_delete_cm (void *notused)
+{
+}
#endif
diff --git a/src/vpp/stats/stat_segment.c b/src/vpp/stats/stat_segment.c
index 0e3fa415bb8..2152e1e0bfd 100644
--- a/src/vpp/stats/stat_segment.c
+++ b/src/vpp/stats/stat_segment.c
@@ -148,6 +148,44 @@ vlib_stats_delete_counter (u32 index, void *oldheap)
e->type = STAT_DIR_TYPE_EMPTY;
}
+/*
+ * Called from main heap
+ */
+void
+vlib_stats_delete_cm (void *cm_arg)
+{
+ vlib_simple_counter_main_t *cm = (vlib_simple_counter_main_t *) cm_arg;
+ stat_segment_main_t *sm = &stat_segment_main;
+ stat_segment_directory_entry_t *e;
+ stat_segment_shared_header_t *shared_header = sm->shared_header;
+
+ /* Not all counters have names / hash-table entries */
+ if (!cm->name && !cm->stat_segment_name)
+ {
+ return;
+ }
+ vlib_stat_segment_lock ();
+
+ /* Lookup hash-table is on the main heap */
+ char *stat_segment_name =
+ cm->stat_segment_name ? cm->stat_segment_name : cm->name;
+ u32 index = lookup_hash_index ((u8 *) stat_segment_name);
+
+ e = &sm->directory_vector[index];
+ hash_unset (sm->directory_vector_by_name, &e->name);
+
+ u64 *offset_vector = stat_segment_pointer (shared_header, e->offset_vector);
+
+ void *oldheap = clib_mem_set_heap (sm->heap); /* Enter stats segment */
+ vec_free (offset_vector);
+ clib_mem_set_heap (oldheap); /* Exit stats segment */
+
+ memset (e, 0, sizeof (*e));
+ e->type = STAT_DIR_TYPE_EMPTY;
+
+ vlib_stat_segment_unlock ();
+}
+
void
vlib_stats_pop_heap (void *cm_arg, void *oldheap, u32 cindex,
stat_directory_type_t type)
@@ -172,6 +210,7 @@ vlib_stats_pop_heap (void *cm_arg, void *oldheap, u32 cindex,
/* Lookup hash-table is on the main heap */
stat_segment_name =
cm->stat_segment_name ? cm->stat_segment_name : cm->name;
+
clib_mem_set_heap (oldheap); /* Exit stats segment */
u32 vector_index = lookup_hash_index ((u8 *) stat_segment_name);
/* Back to stats segment */