#pragma once
#ifndef MIMALLOC_STATS_H
#define MIMALLOC_STATS_H
#include <mimalloc.h>
#include <stdint.h>
#define MI_STAT_VERSION 3
#if defined(_MSC_VER)
#define mi_decl_align(a) __declspec(align(a))
#elif defined(__GNUC__)
#define mi_decl_align(a) __attribute__((aligned(a)))
#elif __cplusplus >= 201103L
#define mi_decl_align(a) alignas(a)
#else
#define mi_decl_align(a)
#endif
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_COUNT(heaps) \
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_SMALL, MI_CBIN_OTHER, MI_CBIN_MEDIUM, MI_CBIN_LARGE, MI_CBIN_HUGE, MI_CBIN_NONE, 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_decl_align(8) 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_heap_stats_get(mi_heap_t* heap, size_t stats_size, mi_stats_t* stats) mi_attr_noexcept;
mi_decl_export char* mi_heap_stats_get_json(mi_heap_t* heap, size_t buf_size, char* buf) mi_attr_noexcept; mi_decl_export void mi_heap_stats_print_out(mi_heap_t* heap, mi_output_fun* out, void* arg) mi_attr_noexcept;
mi_decl_export void mi_heap_stats_merge_to_subproc(mi_heap_t* heap);
mi_decl_export void mi_subproc_stats_get(mi_subproc_id_t subproc_id, size_t stats_size, mi_stats_t* stats) mi_attr_noexcept;
mi_decl_export char* mi_subproc_stats_get_json(mi_subproc_id_t subproc_id, size_t buf_size, char* buf) mi_attr_noexcept; mi_decl_export void mi_subproc_stats_print_out(mi_subproc_id_t subproc_id, mi_output_fun* out, void* arg) mi_attr_noexcept;
mi_decl_export void mi_subproc_heap_stats_print_out(mi_subproc_id_t subproc_id, mi_output_fun* out, void* arg) mi_attr_noexcept;
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 void mi_stats_print_out(mi_output_fun* out, void* arg) mi_attr_noexcept;
mi_decl_export size_t mi_stats_get_bin_size(size_t bin) mi_attr_noexcept;
#ifdef __cplusplus
}
#endif
#endif