#pragma once
#ifndef MIMALLOC_STATS_H
#define MIMALLOC_STATS_H
#include <mimalloc.h>
#include <stdint.h>
#define MI_STAT_VERSION 1
typedef struct mi_stat_count_s {
int64_t total; int64_t peak; int64_t current; } mi_stat_count_t;
typedef struct mi_stat_counter_s {
int64_t total; } mi_stat_counter_t;
#define MI_STAT_FIELDS() \
MI_STAT_COUNT(pages) \
MI_STAT_COUNT(reserved) \
MI_STAT_COUNT(committed) \
MI_STAT_COUNT(reset) \
MI_STAT_COUNT(purged) \
MI_STAT_COUNT(page_committed) \
MI_STAT_COUNT(pages_abandoned) \
MI_STAT_COUNT(threads) \
MI_STAT_COUNT(malloc_normal) \
MI_STAT_COUNT(malloc_huge) \
MI_STAT_COUNT(malloc_requested) \
\
MI_STAT_COUNTER(mmap_calls) \
MI_STAT_COUNTER(commit_calls) \
MI_STAT_COUNTER(reset_calls) \
MI_STAT_COUNTER(purge_calls) \
MI_STAT_COUNTER(arena_count) \
MI_STAT_COUNTER(malloc_normal_count) \
MI_STAT_COUNTER(malloc_huge_count) \
MI_STAT_COUNTER(malloc_guarded_count) \
\
\
MI_STAT_COUNTER(arena_rollback_count) \
MI_STAT_COUNTER(arena_purges) \
MI_STAT_COUNTER(pages_extended) \
MI_STAT_COUNTER(pages_retire) \
MI_STAT_COUNTER(page_searches) \
\
MI_STAT_COUNT(segments) \
MI_STAT_COUNT(segments_abandoned) \
MI_STAT_COUNT(segments_cache) \
MI_STAT_COUNT(_segments_reserved) \
\
MI_STAT_COUNTER(pages_reclaim_on_alloc) \
MI_STAT_COUNTER(pages_reclaim_on_free) \
MI_STAT_COUNTER(pages_reabandon_full) \
MI_STAT_COUNTER(pages_unabandon_busy_wait) \
typedef enum mi_chunkbin_e {
MI_CBIN_NONE, MI_CBIN_SMALL, MI_CBIN_OTHER, MI_CBIN_MEDIUM, MI_CBIN_LARGE, MI_CBIN_COUNT
} mi_chunkbin_t;
#define MI_BIN_HUGE (73U)
#define MI_STAT_COUNT(stat) mi_stat_count_t stat;
#define MI_STAT_COUNTER(stat) mi_stat_counter_t stat;
typedef struct mi_stats_s
{
int version;
MI_STAT_FIELDS()
mi_stat_count_t _stat_reserved[4];
mi_stat_counter_t _stat_counter_reserved[4];
mi_stat_count_t malloc_bins[MI_BIN_HUGE+1]; mi_stat_count_t page_bins[MI_BIN_HUGE+1]; mi_stat_count_t chunk_bins[MI_CBIN_COUNT]; } mi_stats_t;
#undef MI_STAT_COUNT
#undef MI_STAT_COUNTER
#ifdef __cplusplus
extern "C" {
#endif
mi_decl_export void mi_stats_get( size_t stats_size, mi_stats_t* stats ) mi_attr_noexcept;
mi_decl_export char* mi_stats_get_json( size_t buf_size, char* buf ) mi_attr_noexcept; mi_decl_export size_t mi_stats_get_bin_size(size_t bin) mi_attr_noexcept;
#ifdef __cplusplus
}
#endif
#endif