diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/vlib/counter.c | 28 | ||||
-rw-r--r-- | src/vlib/counter.h | 3 | ||||
-rw-r--r-- | src/vlib/stat_weak_inlines.h | 5 | ||||
-rw-r--r-- | src/vpp/stats/stat_segment.c | 39 |
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 */ |