Add global counters for segments and allocation stats

This commit is contained in:
Sergiy Kuryata 2024-11-26 16:32:54 -08:00
parent 75eec9e61d
commit 0be44b2b0f
11 changed files with 304 additions and 7 deletions

View file

@ -373,6 +373,16 @@ mi_decl_nodiscard mi_decl_export size_t mi_option_get_size(mi_option_t option);
mi_decl_export void mi_option_set(mi_option_t option, long value);
mi_decl_export void mi_option_set_default(mi_option_t option, long value);
typedef struct mi_allocation_counter_s {
size_t counter;
size_t block_size; // size of the allocation block that related to this counter (for example, the block that caused a new segmented to be allocated)
} mi_allocation_counter_t;
mi_decl_export bool mi_get_segment_stats(size_t* abandoned, size_t* reclaimed, size_t* reclaim_failed, size_t* allocated, size_t* freed,
mi_allocation_counter_t* allocated_segments, int allocated_segments_count,
mi_allocation_counter_t* free_space_in_segments, int free_space_in_segments_count,
mi_allocation_counter_t* allocated_memory, int allocated_memory_count);
// -------------------------------------------------------------------------------------------------------
// "mi" prefixed implementations of various posix, Unix, Windows, and C++ allocation functions.

View file

@ -181,6 +181,7 @@ void _mi_page_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool o
bool _mi_page_try_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never);
size_t _mi_page_queue_append(mi_heap_t* heap, mi_page_queue_t* pq, mi_page_queue_t* append);
void _mi_deferred_free(mi_heap_t* heap, bool force);
mi_page_queue_t* mi_heap_page_queue_of(mi_heap_t* heap, const mi_page_t* page);
void _mi_page_free_collect(mi_page_t* page,bool force);
void _mi_page_reclaim(mi_heap_t* heap, mi_page_t* page); // callback from segments
@ -1017,5 +1018,11 @@ static inline void _mi_memzero_aligned(void* dst, size_t n) {
}
#endif
void mi_segment_increment_alloc_stats(size_t block_size);
void mi_segment_increment_freed_stats();
void mi_segment_increment_reclaimed_stats();
void mi_segment_increment_reclaim_failed_stats();
void mi_allocation_stats_increment(size_t block_size);
void mi_allocation_stats_decrement(size_t block_size);
#endif

View file

@ -503,6 +503,7 @@ typedef struct mi_page_queue_s {
mi_page_t* first;
mi_page_t* last;
size_t block_size;
size_t allocationCount;
} mi_page_queue_t;
#define MI_BIN_FULL (MI_BIN_HUGE+1)
@ -646,6 +647,18 @@ typedef struct mi_stats_s {
#endif
} mi_stats_t;
typedef struct mi_segment_alloc_counter_s {
_Atomic(size_t) counter;
size_t block_size; // size of the allocation block that caused a new segmented to be allocated)
} mi_segment_alloc_counter_t;
typedef struct mi_segment_stats_s {
_Atomic(size_t) reclaimed_count;
_Atomic(size_t) reclaim_failed_count;
_Atomic(size_t) allocated_count;
_Atomic(size_t) freed_count;
mi_segment_alloc_counter_t alloc_stats[MI_BIN_HUGE+1];
} mi_segment_stats_t;
void _mi_stat_increase(mi_stat_count_t* stat, size_t amount);
void _mi_stat_decrease(mi_stat_count_t* stat, size_t amount);