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