#include "mimalloc.h"
#include "mimalloc/internal.h"
#include "mimalloc/atomic.h"
#include "mimalloc/prim.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
static long mi_max_error_count = …;
static long mi_max_warning_count = …;
static void mi_add_stderr_output(void);
int mi_version(void) mi_attr_noexcept { … }
mi_init_t;
mi_option_desc_t;
#define MI_OPTION(opt) …
#define MI_OPTION_LEGACY(opt,legacy) …
static mi_option_desc_t options[_mi_option_last] = …;
static void mi_option_init(mi_option_desc_t* desc);
void _mi_options_init(void) { … }
mi_decl_nodiscard long mi_option_get(mi_option_t option) { … }
mi_decl_nodiscard long mi_option_get_clamp(mi_option_t option, long min, long max) { … }
mi_decl_nodiscard size_t mi_option_get_size(mi_option_t option) { … }
void mi_option_set(mi_option_t option, long value) { … }
void mi_option_set_default(mi_option_t option, long value) { … }
mi_decl_nodiscard bool mi_option_is_enabled(mi_option_t option) { … }
void mi_option_set_enabled(mi_option_t option, bool enable) { … }
void mi_option_set_enabled_default(mi_option_t option, bool enable) { … }
void mi_option_enable(mi_option_t option) { … }
void mi_option_disable(mi_option_t option) { … }
static void mi_cdecl mi_out_stderr(const char* msg, void* arg) { … }
#ifndef MI_MAX_DELAY_OUTPUT
#define MI_MAX_DELAY_OUTPUT …
#endif
static char out_buf[MI_MAX_DELAY_OUTPUT+1];
static _Atomic(size_t) out_len;
static void mi_cdecl mi_out_buf(const char* msg, void* arg) { … }
static void mi_out_buf_flush(mi_output_fun* out, bool no_more_buf, void* arg) { … }
static void mi_cdecl mi_out_buf_stderr(const char* msg, void* arg) { … }
static mi_output_fun* volatile mi_out_default;
static _Atomic(void*) mi_out_arg;
static mi_output_fun* mi_out_get_default(void** parg) { … }
void mi_register_output(mi_output_fun* out, void* arg) mi_attr_noexcept { … }
static void mi_add_stderr_output(void) { … }
static _Atomic(size_t) error_count;
static _Atomic(size_t) warning_count;
static mi_decl_thread bool recurse = …;
static mi_decl_noinline bool mi_recurse_enter_prim(void) { … }
static mi_decl_noinline void mi_recurse_exit_prim(void) { … }
static bool mi_recurse_enter(void) { … }
static void mi_recurse_exit(void) { … }
void _mi_fputs(mi_output_fun* out, void* arg, const char* prefix, const char* message) { … }
static void mi_vfprintf( mi_output_fun* out, void* arg, const char* prefix, const char* fmt, va_list args ) { … }
void _mi_fprintf( mi_output_fun* out, void* arg, const char* fmt, ... ) { … }
static void mi_vfprintf_thread(mi_output_fun* out, void* arg, const char* prefix, const char* fmt, va_list args) { … }
void _mi_trace_message(const char* fmt, ...) { … }
void _mi_verbose_message(const char* fmt, ...) { … }
static void mi_show_error_message(const char* fmt, va_list args) { … }
void _mi_warning_message(const char* fmt, ...) { … }
#if MI_DEBUG
void _mi_assert_fail(const char* assertion, const char* fname, unsigned line, const char* func ) {
_mi_fprintf(NULL, NULL, "mimalloc: assertion failed: at \"%s\":%u, %s\n assertion: \"%s\"\n", fname, line, (func==NULL?"":func), assertion);
abort();
}
#endif
static mi_error_fun* volatile mi_error_handler;
static _Atomic(void*) mi_error_arg;
static void mi_error_default(int err) { … }
void mi_register_error(mi_error_fun* fun, void* arg) { … }
void _mi_error_message(int err, const char* fmt, ...) { … }
char _mi_toupper(char c) { … }
int _mi_strnicmp(const char* s, const char* t, size_t n) { … }
void _mi_strlcpy(char* dest, const char* src, size_t dest_size) { … }
void _mi_strlcat(char* dest, const char* src, size_t dest_size) { … }
size_t _mi_strlen(const char* s) { … }
size_t _mi_strnlen(const char* s, size_t max_len) { … }
#ifdef MI_NO_GETENV
static bool mi_getenv(const char* name, char* result, size_t result_size) {
MI_UNUSED(name);
MI_UNUSED(result);
MI_UNUSED(result_size);
return false;
}
#else
static bool mi_getenv(const char* name, char* result, size_t result_size) { … }
#endif
#include <stdlib.h>
#include <string.h>
static void mi_option_init(mi_option_desc_t* desc) { … }