mirror of
https://github.com/microsoft/mimalloc.git
synced 2024-12-28 22:05:40 +08:00
fixes for freeBSD
This commit is contained in:
parent
2e56bf55c4
commit
8bc20631e4
@ -292,11 +292,13 @@ mi_heap_t* _mi_heap_main_get(void); // statically allocated main backing hea
|
|||||||
#if defined(MI_TLS_SLOT)
|
#if defined(MI_TLS_SLOT)
|
||||||
static inline void* mi_tls_slot(size_t slot); // forward declaration
|
static inline void* mi_tls_slot(size_t slot); // forward declaration
|
||||||
#elif defined(MI_TLS_PTHREAD_SLOT_OFS)
|
#elif defined(MI_TLS_PTHREAD_SLOT_OFS)
|
||||||
|
#include <pthread.h>
|
||||||
static inline mi_heap_t** mi_tls_pthread_heap_slot(void) {
|
static inline mi_heap_t** mi_tls_pthread_heap_slot(void) {
|
||||||
pthread_t self = pthread_self();
|
pthread_t self = pthread_self();
|
||||||
return (mi_heap_t**)((uint8_t*)self + MI_TLS_PTHREAD_SLOT_OFS);
|
return (mi_heap_t**)((uint8_t*)self + MI_TLS_PTHREAD_SLOT_OFS);
|
||||||
}
|
}
|
||||||
#elif defined(MI_TLS_PTHREAD)
|
#elif defined(MI_TLS_PTHREAD)
|
||||||
|
#include <pthread.h>
|
||||||
extern pthread_key_t _mi_heap_default_key;
|
extern pthread_key_t _mi_heap_default_key;
|
||||||
#else
|
#else
|
||||||
extern mi_decl_thread mi_heap_t* _mi_heap_default; // default heap to allocate from
|
extern mi_decl_thread mi_heap_t* _mi_heap_default; // default heap to allocate from
|
||||||
@ -308,7 +310,7 @@ static inline mi_heap_t* mi_get_default_heap(void) {
|
|||||||
mi_heap_t* heap = (mi_heap_t*)mi_tls_slot(MI_TLS_SLOT);
|
mi_heap_t* heap = (mi_heap_t*)mi_tls_slot(MI_TLS_SLOT);
|
||||||
return (mi_unlikely(heap == NULL) ? (mi_heap_t*)&_mi_heap_empty : heap);
|
return (mi_unlikely(heap == NULL) ? (mi_heap_t*)&_mi_heap_empty : heap);
|
||||||
#elif defined(MI_TLS_PTHREAD_SLOT_OFS)
|
#elif defined(MI_TLS_PTHREAD_SLOT_OFS)
|
||||||
mi_heap_t* heap = mi_tls_pthread_heap_slot();
|
mi_heap_t* heap = *mi_tls_pthread_heap_slot();
|
||||||
return (mi_unlikely(heap == NULL) ? (mi_heap_t*)&_mi_heap_empty : heap);
|
return (mi_unlikely(heap == NULL) ? (mi_heap_t*)&_mi_heap_empty : heap);
|
||||||
#elif defined(MI_TLS_PTHREAD)
|
#elif defined(MI_TLS_PTHREAD)
|
||||||
mi_heap_t* heap = (mi_unlikely(_mi_heap_default_key == (pthread_key_t)(-1)) ? _mi_heap_main_get() : (mi_heap_t*)pthread_getspecific(_mi_heap_default_key));
|
mi_heap_t* heap = (mi_unlikely(_mi_heap_default_key == (pthread_key_t)(-1)) ? _mi_heap_main_get() : (mi_heap_t*)pthread_getspecific(_mi_heap_default_key));
|
||||||
|
@ -168,7 +168,7 @@ typedef struct mi_thread_data_s {
|
|||||||
static bool _mi_heap_init(void) {
|
static bool _mi_heap_init(void) {
|
||||||
if (mi_heap_is_initialized(mi_get_default_heap())) return true;
|
if (mi_heap_is_initialized(mi_get_default_heap())) return true;
|
||||||
if (_mi_is_main_thread()) {
|
if (_mi_is_main_thread()) {
|
||||||
mi_assert_internal(_mi_heap_main.thread_id != 0);
|
// mi_assert_internal(_mi_heap_main.thread_id != 0); // can happen on freeBSD where alloc is called before any initialization
|
||||||
// the main heap is statically allocated
|
// the main heap is statically allocated
|
||||||
mi_heap_main_init();
|
mi_heap_main_init();
|
||||||
_mi_heap_set_default_direct(&_mi_heap_main);
|
_mi_heap_set_default_direct(&_mi_heap_main);
|
||||||
@ -358,8 +358,9 @@ void _mi_heap_set_default_direct(mi_heap_t* heap) {
|
|||||||
mi_assert_internal(mi_fls_key != 0);
|
mi_assert_internal(mi_fls_key != 0);
|
||||||
FlsSetValue(mi_fls_key, heap);
|
FlsSetValue(mi_fls_key, heap);
|
||||||
#elif defined(MI_USE_PTHREADS)
|
#elif defined(MI_USE_PTHREADS)
|
||||||
mi_assert_internal(_mi_heap_default_key != (pthread_key_t)(-1));
|
if (_mi_heap_default_key != (pthread_key_t)(-1)) { // can happen during recursive invocation on freeBSD
|
||||||
pthread_setspecific(_mi_heap_default_key, heap);
|
pthread_setspecific(_mi_heap_default_key, heap);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user