#![allow(non_camel_case_types)]
use std::ffi::{c_int, c_long, c_void};
pub type mi_arena_id_t = *mut c_void;
pub type mi_option_t = c_int;
#[repr(C)]
#[derive(Clone, Copy)]
pub struct mi_stat_count_t {
pub total: i64,
pub peak: i64,
pub current: i64,
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct mi_stat_counter_t {
pub total: i64,
}
pub const MI_STAT_VERSION: usize = 5;
pub const MI_BIN_HUGE: usize = 73;
pub const MI_CBIN_COUNT: usize = 6;
macro_rules! mi_stats {
($($kind:ident $field:ident,)*) => {
#[repr(C, align(8))]
pub struct mi_stats_t {
pub size: usize,
pub version: usize,
$(pub $field: $kind,)*
pub _stat_reserved: [mi_stat_count_t; 4],
pub _stat_counter_reserved: [mi_stat_counter_t; 4],
pub malloc_bins: [mi_stat_count_t; MI_BIN_HUGE + 1],
pub page_bins: [mi_stat_count_t; MI_BIN_HUGE + 1],
pub chunk_bins: [mi_stat_count_t; MI_CBIN_COUNT],
}
#[cfg(test)]
pub const STAT_FIELDS: &[(&str, &str)] = &[$((stringify!($kind), stringify!($field)),)*];
};
}
mi_stats! {
mi_stat_count_t pages,
mi_stat_count_t reserved,
mi_stat_count_t committed,
mi_stat_counter_t reset,
mi_stat_counter_t purged,
mi_stat_count_t page_committed,
mi_stat_count_t pages_abandoned,
mi_stat_count_t threads,
mi_stat_count_t malloc_normal,
mi_stat_count_t malloc_huge,
mi_stat_counter_t malloc_requested,
mi_stat_counter_t mmap_calls,
mi_stat_counter_t commit_calls,
mi_stat_counter_t reset_calls,
mi_stat_counter_t purge_calls,
mi_stat_counter_t arena_count,
mi_stat_counter_t malloc_normal_count,
mi_stat_counter_t malloc_huge_count,
mi_stat_counter_t malloc_guarded_count,
mi_stat_counter_t arena_rollback_count,
mi_stat_counter_t arena_purges,
mi_stat_counter_t pages_extended,
mi_stat_counter_t pages_retire,
mi_stat_counter_t page_searches,
mi_stat_counter_t page_searches_count,
mi_stat_count_t segments,
mi_stat_count_t segments_abandoned,
mi_stat_count_t segments_cache,
mi_stat_count_t _segments_reserved,
mi_stat_count_t heaps,
mi_stat_count_t theaps,
mi_stat_count_t pages_os_abandoned,
mi_stat_count_t pages_os_allocated,
mi_stat_counter_t pages_reclaim_on_alloc,
mi_stat_counter_t pages_reclaim_on_free,
mi_stat_counter_t pages_reabandon_full,
mi_stat_counter_t pages_unabandon_busy_wait,
mi_stat_counter_t heaps_delete_wait,
mi_stat_counter_t pages_stat_updates,
mi_stat_counter_t pages_stat_update_count,
mi_stat_counter_t profile_samples,
}
unsafe extern "C" {
pub safe fn mi_malloc(size: usize) -> *mut c_void;
pub safe fn mi_zalloc(size: usize) -> *mut c_void;
pub fn mi_realloc(p: *mut c_void, newsize: usize) -> *mut c_void;
pub safe fn mi_malloc_aligned(size: usize, alignment: usize) -> *mut c_void;
pub safe fn mi_zalloc_aligned(size: usize, alignment: usize) -> *mut c_void;
pub fn mi_realloc_aligned(p: *mut c_void, newsize: usize, alignment: usize) -> *mut c_void;
pub fn mi_free_size_aligned(p: *mut c_void, size: usize, alignment: usize);
pub safe fn mi_good_size(size: usize) -> usize;
pub safe fn mi_is_in_heap_region(p: *const c_void) -> bool;
pub safe fn mi_version() -> c_int;
pub safe fn mi_process_init();
pub safe fn mi_arena_min_alignment() -> usize;
pub safe fn mi_arena_min_size() -> usize;
pub safe fn mi_arena_max_object_size() -> usize;
pub safe fn mi_option_get(option: mi_option_t) -> c_long;
pub fn mi_option_set(option: mi_option_t, value: c_long);
pub fn mi_reserve_os_memory_ex(
size: usize,
commit: bool,
allow_large: bool,
exclusive: bool,
arena_id: *mut mi_arena_id_t,
) -> c_int;
pub fn mi_manage_os_memory_ex(
start: *mut c_void,
size: usize,
is_committed: bool,
is_pinned: bool,
is_zero: bool,
numa_node: c_int,
exclusive: bool,
arena_id: *mut mi_arena_id_t,
) -> bool;
pub fn mi_stats_get(stats: *mut mi_stats_t) -> bool;
}