From f34602d8853945f548d1b033cb25252abb96710f Mon Sep 17 00:00:00 2001 From: Eduard Voronkin Date: Fri, 11 Sep 2026 21:45:11 -0700 Subject: [PATCH 1/2] add custom allocation tracking hooks --- CMakeLists.txt | 7 +++++-- include/mimalloc.h | 5 +++++ include/mimalloc/track.h | 10 ++++++++++ include/mimalloc/types.h | 1 + 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c8942709f..7be7de11d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,8 +23,8 @@ set_property(CACHE MI_OPT_ARCH PROPERTY STRINGS "OFF" "ON" "avx2" "armv8.1" "arm set(MI_DEBUG "DEFAULT" CACHE STRING "Enable assertion checks: OFF, ON, INTERNAL, FULL, DEFAULT. INTERNAL adds extra internal invariant checks, while FULL adds expensive heap invariant checks") set_property(CACHE MI_DEBUG PROPERTY STRINGS "OFF" "ON" "INTERNAL" "FULL" "DEFAULT") -set(MI_TRACK "OFF" CACHE STRING "Enable tracking: OFF, ASAN (address sanitizer), VALGRIND, ETW (Windows event tracing). Adds a small overhead.") -set_property(CACHE MI_TRACK PROPERTY STRINGS "OFF" "ASAN" "VALGRIND" "ETW") +set(MI_TRACK "OFF" CACHE STRING "Enable tracking: OFF, ASAN (address sanitizer), VALGRIND, ETW (Windows event tracing), CUSTOM (application-defined hooks). Adds a small overhead.") +set_property(CACHE MI_TRACK PROPERTY STRINGS "OFF" "ASAN" "VALGRIND" "ETW" "CUSTOM") set(MI_STATS "DEFAULT" CACHE STRING "Enable statistics.") set_property(CACHE MI_STATS PROPERTY STRINGS "OFF" "ON" "FULL" "DEFAULT") @@ -385,6 +385,9 @@ elseif(MI_TRACK STREQUAL "ETW") message(STATUS "Compile with Windows event tracing support (MI_TRACK=ETW)") list(APPEND mi_defines MI_TRACK_ETW=1) endif() +elseif(MI_TRACK STREQUAL "CUSTOM") + message(STATUS "Compile with custom allocation hooks (MI_TRACK=CUSTOM)") + list(APPEND mi_defines MI_TRACK_CUSTOM=1) elseif(MI_TRACK) message(STATUS "Invalid option value: MI_TRACK=${MI_TRACK} (ignored)") endif() diff --git a/include/mimalloc.h b/include/mimalloc.h index 6de3738c0..6eecc1099 100644 --- a/include/mimalloc.h +++ b/include/mimalloc.h @@ -137,6 +137,11 @@ mi_decl_nodiscard mi_decl_export size_t mi_good_size(size_t size) mi_attr_no // `mi_free_size` can be more efficient (as it calls mi_free_small internally). mi_decl_export void mi_free_size(void* p, size_t size) mi_attr_noexcept; +#if defined(MI_TRACK_CUSTOM) +void mi_track_malloc_hook(const void* p, size_t reqsize) mi_attr_noexcept; +void mi_track_free_hook(const void* p, size_t size) mi_attr_noexcept; +#endif + // `mi_free_small` is for special applications like language runtimes. // it should only be used to free objects from `mi_*alloc_small` and is potentially a tiny bit faster than `mi_free` mi_decl_export void mi_free_small(void* p) mi_attr_noexcept; diff --git a/include/mimalloc/track.h b/include/mimalloc/track.h index e6a57c8ec..95e1c5a53 100644 --- a/include/mimalloc/track.h +++ b/include/mimalloc/track.h @@ -89,6 +89,16 @@ defined, undefined, or not accessible at all: #define mi_track_malloc_size(p,reqsize,size,zero) EventWriteETW_MI_ALLOC((UINT64)(p), size) #define mi_track_free_size(p,size) EventWriteETW_MI_FREE((UINT64)(p), size) +#elif defined(MI_TRACK_CUSTOM) +// application-defined hooks + +#define MI_TRACK_ENABLED 0 +#define MI_TRACK_HEAP_DESTROY 0 +#define MI_TRACK_TOOL "custom" + +#define mi_track_malloc_size(p,reqsize,size,zero) mi_track_malloc_hook((p),(reqsize)) +#define mi_track_free_size(p,size) mi_track_free_hook((p),(size)) + #else // no tracking diff --git a/include/mimalloc/types.h b/include/mimalloc/types.h index 21e787b43..39e451550 100644 --- a/include/mimalloc/types.h +++ b/include/mimalloc/types.h @@ -54,6 +54,7 @@ terms of the MIT license. A copy of the license can be found in the file // #define MI_TRACK_VALGRIND 1 // #define MI_TRACK_ASAN 1 // #define MI_TRACK_ETW 1 +// #define MI_TRACK_CUSTOM 1 // Define MI_STATS as 1 to maintain statistics; set it to 2 to have detailed statistics (but costs some performance). // #define MI_STATS 1 From 87092fd5d2ebfaa3cf2f262a21f28777396494d9 Mon Sep 17 00:00:00 2001 From: Eduard Voronkin Date: Fri, 11 Sep 2026 22:13:01 -0700 Subject: [PATCH 2/2] pass complete allocation metadata to custom hook --- include/mimalloc.h | 2 +- include/mimalloc/track.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/mimalloc.h b/include/mimalloc.h index 6eecc1099..ba1bdbf93 100644 --- a/include/mimalloc.h +++ b/include/mimalloc.h @@ -138,7 +138,7 @@ mi_decl_nodiscard mi_decl_export size_t mi_good_size(size_t size) mi_attr_no mi_decl_export void mi_free_size(void* p, size_t size) mi_attr_noexcept; #if defined(MI_TRACK_CUSTOM) -void mi_track_malloc_hook(const void* p, size_t reqsize) mi_attr_noexcept; +void mi_track_malloc_hook(const void* p, size_t reqsize, size_t size, bool zero) mi_attr_noexcept; void mi_track_free_hook(const void* p, size_t size) mi_attr_noexcept; #endif diff --git a/include/mimalloc/track.h b/include/mimalloc/track.h index 95e1c5a53..d532c4f64 100644 --- a/include/mimalloc/track.h +++ b/include/mimalloc/track.h @@ -96,7 +96,7 @@ defined, undefined, or not accessible at all: #define MI_TRACK_HEAP_DESTROY 0 #define MI_TRACK_TOOL "custom" -#define mi_track_malloc_size(p,reqsize,size,zero) mi_track_malloc_hook((p),(reqsize)) +#define mi_track_malloc_size(p,reqsize,size,zero) mi_track_malloc_hook((p),(reqsize),(size),(zero)) #define mi_track_free_size(p,size) mi_track_free_hook((p),(size)) #else