From d2e727f0e871cd35305bdb7bc3983cf607441752 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Tue, 18 Jan 2022 21:11:12 -0800 Subject: [PATCH] Add MI_SKIP_COLLECT_ON_EXIT flag --- CMakeLists.txt | 5 +++++ src/init.c | 12 +++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b56953c4..76c26666 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,7 @@ option(MI_DEBUG_TSAN "Build with thread sanitizer (needs clang)" OFF) option(MI_DEBUG_UBSAN "Build with undefined-behavior sanitizer (needs clang++)" OFF) option(MI_CHECK_FULL "Use full internal invariant checking in DEBUG mode (deprecated, use MI_DEBUG_FULL instead)" OFF) option(MI_INSTALL_TOPLEVEL "Install directly into $CMAKE_INSTALL_PREFIX instead of PREFIX/lib/mimalloc-version" OFF) +option(MI_SKIP_COLLECT_ON_EXIT, "Skip collecting memory on exit" OFF) include("cmake/mimalloc-config-version.cmake") @@ -102,6 +103,10 @@ if(MI_CHECK_FULL) set(MI_DEBUG_FULL "ON") endif() +if (MI_SKIP_COLLECT_ON_EXIT) + list(APPEND mi_defines MI_SKIP_COLLECT_ON_EXIT=1) +endif() + if(MI_DEBUG_FULL) message(STATUS "Set debug level to full internal invariant checking (MI_DEBUG_FULL=ON)") list(APPEND mi_defines MI_DEBUG=3) # full invariant checking diff --git a/src/init.c b/src/init.c index c0f09b5e..998649e3 100644 --- a/src/init.c +++ b/src/init.c @@ -516,11 +516,13 @@ static void mi_process_done(void) { FlsFree(mi_fls_key); // call thread-done on all threads to prevent dangling callback pointer if statically linked with a DLL; Issue #208 #endif - #if (MI_DEBUG != 0) || !defined(MI_SHARED_LIB) - // free all memory if possible on process exit. This is not needed for a stand-alone process - // but should be done if mimalloc is statically linked into another shared library which - // is repeatedly loaded/unloaded, see issue #281. - mi_collect(true /* force */ ); + #ifndef MI_SKIP_COLLECT_ON_EXIT + #if (MI_DEBUG != 0) || !defined(MI_SHARED_LIB) + // free all memory if possible on process exit. This is not needed for a stand-alone process + // but should be done if mimalloc is statically linked into another shared library which + // is repeatedly loaded/unloaded, see issue #281. + mi_collect(true /* force */ ); + #endif #endif if (mi_option_is_enabled(mi_option_show_stats) || mi_option_is_enabled(mi_option_verbose)) {