From 4b63c76861647332f0d18e9af360917cbc166182 Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 10 Jan 2022 11:40:36 -0800 Subject: [PATCH 1/2] avoid conditional load on macos --- include/mimalloc-internal.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/include/mimalloc-internal.h b/include/mimalloc-internal.h index 5f016640..3da9a0c8 100644 --- a/include/mimalloc-internal.h +++ b/include/mimalloc-internal.h @@ -154,8 +154,8 @@ bool _mi_page_is_valid(mi_page_t* page); // ------------------------------------------------------ #if defined(__GNUC__) || defined(__clang__) -#define mi_unlikely(x) __builtin_expect((x),0) -#define mi_likely(x) __builtin_expect((x),1) +#define mi_unlikely(x) __builtin_expect(!!(x),false) +#define mi_likely(x) __builtin_expect(!!(x),true) #else #define mi_unlikely(x) (x) #define mi_likely(x) (x) @@ -346,11 +346,15 @@ extern pthread_key_t _mi_heap_default_key; // However, on the Apple M1 we do use the address of this variable as the unique thread-id (issue #356). extern mi_decl_thread mi_heap_t* _mi_heap_default; // default heap to allocate from - static inline mi_heap_t* mi_get_default_heap(void) { #if defined(MI_TLS_SLOT) mi_heap_t* heap = (mi_heap_t*)mi_tls_slot(MI_TLS_SLOT); - if (mi_unlikely(heap == NULL)) { heap = (mi_heap_t*)&_mi_heap_empty; } //_mi_heap_empty_get(); } + if (mi_unlikely(heap == NULL)) { + #ifdef __GNUC__ + __asm(""); // prevent conditional load of the address of _mi_heap_empty + #endif + heap = (mi_heap_t*)&_mi_heap_empty; + } return heap; #elif defined(MI_TLS_PTHREAD_SLOT_OFS) mi_heap_t* heap = *mi_tls_pthread_heap_slot(); From deda8bd22b11061a23748750654d1e71b9043652 Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 10 Jan 2022 11:40:57 -0800 Subject: [PATCH 2/2] fix g++ compilation on macos --- src/alloc-override-osx.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/alloc-override-osx.c b/src/alloc-override-osx.c index 63297c4c..af79d64a 100644 --- a/src/alloc-override-osx.c +++ b/src/alloc-override-osx.c @@ -200,6 +200,9 @@ static malloc_introspection_t mi_introspect = { }; static malloc_zone_t mi_malloc_zone = { + // note: even with designators, the order is important for C++ compilation + //.reserved1 = NULL, + //.reserved2 = NULL, .size = &zone_size, .malloc = &zone_malloc, .calloc = &zone_calloc, @@ -212,18 +215,20 @@ static malloc_zone_t mi_malloc_zone = { .batch_free = &zone_batch_free, .introspect = &mi_introspect, #if defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 + #if defined(MAC_OS_X_VERSION_10_7) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) + .version = 10, + #else + .version = 9, + #endif // switch to version 9+ on OSX 10.6 to support memalign. .memalign = &zone_memalign, .free_definite_size = &zone_free_definite_size, .pressure_relief = &zone_pressure_relief, - #if defined(MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + #if defined(MAC_OS_X_VERSION_10_7) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) .claimed_address = &zone_claimed_address, - .version = 10 - #else - .version = 9 #endif #else - .version = 4 + .version = 4, #endif };