#pragma once
#ifndef MIMALLOC_STATS_H
#define MIMALLOC_STATS_H
#include <mimalloc.h>
#include <stdint.h>
#define MI_STAT_VERSION 4
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_COUNTER(reset) \
MI_STAT_COUNTER(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_COUNTER(page_searches_count) \
\
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) \
#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
{
size_t size; size_t 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_stats_t;
#undef MI_STAT_COUNT
#undef MI_STAT_COUNTER
#define mi_stats_t_decl(name) mi_stats_t name = { 0 }; name.size = sizeof(mi_stats_t); name.version = MI_STAT_VERSION;
#ifdef __cplusplus
extern "C" {
#endif
mi_decl_export bool mi_stats_get( mi_stats_t* stats ) mi_attr_noexcept;
mi_decl_export char* mi_stats_get_json( size_t buf_size, char* buf ) mi_attr_noexcept;
#ifdef __cplusplus
}
#endif
#endif