From aa881733d7830e44b39bd16080fab803e468828c Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 21 Oct 2024 22:56:59 -0700 Subject: [PATCH 01/14] reorganize primitives for process initialization; use special data segment on Windows for thread termination by default on Windows now (issue #869) --- include/mimalloc/internal.h | 5 + src/init.c | 114 ++------------------- src/prim/prim.c | 44 ++++++++ src/prim/windows/prim.c | 197 ++++++++++++++++++++++++++++-------- 4 files changed, 209 insertions(+), 151 deletions(-) diff --git a/include/mimalloc/internal.h b/include/mimalloc/internal.h index 2f21d88e..63a1e6f0 100644 --- a/include/mimalloc/internal.h +++ b/include/mimalloc/internal.h @@ -77,6 +77,11 @@ static inline uintptr_t _mi_random_shuffle(uintptr_t x); // init.c extern mi_decl_cache_align mi_stats_t _mi_stats_main; extern mi_decl_cache_align const mi_page_t _mi_page_empty; +void _mi_process_load(void); +void mi_cdecl _mi_process_done(void); +bool _mi_is_redirected(void); +bool _mi_allocator_init(const char** message); +void _mi_allocator_done(void); bool _mi_is_main_thread(void); size_t _mi_current_thread_count(void); bool _mi_preloading(void); // true while the C runtime is not initialized yet diff --git a/src/init.c b/src/init.c index ead5a147..eaa7f5be 100644 --- a/src/init.c +++ b/src/init.c @@ -459,10 +459,6 @@ void mi_thread_init(void) mi_attr_noexcept //_mi_verbose_message("thread init: 0x%zx\n", _mi_thread_id()); } -void mi_thread_done(void) mi_attr_noexcept { - _mi_thread_done(NULL); -} - void _mi_thread_done(mi_heap_t* heap) { // calling with NULL implies using the default heap @@ -508,54 +504,15 @@ void _mi_heap_set_default_direct(mi_heap_t* heap) { // -------------------------------------------------------- // Run functions on process init/done, and thread init/done // -------------------------------------------------------- -static void mi_cdecl mi_process_done(void); - static bool os_preloading = true; // true until this module is initialized -static bool mi_redirected = false; // true if malloc redirects to mi_malloc // Returns true if this module has not been initialized; Don't use C runtime routines until it returns false. bool mi_decl_noinline _mi_preloading(void) { return os_preloading; } -mi_decl_nodiscard bool mi_is_redirected(void) mi_attr_noexcept { - return mi_redirected; -} - -// Communicate with the redirection module on Windows -#if defined(_WIN32) && defined(MI_SHARED_LIB) && !defined(MI_WIN_NOREDIRECT) -#ifdef __cplusplus -extern "C" { -#endif -mi_decl_export void _mi_redirect_entry(DWORD reason) { - // called on redirection; careful as this may be called before DllMain - if (reason == DLL_PROCESS_ATTACH) { - mi_redirected = true; - } - else if (reason == DLL_PROCESS_DETACH) { - mi_redirected = false; - } - else if (reason == DLL_THREAD_DETACH) { - mi_thread_done(); - } -} -__declspec(dllimport) bool mi_cdecl mi_allocator_init(const char** message); -__declspec(dllimport) void mi_cdecl mi_allocator_done(void); -#ifdef __cplusplus -} -#endif -#else -static bool mi_allocator_init(const char** message) { - if (message != NULL) *message = NULL; - return true; -} -static void mi_allocator_done(void) { - // nothing to do -} -#endif - -// Called once by the process loader -static void mi_process_load(void) { +// Called once by the process loader from `src/prim/prim.c` +void _mi_process_load(void) { mi_heap_main_init(); #if defined(__APPLE__) || defined(MI_TLS_RECURSE_GUARD) volatile mi_heap_t* dummy = _mi_heap_default; // access TLS to allocate it before setting tls_initialized to true; @@ -563,17 +520,14 @@ static void mi_process_load(void) { #endif os_preloading = false; mi_assert_internal(_mi_is_main_thread()); - #if !(defined(_WIN32) && defined(MI_SHARED_LIB)) // use Dll process detach (see below) instead of atexit (issue #521) - atexit(&mi_process_done); - #endif _mi_options_init(); mi_process_setup_auto_thread_done(); mi_process_init(); - if (mi_redirected) _mi_verbose_message("malloc is redirected.\n"); + if (_mi_is_redirected()) _mi_verbose_message("malloc is redirected.\n"); // show message from the redirector (if present) const char* msg = NULL; - mi_allocator_init(&msg); + _mi_allocator_init(&msg); if (msg != NULL && (mi_option_is_enabled(mi_option_verbose) || mi_option_is_enabled(mi_option_show_errors))) { _mi_fputs(NULL,NULL,NULL,msg); } @@ -651,7 +605,7 @@ void mi_process_init(void) mi_attr_noexcept { } // Called when the process is done (through `at_exit`) -static void mi_cdecl mi_process_done(void) { +void mi_cdecl _mi_process_done(void) { // only shutdown if we were initialized if (!_mi_process_is_initialized) return; // ensure we are called once @@ -683,64 +637,8 @@ static void mi_cdecl mi_process_done(void) { if (mi_option_is_enabled(mi_option_show_stats) || mi_option_is_enabled(mi_option_verbose)) { mi_stats_print(NULL); } - mi_allocator_done(); + _mi_allocator_done(); _mi_verbose_message("process done: 0x%zx\n", _mi_heap_main.thread_id); os_preloading = true; // don't call the C runtime anymore } - - -#if defined(_WIN32) && defined(MI_SHARED_LIB) - // Windows DLL: easy to hook into process_init and thread_done - __declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) { - MI_UNUSED(reserved); - MI_UNUSED(inst); - if (reason==DLL_PROCESS_ATTACH) { - mi_process_load(); - } - else if (reason==DLL_PROCESS_DETACH) { - mi_process_done(); - } - else if (reason==DLL_THREAD_DETACH) { - if (!mi_is_redirected()) { - mi_thread_done(); - } - } - return TRUE; - } - -#elif defined(_MSC_VER) - // MSVC: use data section magic for static libraries - // See - static int _mi_process_init(void) { - mi_process_load(); - return 0; - } - typedef int(*_mi_crt_callback_t)(void); - #if defined(_M_X64) || defined(_M_ARM64) - __pragma(comment(linker, "/include:" "_mi_msvc_initu")) - #pragma section(".CRT$XIU", long, read) - #else - __pragma(comment(linker, "/include:" "__mi_msvc_initu")) - #endif - #pragma data_seg(".CRT$XIU") - mi_decl_externc _mi_crt_callback_t _mi_msvc_initu[] = { &_mi_process_init }; - #pragma data_seg() - -#elif defined(__cplusplus) - // C++: use static initialization to detect process start - static bool _mi_process_init(void) { - mi_process_load(); - return (_mi_heap_main.thread_id != 0); - } - static bool mi_initialized = _mi_process_init(); - -#elif defined(__GNUC__) || defined(__clang__) - // GCC,Clang: use the constructor attribute - static void __attribute__((constructor)) _mi_process_init(void) { - mi_process_load(); - } - -#else -#pragma message("define a way to call mi_process_load on your platform") -#endif diff --git a/src/prim/prim.c b/src/prim/prim.c index 3b7d3736..242cd618 100644 --- a/src/prim/prim.c +++ b/src/prim/prim.c @@ -25,3 +25,47 @@ terms of the MIT license. A copy of the license can be found in the file #include "unix/prim.c" // mmap() (Linux, macOSX, BSD, Illumnos, Haiku, DragonFly, etc.) #endif + +// Generic process initialization +#ifndef MI_PRIM_HAS_PROCESS_ATTACH +#if defined(__GNUC__) || defined(__clang__) + // GCC,Clang: use the constructor attribute + #if defined(__clang__) + #define mi_attr_constructor __attribute__((constructor(101))) + #define mi_attr_destructor __attribute__((destructor(101))) + #else + #define mi_attr_constructor __attribute__((constructor)) + #define mi_attr_destructor __attribute__((destructor)) + #endif + static void mi_attr_constructor mi_process_attach(void) { + _mi_process_load(); + } + static void mi_attr_destructor mi_process_detach(void) { + _mi_process_done(); + } +#elif defined(__cplusplus) + // C++: use static initialization to detect process start + static bool mi_process_attach(void) { + _mi_process_load(); + atexit(&_mi_process_done); + return (_mi_heap_main.thread_id != 0); + } + static bool mi_initialized = mi_process_attach(); +#else + #pragma message("define a way to call _mi_process_load/done on your platform") +#endif +#endif + +// Generic allocator init/done callback +#ifndef MI_PRIM_HAS_ALLOCATOR_INIT +bool _mi_is_redirected(void) { + return false; +} +bool _mi_allocator_init(const char** message) { + if (message != NULL) *message = NULL; + return true; +} +void _mi_allocator_done(void) { + // nothing to do +} +#endif diff --git a/src/prim/windows/prim.c b/src/prim/windows/prim.c index bd874f9b..c62ea497 100644 --- a/src/prim/windows/prim.c +++ b/src/prim/windows/prim.c @@ -499,8 +499,7 @@ void _mi_prim_process_info(mi_process_info_t* pinfo) } // get process info - PROCESS_MEMORY_COUNTERS info; - memset(&info, 0, sizeof(info)); + PROCESS_MEMORY_COUNTERS info; _mi_memzero_var(info); if (pGetProcessMemoryInfo != NULL) { pGetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info)); } @@ -602,60 +601,172 @@ bool _mi_prim_random_buf(void* buf, size_t buf_len) { #endif // MI_USE_RTLGENRANDOM + + //---------------------------------------------------------------- -// Thread init/done +// Process & Thread Init/Done //---------------------------------------------------------------- -#if !defined(MI_SHARED_LIB) - -// use thread local storage keys to detect thread ending -// note: another design could be to use special linker sections (see issue #869) -#include -#if (_WIN32_WINNT < 0x600) // before Windows Vista -WINBASEAPI DWORD WINAPI FlsAlloc( _In_opt_ PFLS_CALLBACK_FUNCTION lpCallback ); -WINBASEAPI PVOID WINAPI FlsGetValue( _In_ DWORD dwFlsIndex ); -WINBASEAPI BOOL WINAPI FlsSetValue( _In_ DWORD dwFlsIndex, _In_opt_ PVOID lpFlsData ); -WINBASEAPI BOOL WINAPI FlsFree(_In_ DWORD dwFlsIndex); -#endif - -static DWORD mi_fls_key = (DWORD)(-1); - -static void NTAPI mi_fls_done(PVOID value) { - mi_heap_t* heap = (mi_heap_t*)value; - if (heap != NULL) { - _mi_thread_done(heap); - FlsSetValue(mi_fls_key, NULL); // prevent recursion as _mi_thread_done may set it back to the main heap, issue #672 +static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) { + MI_UNUSED(reserved); + MI_UNUSED(module); + if (reason==DLL_PROCESS_ATTACH) { + _mi_process_load(); } + else if (reason==DLL_PROCESS_DETACH) { + _mi_process_done(); + } + else if (reason==DLL_THREAD_DETACH && !_mi_is_redirected()) { + _mi_thread_done(NULL); + } } -void _mi_prim_thread_init_auto_done(void) { - mi_fls_key = FlsAlloc(&mi_fls_done); -} -void _mi_prim_thread_done_auto_done(void) { - // call thread-done on all threads (except the main thread) to prevent - // dangling callback pointer if statically linked with a DLL; Issue #208 - FlsFree(mi_fls_key); -} +#if defined(MI_SHARED_LIB) + #define MI_PRIM_HAS_PROCESS_INIT 1 -void _mi_prim_thread_associate_default_heap(mi_heap_t* heap) { - mi_assert_internal(mi_fls_key != (DWORD)(-1)); - FlsSetValue(mi_fls_key, heap); -} + // Windows DLL: easy to hook into process_init and thread_done + __declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) { + win_main((PVOID)inst,reason,reserved); + return TRUE; + } -#else + // nothing to do since `_mi_thread_done` is handled through the DLL_THREAD_DETACH event. + void _mi_prim_thread_init_auto_done(void) { } + void _mi_prim_thread_done_auto_done(void) { } + void _mi_prim_thread_associate_default_heap(mi_heap_t* heap) { + MI_UNUSED(heap); + } -// Dll; nothing to do as in that case thread_done is handled through the DLL_THREAD_DETACH event. +#elif !defined(MI_WIN_USE_FLS) + #define MI_PRIM_HAS_PROCESS_INIT 1 -void _mi_prim_thread_init_auto_done(void) { -} + // Set up TLS callbacks in a statically linked library by using special data sections. + // See + // We may use ".CRT$XLY" instead of "B" -- see also issue #869. + #if defined(__cplusplus) + extern "C" { + #endif -void _mi_prim_thread_done_auto_done(void) { -} + #if defined(_WIN64) + #pragma comment(linker, "/INCLUDE:_tls_used") + #pragma comment(linker, "/INCLUDE:_mi_tls_callback") + #pragma const_seg(".CRT$XLB") + extern const PIMAGE_TLS_CALLBACK _mi_tls_callback[]; + const PIMAGE_TLS_CALLBACK _mi_tls_callback[] = { &mi_win_main }; + #pragma const_seg() + #else + #pragma comment(linker, "/INCLUDE:__tls_used") + #pragma comment(linker, "/INCLUDE:__mi_tls_callback") + #pragma data_seg(".CRT$XLB") + const PIMAGE_TLS_CALLBACK _mi_tls_callback[] = { &mi_win_main }; + #pragma data_seg() + #endif -void _mi_prim_thread_associate_default_heap(mi_heap_t* heap) { - MI_UNUSED(heap); -} + #if defined(__cplusplus) + } + #endif + // nothing to do since `_mi_thread_done` is handled through the DLL_THREAD_DETACH event. + void _mi_prim_thread_init_auto_done(void) { } + void _mi_prim_thread_done_auto_done(void) { } + void _mi_prim_thread_associate_default_heap(mi_heap_t* heap) { + MI_UNUSED(heap); + } + +#else // statically linked, use fiber api + + #if defined(_MSC_VER) // on clang/gcc use the constructor attribute (in `src/prim/prim.c`) + // MSVC: use data section magic for static libraries + // See + #define MI_PRIM_HAS_PROCESS_INIT 1 + + static int mi_process_attach(void) { + mi_win_main(NULL,DLL_PROCESS_ATTACH,NULL); + atexit(&_mi_process_done); + return 0; + } + typedef int(*_mi_crt_callback_t)(void); + #if defined(_M_X64) || defined(_M_ARM64) + __pragma(comment(linker, "/include:" "_mi_msvc_initu")) + #pragma section(".CRT$XIU", long, read) + #else + __pragma(comment(linker, "/include:" "__mi_msvc_initu")) + #endif + #pragma data_seg(".CRT$XIU") + mi_decl_externc _mi_crt_callback_t _mi_msvc_initu[] = { &mi_process_attach }; + #pragma data_seg() + #endif + + // use the fiber api for calling `_mi_thread_done`. + #include + #if (_WIN32_WINNT < 0x600) // before Windows Vista + WINBASEAPI DWORD WINAPI FlsAlloc( _In_opt_ PFLS_CALLBACK_FUNCTION lpCallback ); + WINBASEAPI PVOID WINAPI FlsGetValue( _In_ DWORD dwFlsIndex ); + WINBASEAPI BOOL WINAPI FlsSetValue( _In_ DWORD dwFlsIndex, _In_opt_ PVOID lpFlsData ); + WINBASEAPI BOOL WINAPI FlsFree(_In_ DWORD dwFlsIndex); + #endif + + static DWORD mi_fls_key = (DWORD)(-1); + + static void NTAPI mi_fls_done(PVOID value) { + mi_heap_t* heap = (mi_heap_t*)value; + if (heap != NULL) { + _mi_thread_done(heap); + FlsSetValue(mi_fls_key, NULL); // prevent recursion as _mi_thread_done may set it back to the main heap, issue #672 + } + } + + void _mi_prim_thread_init_auto_done(void) { + mi_fls_key = FlsAlloc(&mi_fls_done); + } + + void _mi_prim_thread_done_auto_done(void) { + // call thread-done on all threads (except the main thread) to prevent + // dangling callback pointer if statically linked with a DLL; Issue #208 + FlsFree(mi_fls_key); + } + + void _mi_prim_thread_associate_default_heap(mi_heap_t* heap) { + mi_assert_internal(mi_fls_key != (DWORD)(-1)); + FlsSetValue(mi_fls_key, heap); + } #endif +// ---------------------------------------------------- +// Communicate with the redirection module on Windows +// ---------------------------------------------------- +#if defined(MI_SHARED_LIB) && !defined(MI_WIN_NOREDIRECT) + static bool mi_redirected = false; // true if malloc redirects to mi_malloc + + bool _mi_is_redirected(void) { + return mi_redirected; + } + + #ifdef __cplusplus + extern "C" { + #endif + mi_decl_export void _mi_redirect_entry(DWORD reason) { + // called on redirection; careful as this may be called before DllMain + if (reason == DLL_PROCESS_ATTACH) { + mi_redirected = true; + } + else if (reason == DLL_PROCESS_DETACH) { + mi_redirected = false; + } + else if (reason == DLL_THREAD_DETACH) { + _mi_thread_done(NULL); + } + } + __declspec(dllimport) bool mi_cdecl mi_allocator_init(const char** message); + __declspec(dllimport) void mi_cdecl mi_allocator_done(void); + #ifdef __cplusplus + } + #endif + bool _mi_allocator_init(const char** message) { + return mi_allocator_init(message); + } + void _mi_allocator_done(void) { + mi_allocator_done(); + } +#endif \ No newline at end of file From 4377abe017d59796845ec0266531d62e5873a917 Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 21 Oct 2024 22:59:41 -0700 Subject: [PATCH 02/14] add cmake option to fall back on the fiber api do detect thread termination on windows --- CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index adf45bbf..e0aa59b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,7 @@ option(MI_NO_THP "Disable transparent huge pages support on Linux/And option(MI_EXTRA_CPPDEFS "Extra pre-processor definitions (use as `-DMI_EXTRA_CPPDEFS=\"opt1=val1;opt2=val2\"`)" "") # deprecated options +option(MI_WIN_USE_FLS "Use Fiber local storage on Windows to detect thread termination" OFF) option(MI_CHECK_FULL "Use full internal invariant checking in DEBUG mode (deprecated, use MI_DEBUG_FULL instead)" OFF) option(MI_USE_LIBATOMIC "Explicitly link with -latomic (on older systems) (deprecated and detected automatically)" OFF) @@ -313,6 +314,11 @@ if(MI_LIBC_MUSL) list(APPEND mi_defines MI_LIBC_MUSL=1) endif() +if(MI_WIN_USE_FLS) + message(STATUS "Use the Fiber API to detect thread termination") + list(APPEND mi_defines MI_WIN_USE_FLS=1) +endif() + # On Haiku use `-DCMAKE_INSTALL_PREFIX` instead, issue #788 # if(CMAKE_SYSTEM_NAME MATCHES "Haiku") # SET(CMAKE_INSTALL_LIBDIR ~/config/non-packaged/lib) From f971bd6d749ccdea5b3622ef6272896b2d45ab28 Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 21 Oct 2024 23:05:51 -0700 Subject: [PATCH 03/14] fix build on windows --- src/prim/prim.c | 1 + src/prim/windows/prim.c | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/prim/prim.c b/src/prim/prim.c index 242cd618..8a2400c8 100644 --- a/src/prim/prim.c +++ b/src/prim/prim.c @@ -45,6 +45,7 @@ terms of the MIT license. A copy of the license can be found in the file } #elif defined(__cplusplus) // C++: use static initialization to detect process start + extern mi_heap_t _mi_heap_main; static bool mi_process_attach(void) { _mi_process_load(); atexit(&_mi_process_done); diff --git a/src/prim/windows/prim.c b/src/prim/windows/prim.c index c62ea497..ed160541 100644 --- a/src/prim/windows/prim.c +++ b/src/prim/windows/prim.c @@ -623,11 +623,11 @@ static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) { #if defined(MI_SHARED_LIB) - #define MI_PRIM_HAS_PROCESS_INIT 1 + #define MI_PRIM_HAS_PROCESS_ATTACH 1 // Windows DLL: easy to hook into process_init and thread_done __declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) { - win_main((PVOID)inst,reason,reserved); + mi_win_main((PVOID)inst,reason,reserved); return TRUE; } @@ -639,7 +639,7 @@ static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) { } #elif !defined(MI_WIN_USE_FLS) - #define MI_PRIM_HAS_PROCESS_INIT 1 + #define MI_PRIM_HAS_PROCESS_ATTACH 1 // Set up TLS callbacks in a statically linked library by using special data sections. // See @@ -679,7 +679,7 @@ static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) { #if defined(_MSC_VER) // on clang/gcc use the constructor attribute (in `src/prim/prim.c`) // MSVC: use data section magic for static libraries // See - #define MI_PRIM_HAS_PROCESS_INIT 1 + #define MI_PRIM_HAS_PROCESS_ATTACH 1 static int mi_process_attach(void) { mi_win_main(NULL,DLL_PROCESS_ATTACH,NULL); From e55ae0aeb76f5205edce57b97031be6aa80f962a Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 21 Oct 2024 23:09:14 -0700 Subject: [PATCH 04/14] fix duplicate definition on windows --- src/prim/windows/prim.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/prim/windows/prim.c b/src/prim/windows/prim.c index ed160541..90fab080 100644 --- a/src/prim/windows/prim.c +++ b/src/prim/windows/prim.c @@ -737,6 +737,8 @@ static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) { // Communicate with the redirection module on Windows // ---------------------------------------------------- #if defined(MI_SHARED_LIB) && !defined(MI_WIN_NOREDIRECT) + #define MI_PRIM_HAS_ALLOCATOR_INIT 1 + static bool mi_redirected = false; // true if malloc redirects to mi_malloc bool _mi_is_redirected(void) { From 46e9e7fdd08f017eded0c88538647c82752c668f Mon Sep 17 00:00:00 2001 From: Daan Date: Tue, 22 Oct 2024 06:06:15 -0700 Subject: [PATCH 05/14] fix win32 compilation --- src/prim/windows/prim.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/prim/windows/prim.c b/src/prim/windows/prim.c index 90fab080..7ba1f1de 100644 --- a/src/prim/windows/prim.c +++ b/src/prim/windows/prim.c @@ -659,7 +659,7 @@ static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) { #pragma comment(linker, "/INCLUDE:__tls_used") #pragma comment(linker, "/INCLUDE:__mi_tls_callback") #pragma data_seg(".CRT$XLB") - const PIMAGE_TLS_CALLBACK _mi_tls_callback[] = { &mi_win_main }; + PIMAGE_TLS_CALLBACK _mi_tls_callback[] = { &mi_win_main }; #pragma data_seg() #endif @@ -738,7 +738,7 @@ static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) { // ---------------------------------------------------- #if defined(MI_SHARED_LIB) && !defined(MI_WIN_NOREDIRECT) #define MI_PRIM_HAS_ALLOCATOR_INIT 1 - + static bool mi_redirected = false; // true if malloc redirects to mi_malloc bool _mi_is_redirected(void) { From 104e82170912bffdc7228202abc897204ca747be Mon Sep 17 00:00:00 2001 From: Daan Date: Tue, 22 Oct 2024 06:08:56 -0700 Subject: [PATCH 06/14] fix fast divisor for 32-bit platforms --- src/heap.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/heap.c b/src/heap.c index a3aaaf6b..206d3a36 100644 --- a/src/heap.c +++ b/src/heap.c @@ -543,13 +543,14 @@ void _mi_heap_area_init(mi_heap_area_t* area, mi_page_t* page) { static void mi_get_fast_divisor(size_t divisor, uint64_t* magic, size_t* shift) { mi_assert_internal(divisor > 0 && divisor <= UINT32_MAX); - *shift = 64 - mi_clz(divisor - 1); + *shift = MI_INTPTR_BITS - mi_clz(divisor - 1); *magic = ((((uint64_t)1 << 32) * (((uint64_t)1 << *shift) - divisor)) / divisor + 1); } static size_t mi_fast_divide(size_t n, uint64_t magic, size_t shift) { mi_assert_internal(n <= UINT32_MAX); - return ((((uint64_t)n * magic) >> 32) + n) >> shift; + const uint64_t hi = ((uint64_t)n * magic) >> 32; + return (size_t)((hi + n) >> shift); } bool _mi_heap_area_visit_blocks(const mi_heap_area_t* area, mi_page_t* page, mi_block_visit_fun* visitor, void* arg) { From dfdb9cb8772f8fabf63ce81aaa7e2aac9621a1e3 Mon Sep 17 00:00:00 2001 From: Daan Date: Tue, 22 Oct 2024 06:52:34 -0700 Subject: [PATCH 07/14] cleanup process init/done --- src/prim/prim.c | 20 ++++++++++++++++---- src/prim/windows/prim.c | 12 ++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/prim/prim.c b/src/prim/prim.c index 8a2400c8..a4d3814f 100644 --- a/src/prim/prim.c +++ b/src/prim/prim.c @@ -29,7 +29,8 @@ terms of the MIT license. A copy of the license can be found in the file // Generic process initialization #ifndef MI_PRIM_HAS_PROCESS_ATTACH #if defined(__GNUC__) || defined(__clang__) - // GCC,Clang: use the constructor attribute + // gcc,clang: use the constructor/destructor attribute + // which for both seem to run before regular constructors/destructors #if defined(__clang__) #define mi_attr_constructor __attribute__((constructor(101))) #define mi_attr_destructor __attribute__((destructor(101))) @@ -44,7 +45,17 @@ terms of the MIT license. A copy of the license can be found in the file _mi_process_done(); } #elif defined(__cplusplus) - // C++: use static initialization to detect process start + // C++: use static initialization to detect process start/end + struct mi_init_done_t { + mi_init_done_t() { + _mi_process_load(); + } + ~mi_init_done_t() { + _mi_process_done(); + } + }; + static mi_init_done_t mi_init_done; + /* extern mi_heap_t _mi_heap_main; static bool mi_process_attach(void) { _mi_process_load(); @@ -52,7 +63,8 @@ terms of the MIT license. A copy of the license can be found in the file return (_mi_heap_main.thread_id != 0); } static bool mi_initialized = mi_process_attach(); -#else + */ + #else #pragma message("define a way to call _mi_process_load/done on your platform") #endif #endif @@ -63,7 +75,7 @@ bool _mi_is_redirected(void) { return false; } bool _mi_allocator_init(const char** message) { - if (message != NULL) *message = NULL; + if (message != NULL) { *message = NULL; } return true; } void _mi_allocator_done(void) { diff --git a/src/prim/windows/prim.c b/src/prim/windows/prim.c index 7ba1f1de..b0631b81 100644 --- a/src/prim/windows/prim.c +++ b/src/prim/windows/prim.c @@ -674,7 +674,7 @@ static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) { MI_UNUSED(heap); } -#else // statically linked, use fiber api +#else // deprecated: statically linked, use fiber api #if defined(_MSC_VER) // on clang/gcc use the constructor attribute (in `src/prim/prim.c`) // MSVC: use data section magic for static libraries @@ -686,15 +686,15 @@ static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) { atexit(&_mi_process_done); return 0; } - typedef int(*_mi_crt_callback_t)(void); - #if defined(_M_X64) || defined(_M_ARM64) - __pragma(comment(linker, "/include:" "_mi_msvc_initu")) + typedef int(*mi_crt_callback_t)(void); + #if defined(_WIN64) + #pragma comment(linker, "/INCLUDE:_mi_tls_callback") #pragma section(".CRT$XIU", long, read) #else - __pragma(comment(linker, "/include:" "__mi_msvc_initu")) + #pragma comment(linker, "/INCLUDE:__mi_tls_callback") #endif #pragma data_seg(".CRT$XIU") - mi_decl_externc _mi_crt_callback_t _mi_msvc_initu[] = { &mi_process_attach }; + mi_decl_externc mi_crt_callback_t _mi_tls_callback[] = { &mi_process_attach }; #pragma data_seg() #endif From 6e9b38ac126c301f6e6c3e47a642c2c8388c333d Mon Sep 17 00:00:00 2001 From: Daan Date: Tue, 22 Oct 2024 18:58:55 -0700 Subject: [PATCH 08/14] fix issue where searching for abandoned blocks would skip the first one --- src/arena-abandon.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/arena-abandon.c b/src/arena-abandon.c index eaa8c7c9..c40d3ce3 100644 --- a/src/arena-abandon.c +++ b/src/arena-abandon.c @@ -237,7 +237,7 @@ static mi_segment_t* mi_arena_segment_clear_abandoned_at(mi_arena_t* arena, mi_s static mi_segment_t* mi_arena_segment_clear_abandoned_next_field(mi_arena_field_cursor_t* previous) { const size_t max_arena = mi_arena_get_count(); size_t field_idx = mi_bitmap_index_field(previous->bitmap_idx); - size_t bit_idx = mi_bitmap_index_bit_in_field(previous->bitmap_idx) + 1; + size_t bit_idx = mi_bitmap_index_bit_in_field(previous->bitmap_idx); // visit arena's (from the previous cursor) for (; previous->start < previous->end; previous->start++, field_idx = 0, bit_idx = 0) { // index wraps around @@ -266,11 +266,12 @@ static mi_segment_t* mi_arena_segment_clear_abandoned_next_field(mi_arena_field_ // pre-check if the bit is set size_t mask = ((size_t)1 << bit_idx); if mi_unlikely((field & mask) == mask) { - previous->bitmap_idx = mi_bitmap_index_create(field_idx, bit_idx); - mi_segment_t* const segment = mi_arena_segment_clear_abandoned_at(arena, previous->subproc, previous->bitmap_idx); + mi_bitmap_index_t bitmap_idx = mi_bitmap_index_create(field_idx, bit_idx); + mi_segment_t* const segment = mi_arena_segment_clear_abandoned_at(arena, previous->subproc, bitmap_idx); if (segment != NULL) { //mi_assert_internal(arena->blocks_committed == NULL || _mi_bitmap_is_claimed(arena->blocks_committed, arena->field_count, 1, bitmap_idx)); if (has_lock) { mi_lock_release(&arena->abandoned_visit_lock); } + previous->bitmap_idx = mi_bitmap_index_create(field_idx, bit_idx + 1); // start at next one for the next iteration return segment; } } From d951b4dd234c165552521419ef2365a55fdcd454 Mon Sep 17 00:00:00 2001 From: Daan Date: Wed, 23 Oct 2024 00:53:17 -0700 Subject: [PATCH 09/14] add missing mi_thread_done definition --- src/init.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/init.c b/src/init.c index eaa7f5be..75458a1f 100644 --- a/src/init.c +++ b/src/init.c @@ -459,6 +459,10 @@ void mi_thread_init(void) mi_attr_noexcept //_mi_verbose_message("thread init: 0x%zx\n", _mi_thread_id()); } +void mi_thread_done(void) mi_attr_noexcept { + _mi_thread_done(NULL); +} + void _mi_thread_done(mi_heap_t* heap) { // calling with NULL implies using the default heap From 925efaeac93f15408f001484e9ea4fa0fe3b8aec Mon Sep 17 00:00:00 2001 From: Daan Date: Wed, 23 Oct 2024 01:10:00 -0700 Subject: [PATCH 10/14] improve windows static library initialization to account for thread local destructors (issue #944) --- src/prim/windows/prim.c | 45 ++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/prim/windows/prim.c b/src/prim/windows/prim.c index b0631b81..385354fc 100644 --- a/src/prim/windows/prim.c +++ b/src/prim/windows/prim.c @@ -641,26 +641,47 @@ static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) { #elif !defined(MI_WIN_USE_FLS) #define MI_PRIM_HAS_PROCESS_ATTACH 1 + static void NTAPI mi_win_main_attach(PVOID module, DWORD reason, LPVOID reserved) { + if (reason == DLL_PROCESS_ATTACH || reason == DLL_THREAD_ATTACH) { + mi_win_main(module, reason, reserved); + } + } + static void NTAPI mi_win_main_detach(PVOID module, DWORD reason, LPVOID reserved) { + if (reason == DLL_PROCESS_DETACH || reason == DLL_THREAD_DETACH) { + mi_win_main(module, reason, reserved); + } + } + // Set up TLS callbacks in a statically linked library by using special data sections. // See - // We may use ".CRT$XLY" instead of "B" -- see also issue #869. + // We use 2 entries to ensure we call attach events before constructors + // are called, and detach events after destructors are called. #if defined(__cplusplus) extern "C" { #endif #if defined(_WIN64) - #pragma comment(linker, "/INCLUDE:_tls_used") - #pragma comment(linker, "/INCLUDE:_mi_tls_callback") - #pragma const_seg(".CRT$XLB") - extern const PIMAGE_TLS_CALLBACK _mi_tls_callback[]; - const PIMAGE_TLS_CALLBACK _mi_tls_callback[] = { &mi_win_main }; - #pragma const_seg() + #pragma comment(linker, "/INCLUDE:_tls_used") + #pragma comment(linker, "/INCLUDE:_mi_tls_callback_pre") + #pragma comment(linker, "/INCLUDE:_mi_tls_callback_post") + #pragma const_seg(".CRT$XLB") + extern const PIMAGE_TLS_CALLBACK _mi_tls_callback_pre[]; + const PIMAGE_TLS_CALLBACK _mi_tls_callback_pre[] = { &mi_win_main_attach }; + #pragma const_seg() + #pragma const_seg(".CRT$XLY") + extern const PIMAGE_TLS_CALLBACK _mi_tls_callback_post[]; + const PIMAGE_TLS_CALLBACK _mi_tls_callback_post[] = { &mi_win_main_detach }; + #pragma const_seg() #else - #pragma comment(linker, "/INCLUDE:__tls_used") - #pragma comment(linker, "/INCLUDE:__mi_tls_callback") - #pragma data_seg(".CRT$XLB") - PIMAGE_TLS_CALLBACK _mi_tls_callback[] = { &mi_win_main }; - #pragma data_seg() + #pragma comment(linker, "/INCLUDE:__tls_used") + #pragma comment(linker, "/INCLUDE:__mi_tls_callback_pre") + #pragma comment(linker, "/INCLUDE:__mi_tls_callback_post") + #pragma data_seg(".CRT$XLB") + PIMAGE_TLS_CALLBACK _mi_tls_callback_pre[] = { &mi_win_main_attach }; + #pragma data_seg() + #pragma data_seg(".CRT$XLY") + PIMAGE_TLS_CALLBACK _mi_tls_callback_post[] = { &mi_win_main_detach }; + #pragma data_seg() #endif #if defined(__cplusplus) From 2b0d039cf3cf6df8b5269814344626e10565eb04 Mon Sep 17 00:00:00 2001 From: Daan Date: Wed, 23 Oct 2024 01:21:41 -0700 Subject: [PATCH 11/14] fix assertion check --- src/arena-abandon.c | 2 +- src/bitmap.h | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/arena-abandon.c b/src/arena-abandon.c index c40d3ce3..9c3356fc 100644 --- a/src/arena-abandon.c +++ b/src/arena-abandon.c @@ -271,7 +271,7 @@ static mi_segment_t* mi_arena_segment_clear_abandoned_next_field(mi_arena_field_ if (segment != NULL) { //mi_assert_internal(arena->blocks_committed == NULL || _mi_bitmap_is_claimed(arena->blocks_committed, arena->field_count, 1, bitmap_idx)); if (has_lock) { mi_lock_release(&arena->abandoned_visit_lock); } - previous->bitmap_idx = mi_bitmap_index_create(field_idx, bit_idx + 1); // start at next one for the next iteration + previous->bitmap_idx = mi_bitmap_index_create_ex(field_idx, bit_idx + 1); // start at next one for the next iteration return segment; } } diff --git a/src/bitmap.h b/src/bitmap.h index a1e7686a..f8898935 100644 --- a/src/bitmap.h +++ b/src/bitmap.h @@ -35,9 +35,13 @@ typedef mi_bitmap_field_t* mi_bitmap_t; typedef size_t mi_bitmap_index_t; // Create a bit index. +static inline mi_bitmap_index_t mi_bitmap_index_create_ex(size_t idx, size_t bitidx) { + mi_assert_internal(bitidx <= MI_BITMAP_FIELD_BITS); + return (idx*MI_BITMAP_FIELD_BITS) + bitidx; +} static inline mi_bitmap_index_t mi_bitmap_index_create(size_t idx, size_t bitidx) { mi_assert_internal(bitidx < MI_BITMAP_FIELD_BITS); - return (idx*MI_BITMAP_FIELD_BITS) + bitidx; + return mi_bitmap_index_create_ex(idx,bitidx); } // Get the field index from a bit index. From ee92b337b9e0f68f28a5eb374e5852c5e60baee3 Mon Sep 17 00:00:00 2001 From: Daan Date: Thu, 24 Oct 2024 00:13:07 -0700 Subject: [PATCH 12/14] do not reclaim segments if free-ing from a thread with an already abandoned heap (issue #944) --- src/free.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/free.c b/src/free.c index f2e5f8e3..a85baa55 100644 --- a/src/free.c +++ b/src/free.c @@ -236,11 +236,12 @@ static void mi_decl_noinline mi_free_block_delayed_mt( mi_page_t* page, mi_block static void mi_decl_noinline mi_free_block_mt(mi_page_t* page, mi_segment_t* segment, mi_block_t* block) { // first see if the segment was abandoned and if we can reclaim it into our thread - if (mi_option_is_enabled(mi_option_abandoned_reclaim_on_free) && + if (_mi_option_get_fast(mi_option_abandoned_reclaim_on_free) != 0 && #if MI_HUGE_PAGE_ABANDON segment->page_kind != MI_PAGE_HUGE && #endif - mi_atomic_load_relaxed(&segment->thread_id) == 0) + mi_atomic_load_relaxed(&segment->thread_id) == 0 && // segment is abandoned? + mi_prim_get_default_heap() != (mi_heap_t*)&_mi_heap_empty) // and we did not already exit this thread (without this check, a fresh heap will be initalized (issue #944)) { // the segment is abandoned, try to reclaim it into our heap if (_mi_segment_attempt_reclaim(mi_heap_get_default(), segment)) { From 532904c85c23f777f29650eb48bd61f1115e2bab Mon Sep 17 00:00:00 2001 From: Daan Date: Thu, 24 Oct 2024 01:01:53 -0700 Subject: [PATCH 13/14] update mimalloc redirect to v1.2 to handle static destructors that free memory (issue #944) --- bin/mimalloc-redirect.dll | Bin 68096 -> 70144 bytes bin/mimalloc-redirect.lib | Bin 2874 -> 2874 bytes bin/mimalloc-redirect32.dll | Bin 41984 -> 47616 bytes bin/mimalloc-redirect32.lib | Bin 2928 -> 2928 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/mimalloc-redirect.dll b/bin/mimalloc-redirect.dll index a3a3591ff9b07edada16ad83ca1391963a126b2d..dec318976ca1b881bb5d165eef8d762533ed9b6f 100644 GIT binary patch delta 10362 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 ab;Ih8)eqLZSo2}ck2MTyHyaijFaZGT>DlW5 delta 8766 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 b&{$xwz+%CKg)Sdu}wh8 mc5?7A^;J){WtE!j%O1;e^xUuClh?7swQEBqH*e(VWC8#<+awGC diff --git a/bin/mimalloc-redirect32.dll b/bin/mimalloc-redirect32.dll index 522723e5017b71b458afb4152bd6c7eec55e9e62..049c298189737481a44fbf45c1ed71ce86eb1d40 100644 GIT binary patch delta 8480 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 Date: Sun, 27 Oct 2024 01:02:13 -0700 Subject: [PATCH 14/14] update mimalloc-redirect --- bin/mimalloc-redirect.dll | Bin 70144 -> 70656 bytes bin/mimalloc-redirect32.dll | Bin 47616 -> 47616 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/mimalloc-redirect.dll b/bin/mimalloc-redirect.dll index dec318976ca1b881bb5d165eef8d762533ed9b6f..ed001d64f7f70516577b3f3724b9a1279b73d51c 100644 GIT binary patch delta 6805 zcmZoz!qTvUWx@-o<)38J8KB?;gOUO_6Q3qS4g&*&-DD=lNt{<085kHE7#J)jGcxN; zKFO%gXgK*Jqd(UcDMki{2@DJjO_RNtv>E?RE@M(>WScyXNu7~v@-ZfLMuE-mm?RkM zpD8miykz8JV0fvc%fRqboQZ+qrIH8(!^>I)28Nd>gc%rKE(US=G#D6OcB(Qky!^t! z!0_@sNXIS%28NfSJPZskFMtSckh*U|3=A(P$}=#$T*J=5@N&8<1H;QtAZ@xJ1AeG5 zFuXKoW?*<(2QoR5(UO7TrHUH^!%KM`28NebAlpSjMk{zQFueQ?GT|Bn1H(&2JqCuC zHXx(J6&V;_USeZlnEX)m(BuZzWUHJ17#KXdd2iJ*G8|*!VDM~Fdh|; z?hq9P59W&=-KRXdMQv*s8ThwxcJK&zbh8@NFfw@jKj6{Hs#e3u@Oq9%FRLh67q3{& zQ}lyK&ab|F2?X@X$Wt(S6XP(?!L=quWKLz{Ao-#h_TtqtW*660ozlxE;NBfXx_XVF`R;ynO4E)u ztX@`sh_Zl6a41eTkQd!NfqOM8Q{m^ywt~wT?{0n~c$b;u_dBp*e>R^K-NVT9yp55e z^+1WKN3-qY$rHtOn6|e~-Y=fS;@!r`FnMEy^kfGKb|%sC$(|B&j9({bNaQoMmTkT% z(aXf-_HuKEv>PMit$3nv@O*>bQoFoL4*-{dkm1;%5Or^{I~&90w(Nlu?B zyM8mX{2@k*ZMC4774_+MQE})FQLz98fWd#!1+|O}6PjyOESO70J(_Jhz^b@Gf%9Lq z1|&CmV}$(V3oI;?6%^TdLcr3(9?iC1wUdn%Lj=BnQa}mo%RLMX3?9c>A5EUF*u@lG zGg(>b6Jx<-G36d>9~BNzfO8x^0|Fk+Z!BKCuw-BWMXZ8HbB&4u12|a;@8AF#k$r#> zSY#Nx$N zPKcofAVUopO4*GMygUFhvfD+)VDb_bllo2<6%~--2K?JS*#QD+k@i;$G`voyAOa&%kb!A zgbMS#`1ltl3`<*`E-DTnX@}R$>@TAy+o*<2?o-WT6rB81RiEj(*<>v>XQne|lk?T; z7&RupQ(IXd0kW%tp@avdtHR?rxcmZJ^n&LO%*UVzgLv^S$idwqDg_`V7B3W_N{~Zg z7f4BSjYAWdozCfI6Aj#73o_q7t3@@PK5 z0g6hE*XIR50tz0@2Sh*u3a`5-+p7jnzQDpY*+El|aogm0%^s$oos$zZMJF?9S=V=f z{MJ21Wd?}u^-;-q@yiGlbv-Je0{n%*Pl(?Pj4y#aYw)6<3F0vgP$+9KlyHNr(`c?x zfP|(vBS^E0ibl7G!i&v6U_LTH_{hQIxQmJfC{kYYdUV&js91mtG!Wel)+h0z2BOc> zMa6=@`3T5ipgae%-=dqR<3%h)8XORi@~6{9#RF7odU$mAfPM0!=q4!L@wYZYb!&8c zsJu|Y)HvB%gEIq^S^2l~c)Z~M@&A8Xr;7?G_kg@0^WyDyEMAD<-wsyeqY}~0)A-^f zHZ|aQO?b`zQuP1-|HcPA8jo}^OxBlAnXI70YMK5W5~|3lLnCb$Cj-cj3NKE891V{A z<{A|ZNcQFghx6pMI!co-=$J7coXoB}IgJSv+Ta4dxkd$=Wfy}qgR*RQM+*Z3!;5!c z|NjS>1#)wQwTp^IkqnsW0uJp99=*JKq8S)oytxK)=Iacw9LO04-8~0EiQ~oE$**)( z7&|8O>*=uEW@KQP?BJ*{`2vgfJlRTp8fSgn&mcZvsg3fvf-jPtMg;o_v8tV)6$)eMZ~K z3i{46FF!-P*6pGaVd`` za-n4=D;ros(OQ4<1s0*n3RZh$4NroSe5okRvKjsi3@;i^{{L@u;I+nNJumUe0@mD2 zpH6I+wU%aP@9|+^cya6KWP7{!T-&@E7+yR%0O^eSO1cVJ+6v3&AruMAPmU`B>g_6>|Le=;yIbi1eobh3&C zZ}#wB&1iBFq)LAKe{i!X0hDYsJi2*Ky!gBgl3EO2F9W3)1BOzNg}Xtjy(g>tDl^^L zHrdBlnr$jbgnx3bZy{s&EZvac?U)xV>yAC-{kIctFJiUa%t+dqV|1UMzwr zHnN>O$4^0D0V?kBB6TY?@JnSujiCTg41iKMpDhE!iy2%0|3Ai>=Rf(i-wnp1$w&NE z*uK~>FudrS{LWvSQD(DLz%MRIe`iorN&=)CxhZAoJXtq7UE;bER@sA-*F;}uJUF=} z#*=Z`LSAWZQfiSx zX0bwMURh#JW{QG_L4|6CCd5$;ejzaB#hK}Oi6x~)spx8R;EEX-7*aBeQj<&aiz-2? z@=Hq;^3xQG67$kiA;#;0%va4RRY(F!<>gc=fH*KsnW@EKd-Y0ED@s5Pm@L}3da?ks z#O4Ey4_GD_^gA#bY~I*!&&YUUvSNq%<_nz`jGQ+m|VC5WF}ap%x8#28k-AOoo=AwmrxCIbV*1P~1t znryLAU~@=W2BXjckQf64!v!e);0werKcIY$uMisqpft#VAPn(~kOEZL07`p&-R!k7 zjZrZH$}fP@9Z*^!0b*Rk=7;Me7-70MKxGd==?n1?RR)_Mt`BE4y#W<|0i{9qgRnq4 zL>Y(;!atz$GgdJ+Fm4Vkb7nN<_y$oT0i{98K)3--s|Hkl0Ya+jd=>jMXQUbySn+-2SFiu{1ntyY^@eD@E9Z>lbP#UBLgbg-7JQ~j^ z`2Z^X0ZN0UK==bVCMOzjO8kU4LjX#HBtf`f^TVSFj0#Xu11RkPr5_|gbWPYCcq*Jx zF#;-_0i_$D^a7}|fX#uYBH)ItfXeQG(hA8C!!Cdgle_>GegUOHt^r|#%^T0fGb%Ft zf~b~&(iTv<02=ZWAmJDR6Nb_iP#R&f+07~zG(x~yMcmXQ>0!nlIhB#sa z)Y1)LOC>d+!X8i>WDyvHQ^Q094#fDyvD*ORTOZ zu$l4Zf2GX{We$v+{x~q!v$QZUY|v+5c%;w3@TZx9;e$Q{L$Lt^!ni&`_ z*fB7)IWREXX=Y$xaAaUeab#fF)6Bro;K;yG;l#ku0&<)a1A~Y&14Bv+1A~Dx1H)Wr z28NiHdIp9A&I}AQT^JZjS{N8ExG*rNxH2$=v@kF@xH2$^xG^yJv@kFPxG^y7aARPY z(!#*-z>R?+%$}g?O5b$MS zDD`DvxYEMFFu|9BAwPhD;RwhPfeZ|@>w_2=?tpw5%)oFjn1Nvl$oC-(3^PL+80LV) z!x$L4!x$J`K)w%SV9*R_U@!qWD4c;IFM@$#4al+x28NB13=B3c3=AJ485lI885p*J z92d>NkPySbaHfTUVL=Q7!=V@kh9@9T#xO8^k6~bV)55?|&k)PNpdQP>@CD?eSO$ie zSO$haAm79?FiekSU|?xwU|0~#z;G~@fq|!$f#E_d1H-3S1_qH<1_p*W1_q@#1_qf{ z1_pyT28N(G1_qT@28M(<28Q-H1_qs028Ic73=DhX7#K`IdgB-v7~>fjY+4x@1VD5= zLp_5_D+5D7JOe{xJOhIdNJBgW!@+n4h7gd3cm{?S@eB+xtqcqw;u#o(5*Qd#S{WD= z5*QeK5*QeAK$ayiFic8dU?^#2V0e(gz#yK;z)%BnP$C0^M3=C6R85j;E)-y0XOJrb}1F|5Ifk7sTfnf%>4v2*mMSdQSe~$a#)<_iZmbYkC9x`CRmbWHt52+E zSj(~2VQs~_hIKpEeOUhkWYz`-1`h@X27?6|3kw!LSoC61#FB(18A~dbT&Q1qW9fsX zAC`J74_F?tJY)HR6(?3)Sn*(m#VUtY9;+f&ZCJfywZ>Y5wF}m*SjWJ?aDag!g@J)V zVu8Yf2@7W|T(EG%LXO1(izOCoEN)oRv1G!M8A}!{`LUE?8OJh#WfIE@mRBrqSl+RG z!txg@KCEC^DX>yvWx}eARTZl`R!vxSWA%g8^&eI3@;;985mxE;b35R zc^;&r%YcF5r6>;r!^;aGf*Yjnn-BxTOGkMIhL>yD85mxsyD~7mJOt7fs{t}kg@NIv zF*5_h%Q}$Bk&Kog13_xuYcnvsv;x^K3NreGI|IYZ-yjpNF)%Q^{HV*o@X`ik^mCB2 zF0nB%OnxYOXmSH~Sf1(nurk8i~&&l3g za@Lc7f}9YdqT$oc+F!}Y;G=!Wv-^TiFKg9L1_u6ZER2pFE&~5S#%XwT`>0rWFoW&r z<&F9|c?s8Kmy;C`{}eI3w)E&_-Sz`y9PjoDkQYK!I66c)Ji1v|RKPqj55($a?T09v zPyr6b$p-SGn0GDg|WPXzBWb6CFv8)mclr05<-9`!axhSmcmrXJ0< z%9AIG>o9$9oxEQ>iKV-hkzw+~2jT3xr9S^f~C z#kU$z%!>MSyQnyHhp1S90>I$E=z|(Yh6&9zDi+M8q8`n*C%~$>L4osMbPq^w^1}%E z$ro5yCMzhi^GpFt3wt!%cGXNaRtym^0SmCc+{3`Y;BlN)Y4UW%E~eSlla-Y|F*-~Z zQ|_7kNm-X;@4x^5jZeOqK3QF5u7Qh60z6g?Kr9DPggAI4JJ^8T1dWtV7myoWR4gWc zQ87sY$yo4j_hhp^SQ`aWui?0Z6=Y|xsALK#U{Ac5bpQYV)&r&H9?dl>84M)?U{&1? z93ZV39-WL(J`ad*fUv{^B<}H={bl9kRjMJA)G`$bGv<19A30TRatx%6C?-5QIY5pqkN_DC&JEyjgSZ?NZj9!V5f@;)Crv~DyS(% z0X-5upg|A-3j%Pg1i*p-NxcQgjTX&{6$%XeEssF4paK7O z7LT+}7Zq^)SadtcfJ7BMm@UDDRHutd0snTetdB}TH%lW_7A9E%GN|G;`%B0F|Nk2w z@Mt_TgJH71e9>eF9aiTkLk0#=Y$$+IoB{*5AlHM15;&oN0+|sUgBl<;8W1&HAWJk} zNH8!kOb)b`m|URAsgkyf6CAD%FHV9&0vtijH7Zb3IYG`)m|Ul$GpGJI zz#$AS$(w6b3?K=jTQl}P=&0M*9$04meV(6%$*#d?<^zv<^O+>BfDKx zA}n20G|ItA-k{rq-85f#!e0}kYlu)oNo}o_+at@gQ-U1&5R77fB}a~E$d5m zP#Mt68xX<3@Z#+yNEzYb(Ho)yPDCF6MW1bMHw3q5xJru)b^sX$R%I z7YimCtElOOL1NS4HIGLxs}_t0N_P$(y}X(rL-a3B_AFvSaUNeo!sneEzQjS$D4uS1=q33 z`F8KQ)Ie;JqaXu8#lZ!Z6_X1bs+rslPre_aIGN8;nK5&+k>do$j>(4|wb=f9GBCVo z-Tc`xi&1622LrNARTb_YZ(Kgn~sL74a*V(_gGcdf6 zIxsojkC4Ryy1up@;ka|M%z><#z`aEIuj*FP`lC|Gxv2PU@FHNchMS#w(7ylw`L`WtJy4j zJp;pw>yv+bWr)rUVq_>~-@y3tCj$dRw~I{K<_hoCj3$l_3=A*)xBmyXUJ^h_ zSi_^6=fn$TkPs+qyY@b}?E6v6V60x5=*SCZL&|Fh+*| zs_VhzMliV^Dag1~CZ;GcfWoGVm>8 zU|^JBWRN&Cc~`Nss2CH27^5x&BPSyRXA%R1R@y97!py~JvRSO|4kNRXCd1^f^+8NV znv)rskF)BPq*jzn-rKl(b3@Yu7Tyc*85%&%{TCp5G9$CeX3idSM$R7~E&~Gt$K;0{ z=8OfKCw7@La!P!FsMXl~up^(5(*nx%0IAtLq054iGXg4<0T%kvXTiu>02OKg2{Afs zUf6EVI60x+VRJ*T1taGUsO$xh?B;~Y7L1$^ph66jFLs-6E|_4!IN70>gVA8~#)5MBDNcY2&4AJ?pfn^Z85jySe_R;OsJI6z zd;&^efYLB!24H2AKg{OfdI6RC@o96`f;2`&fzJ@fDL`ohC=Juv0M;t#0u>H`(g~X{ zE=gzPEP!$wHW$v#XXKm#<*tBm4?wvWAlwH~?gucJkzumsGI>U*4=lbwoZ$hb1E4g_ z84w>RCP0M?pmYb6J`fMluCRIGhH%Eo5^DsQPJG!sX+s*L;sdCX4^W!nD@5r6s1^pW z7E=kRum+TdS^OXkq8!GzfXd%k$=JZSIk3!`(bNMf6al4SN(0hSwPrx&A0V_=K!qki zX_(drXj)f5w_JQU8TxB@D)14>_j(a8`?Hf#>uAI`}60xHa~dEqSO zDuA*9$bf?H5QP(<^adymv)Tb{&t!!|9D*;O zRREPz081&}fC|5W(m$Z|2dJ_IU}cg5KOqKcKxvpe7&aH4k7rbLfC@)I=?W4H@C#zF29)-I(hX1x8^9JyW~3lL|ofC`_0(l4O2Kq|!a1z=MY1%5-g22eTzN+&>-9oT&E=6|J4{~Q?W|1>i& zEYN3QP&Qy-_|nY45MaQ-;AY6cum&V<$iN_G%)oG@nSr6fn1SK32?N8HW(EcaQwD}= zQw9c>76yh1rVI?+W(*8-ni&`j%orFpnlmsgX=Y$huwY=wwP0X)1JY~3z_87NfkCH* zf#HG$1A~(#1H+SM28IMnhI$4UD+UIY76yg}D+Y$^RtyY0Ees4FtQZ&;STit)fHYV$ zFof7JFvx(^*f21>vSDDj(#*ghV9UVZYRABE2INpX28J*P28KJ$3=9_>7#K_(85s6} zJmbi~;Nir;&;oL(69dB&CkBQTP;bPUfg#tKfgz@)o`GS4GXq1W3j;$*3j@Of7Y2qe zE({DIEes3-t_%!MTp1XAS{N7<+!z=-+!z?9v@kGiaAROlb7x@4X<=XpaA#n!^=4qG zX<=Y+@L^!6^0a@n5z;MKefniSz1H%I!1_oDO28Jsw3=9dr3=H-G3=Bs=jtFF6 z$gU4!V7LSFWe@|yx?l!|B_Q7iGcbS}_;Wzwp$rVsVGIl|Am4{EF#HT-U@!qWD4c=8 zE`ot!4al+x28PB+1_qlJ28IKX3=BV_7#OyI92d>NU=YK=aHfTUp&*8VVNwhO!xNAv zV;C5Y$1pIwX<=ZfzYxQ~@I8is;S0z`u?!44u?!4Sc-7vmThY+4x@9>g&)@Wg}Szmi}U|=X|WnkEl zz`*c4fq|h0f?jHwI^JZ%gN z0;voPZmA3mB5e!|38@SW3sM;vWZD=QHl#8zTuNnNP-$aec#y`xV3p3mpwq^{5RlHm zuq&N`!2~3p&cN^^gMq=O4N|f!w_s*u7WO*?YAG@>FP3~*qOmk#S;n#j%Wf=xuv}tAz{-e~6IPyBbzv39 zYKJu*YZ}(I^SiE5Iip4t?3oMnW zU#hUwU}?v)3Cm_ITd|B`1;+}36$&dVRyM5cSUF?mhgCmTWvnS!^I+|ZwGrzR)-xPn zV8~!#V7Rd0#)1b6J}mH96tE~_QO2SJi%%@Ru=vK}2a7G1IxO{A8n85C>4s%HmK|7j zV%ddd8Y>J|IIIX*5wT*y$`vbjtUR&u!b*wN3abrPJFKqvSUq9Qj5QqV1lCEc(^%KA zzGMA_^$XTBT!8cmek@>E$gxmjVZow`MGcEO7EM_6V)2K?2}?7U7A$R8dSlsxWiOWf zSOzjWV+F|A2P+*`d#sLFy<^RRH5b+xtg~3>u+C#$z`7OdH>}^W{=oVZpwM{0z!1T} zz@V^DW1)f9LW_kC3ui1^uxP^~fh7`46qaZ#F<8>Ebi&dZOIIvqSkAFrV7bI{h2<41 y8dh|yn6P5TiVrJ)tmIggvASS&#p;ID9jhO#d9mihnjdQzwqF!v)MsL1U;qH&;|k>f diff --git a/bin/mimalloc-redirect32.dll b/bin/mimalloc-redirect32.dll index 049c298189737481a44fbf45c1ed71ce86eb1d40..ec4ff1d521292a6fd1403d35c825e1cd1b060b3b 100644 GIT binary patch delta 5053 zcmZqp!qo7EX~GNU1)pRmzMjdc!OXzGP{6=oG5KSd&g7kp>P+W?CqH8JV-kBh*@&r( zaqZ@nOs$O0c_s`DFFQFI7+x-sXJB~wo}Yo?Mi85mwNm@zQCyv@YG@KQ~U zf#KywV+Mwof0P&)UZyKEFuZ&O(k3f2xsXNNEJc=q;ibO{1H;Q%AahI^85mv)fW%(& zGBCUpV`E@=$p|ub4@hjf6a&M{Bt`~?$r~jPO>STfG4Szb6gbx4ahgGZq1hJ1VJH#a z$;iOKkbRMXe_s2zGFpKZH!v_1D|fqcFuVTg<^_p# z33N;Zsapu*G#_AG45DA}hDaW31W7SWW@Oi##9_ze<2~7dBUKEfLfiF2r|Xw)-!Im_ z62&Twwm#mIcXQZUK%{(I=0l8~VDrF|&_I}cP*8011I}_5 zCWq6LBl#vU`FL-B&3BTC8)O zHo{RXAW@J}Y@yw6GBUa*ZxdEz%IKPWQ#g((qieIJh&>aN!|BacV(N^He>N`?S7rps z9+%K%|B%8c05a;ggfvJVJ;PGwgs8MP{P~o$`kNk6vSyh!V-IkhhcI)n}mQZNGU^!P&1gpSTZ?> z%X9JqX%2pfIP1$<3=9m%S-(u)E}g~rWwMgYZYERB$@gVijJjPpVh^8zg3#_afiJdd zFfeqw{%NlL!vIbo{5x0}7#I#dVCeS!)9u2@GMSNGda?o=>*Q2fS*AFR$t|*p^&(-- zwLA`%4*d}HB8Z)V0nGiFKgl->Bi%Sj9j z4Bf6@Sbs2p?EGPTGOg41&uh`N?$AGJ&4(D%Iz#_-yZ&fCpwa32gMWMJpKjkT{M!TB zf?h292R532`vL0@wZ1-CtQkJ73qrm0Xs^hJM>4l6Gy;{WQd+_ zU!G1zuozFk3x9|hGbo+D>2`hdn&tK6Mqc~L>*d@T8zz63Q)7&uEGMtc7(3ZZK8Eqm zGZV7Dtrz>ADOP?O$dF?RdD34Ae~85C|DusDeT<=W8h&_B&q3?<&( zu78>}m^8L|VsQ?L&i{SA1(e0!V@S+-` zk=gZ2r|X;Jt{*^Y<~3)x?}z4tjGew8z|kWS@FE1F%+mD(e{=l=kbaQdn{Jk_fESh! zIj|8gx_w^+c8Br=z4-nB=22x zPS-zR3uOXcJoyRI&H^^{0snU2Ki#1Zz_y+KDT^`F#VpQl*FOO-=7J*n2uG(YI8eZuiVYMajy#hY*~KRpSaMEYsVvWUX7Wj8 zA4Y-6;wo}cFTh$rQ3MJ{a9#m>ALONyz!#A}z>ev3{lLFHl*c;sLy;6HmGN))u8V?P+0g}s0e%^KeKBmI1B|3?<^AKw}EXxC2sM z30KYBJy}phWpb#hG}E7NlZ#ZXm^OTyyiQeuY1+5RCsZqBWxj#TWnumRPO&^eFSsEB z+8?@)#Z6{pSDviE#>o=!Lg((}UbSLfl>$bAPS-chwQm?|Szm5sU|`5N0P9k4N- zt}l8+9|U!~z6kg)sxnzu{Vsb5NP5cc$$}aZOntW}Yir0!CbTjLykyvM3d$Vu24v~APU@|#Cn`3i^jw2(x14zO3tCKhA zHghMmF$jQD>X$2%?etujR$iIhqNm860TOoQ33$UzDWK=LX3$jL_^+2f{C`mf81a$jybPEP$)PMrm{_NyLvs|XdXC_}T zYi5+29Aa+H^z8KH3ueZX518AsZvm;9b9yq1MX)$SDx-k4D@Q5&2F8~Mz`p0`pnT&i&@Iv!^x^?ngr(E<%j@mn3QRCV2c+`w$;o#u6Q zGr7uo0n^6glVxmV*d0L8U4MMCy^S(c=JCxbHecApIZ{DwA2C=EfGU>%q8zD{^PR)R zd9caxq)xu;Je%puzR6WC4$=Z(B~sn4A^{K=@C1SC(f^_Xshh95hzd=5RhXIl zf={yPpn8Uhfq@}`fq@~Qn1LZ68YIHNu;7#IX5|P&W`W*n#r1hs%ly|$tn^Bebj{tI z65Y$fXukPV{0>HD!(`3LYZJY|^vAGm^)CLw3K^-1DXB#YxrynS$qIR;xk;%-3Yo=CG=4 zV-TY}i;N&3FOCXRMjLwn(1w1BlJKW*dXR36R>!A4=v-eo(@~_y@#e zG?@IcWHzhFb_M~H$rCH2C!3VaVGY>MAP_NmV#RjWlDat9`MZLEsBWWCz3q z2aqV2$PNYpnH>xQIy)x+Yv06Svx7mvX9t78|hW$vx7n42Gn4P)86c05cmNS*$J@@;xvJs3<3%}83asrG6+oYW)L_4a)hAI zP6mOPoeTm6I~fEHcryrm0Er58>|_v_vXenz2}s79L16NMjx{oSb}|T@fEp+$$>4~MKX3V2-NIi5SRc}KEWRxGAjhv>|zkuvx`CC2vh>>Igu;77zAGIVi5QP z63<3;b zQJK9A0vdZ61T6M42t4p*5O4sA^7`y$5J=byab5#RWTF9!NX1?TfeCvV1lE8I@M93T z0Co4|fPNO<2YVR=UO;s~g73#(1_7RZ3<3)KP(w+?VjqJ*z&-|noP7)e2mBZW9zf0E z?b*j5uwoy?)(aGOFPvLk6P<#-ELOOkSC2ni`o} zn_e}&XZp!>vqh(suyw2TAM1^_tL@I%McFerFfiCKFfiyF*cb#DY&GCAv@*VHVs7eV z+GDoO?6%o&voiB;^9knb&5xL$G=E|K*PO{h+rrx-(n7+LA%KBFgMp!*!NS1TV41;g zgIR`~4S9@&j3kWYj8u%Yj0}v-jBJdYj6fp`7NAC^RgP7Mm5Q~7wTtxw>nGL>Hgjwi z*zB>1u#K^;uobbBursl{V0XptgI$mP1p77i3=4Uv5>Hou~e|su)Jb=Wf1FSi0cx;Z?oUm!IZL#gJonUKY z=V0ez=VSN7?vEXVJ&Qeu{TBNj_IvCP*dMWHU|?9lz_0@}bY)OtP*HDCW6)rrV`yM# zVd!A!V)(-Fjo}x=KZXoOON>?+Z7|wlw8tpHIK^1TM8QPGM91WY$sLmiCNE5;n9eYr zW4gpNz%0Zp!Ysxt!HmaT!2E>y8S@L~H_TfsIxKoDrdT*wx>)*H{;_1R;;`Cbwa4m+ zRf%n(He%So6Sz)`zc7yE}+a0zkb{TdBb_(_?_8Rs& z_6GKM>>t=av43OFuz`UA6csZJ<`^t6SYoikAjB}jFvc*!FvU>7NW@6S=#0??qbo)? XjP4k9821=YFrH#O!+7(+9=yfkHGV0hU85_`?d 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