diff --git a/ide/vs2022/mimalloc-lib.vcxproj b/ide/vs2022/mimalloc-lib.vcxproj index b0547769..035adf8d 100644 --- a/ide/vs2022/mimalloc-lib.vcxproj +++ b/ide/vs2022/mimalloc-lib.vcxproj @@ -178,6 +178,7 @@ CompileAsCpp false stdcpp20 + /Zc:__cplusplus %(AdditionalOptions) @@ -197,6 +198,7 @@ CompileAsCpp false stdcpp20 + /Zc:__cplusplus %(AdditionalOptions) @@ -224,6 +226,7 @@ CompileAsCpp false stdcpp20 + /Zc:__cplusplus %(AdditionalOptions) @@ -251,6 +254,7 @@ CompileAsCpp false stdcpp20 + /Zc:__cplusplus %(AdditionalOptions) @@ -283,6 +287,7 @@ CompileAsCpp true stdcpp20 + /Zc:__cplusplus %(AdditionalOptions) true @@ -312,6 +317,7 @@ true stdcpp20 AdvancedVectorExtensions2 + /Zc:__cplusplus %(AdditionalOptions) true @@ -348,6 +354,7 @@ stdcpp20 CPUExtensionRequirementsARMv81 Sync + /Zc:__cplusplus %(AdditionalOptions) true @@ -384,6 +391,7 @@ stdcpp20 CPUExtensionRequirementsARMv81 Sync + /Zc:__cplusplus %(AdditionalOptions) true diff --git a/ide/vs2022/mimalloc-override-dll.vcxproj b/ide/vs2022/mimalloc-override-dll.vcxproj index be69716f..3c2ef98f 100644 --- a/ide/vs2022/mimalloc-override-dll.vcxproj +++ b/ide/vs2022/mimalloc-override-dll.vcxproj @@ -174,6 +174,7 @@ MultiThreadedDebugDLL false CompileAsCpp + /Zc:__cplusplus %(AdditionalOptions) $(ProjectDir)\..\..\bin\mimalloc-redirect32.lib;%(AdditionalDependencies) @@ -204,6 +205,7 @@ MultiThreadedDebugDLL false CompileAsCpp + /Zc:__cplusplus %(AdditionalOptions) $(ProjectDir)\..\..\bin\mimalloc-redirect.lib;%(AdditionalDependencies) @@ -234,6 +236,7 @@ MultiThreadedDebugDLL false CompileAsCpp + /Zc:__cplusplus %(AdditionalOptions) $(ProjectDir)\..\..\bin\mimalloc-redirect-arm64.lib;%(AdditionalDependencies) @@ -264,6 +267,7 @@ MultiThreadedDebugDLL false CompileAsCpp + /Zc:__cplusplus %(AdditionalOptions) $(ProjectDir)\..\..\bin\mimalloc-redirect-arm64ec.lib;%(AdditionalDependencies) @@ -298,6 +302,7 @@ MultiThreadedDLL CompileAsCpp false + /Zc:__cplusplus %(AdditionalOptions) true @@ -332,6 +337,7 @@ MultiThreadedDLL CompileAsCpp false + /Zc:__cplusplus %(AdditionalOptions) true @@ -367,6 +373,7 @@ CompileAsCpp false CPUExtensionRequirementsARMv81 + /Zc:__cplusplus %(AdditionalOptions) true @@ -402,6 +409,7 @@ CompileAsCpp false CPUExtensionRequirementsARMv81 + /Zc:__cplusplus %(AdditionalOptions) true diff --git a/include/mimalloc/internal.h b/include/mimalloc/internal.h index 25e30f10..a76f7baf 100644 --- a/include/mimalloc/internal.h +++ b/include/mimalloc/internal.h @@ -18,11 +18,7 @@ terms of the MIT license. A copy of the license can be found in the file #include "track.h" #include "bits.h" -#if (MI_DEBUG>0) -#define mi_trace_message(...) _mi_trace_message(__VA_ARGS__) -#else -#define mi_trace_message(...) -#endif +#define mi_decl_cache_align mi_decl_align(64) #if defined(_MSC_VER) #pragma warning(disable:4127) // suppress constant conditional warning (due to MI_SECURE paths) @@ -52,19 +48,32 @@ terms of the MIT license. A copy of the license can be found in the file #define mi_decl_hidden #endif -#define mi_decl_cache_align mi_decl_align(64) +#if (defined(__GNUC__) && (__GNUC__ >= 7)) || defined(__clang__) // includes clang and icc +#define mi_decl_maybe_unused __attribute__((unused)) +#elif __cplusplus >= 201703L // c++17 +#define mi_decl_maybe_unused [[maybe_unused]] +#else +#define mi_decl_maybe_unused +#endif + +#if defined(__cplusplus) +#define mi_decl_externc extern "C" +#else +#define mi_decl_externc +#endif #if defined(__EMSCRIPTEN__) && !defined(__wasi__) #define __wasi__ #endif -#if defined(__cplusplus) -#define mi_decl_externc extern "C" +#if (MI_DEBUG>0) +#define mi_trace_message(...) _mi_trace_message(__VA_ARGS__) #else -#define mi_decl_externc +#define mi_trace_message(...) #endif + // "libc.c" #include int _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args); @@ -644,8 +653,9 @@ static inline bool mi_page_is_used_at_frac(const mi_page_t* page, uint16_t n) { static inline bool mi_page_is_huge(const mi_page_t* page) { - return (page->block_size > MI_LARGE_MAX_OBJ_SIZE || - (mi_memkind_is_os(page->memid.memkind) && page->memid.mem.os.base < (void*)page)); + return (mi_page_is_singleton(page) && + (page->block_size > MI_LARGE_MAX_OBJ_SIZE || + (mi_memkind_is_os(page->memid.memkind) && page->memid.mem.os.base < (void*)page))); } static inline mi_page_queue_t* mi_page_queue(const mi_heap_t* heap, size_t size) { diff --git a/src/bitmap.c b/src/bitmap.c index f3030153..6214980b 100644 --- a/src/bitmap.c +++ b/src/bitmap.c @@ -184,26 +184,23 @@ static inline bool mi_bfield_atomic_try_clear_mask(_Atomic(mi_bfield_t)* b, mi_b return mi_bfield_atomic_try_clear_mask_of(b, mask, expect, all_clear); } -/* // Tries to clear a bit atomically. Returns `true` if the bit transitioned from 1 to 0 // and `false` otherwise leaving the bfield `b` as-is. // `all_clear` is set to true if the new bfield became zero (and false otherwise) -static inline bool mi_bfield_atomic_try_clear(_Atomic(mi_bfield_t)* b, size_t idx, bool* all_clear) { +mi_decl_maybe_unused static inline bool mi_bfield_atomic_try_clear(_Atomic(mi_bfield_t)* b, size_t idx, bool* all_clear) { mi_assert_internal(idx < MI_BFIELD_BITS); const mi_bfield_t mask = mi_bfield_one()<bfields[chunk_idx]); // has_set8 has low bit in each byte set if the byte in x == 0xFF const mi_bfield_t has_set8 = @@ -663,7 +659,6 @@ static inline bool mi_bchunk_try_find_and_clear8_at(mi_bchunk_t* chunk, size_t c } return false; } -#endif // find least aligned byte in a chunk with all bits set, and try unset it atomically // set `*pidx` to its bit index (0 <= *pidx < MI_BCHUNK_BITS) on success. diff --git a/src/init.c b/src/init.c index d5bfe935..31b0d271 100644 --- a/src/init.c +++ b/src/init.c @@ -246,8 +246,6 @@ static void mi_tld_main_init(void) { // Initialization of the (statically allocated) main heap, and the main tld and subproc. static void mi_heap_main_init(void) { if (heap_main.cookie == 0) { - mi_subproc_main_init(); - mi_tld_main_init(); // heap heap_main.cookie = 1; #if defined(__APPLE__) || defined(_WIN32) && !defined(MI_SHARED_LIB) @@ -262,6 +260,9 @@ static void mi_heap_main_init(void) { heap_main.allow_page_reclaim = (mi_option_get(mi_option_page_reclaim_on_free) >= 0); heap_main.allow_page_abandon = (mi_option_get(mi_option_page_full_retain) >= 0); heap_main.page_full_retain = mi_option_get_clamp(mi_option_page_full_retain, -1, 32); + + mi_subproc_main_init(); + mi_tld_main_init(); } } @@ -666,14 +667,16 @@ void mi_process_init(void) mi_attr_noexcept { if (!mi_atomic_once(&process_init)) return; _mi_process_is_initialized = true; _mi_verbose_message("process init: 0x%zx\n", _mi_thread_id()); - mi_process_setup_auto_thread_done(); - + mi_detect_cpu_features(); - mi_subproc_main_init(); - mi_tld_main_init(); - mi_heap_main_init(); _mi_os_init(); _mi_page_map_init(); + mi_heap_main_init(); + mi_tld_main_init(); + // the following two can potentially allocate (on freeBSD for locks and thread keys) + mi_subproc_main_init(); + mi_process_setup_auto_thread_done(); + #if MI_DEBUG _mi_verbose_message("debug level : %d\n", MI_DEBUG); #endif