mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-05 06:59:32 +03:00
fix too early tlv access on macOS in the recursion check
This commit is contained in:
parent
1ca48210fb
commit
babe57aa99
1 changed files with 19 additions and 4 deletions
|
@ -257,22 +257,37 @@ static _Atomic(size_t) warning_count; // = 0; // when >= max_warning_count stop
|
||||||
|
|
||||||
// When overriding malloc, we may recurse into mi_vfprintf if an allocation
|
// When overriding malloc, we may recurse into mi_vfprintf if an allocation
|
||||||
// inside the C runtime causes another message.
|
// inside the C runtime causes another message.
|
||||||
|
// In some cases (like on macOS) the loader already allocates which
|
||||||
|
// calls into mimalloc; if we then access thread locals (like `recurse`)
|
||||||
|
// this may crash as the access may call _tlv_bootstrap that tries to
|
||||||
|
// (recursively) invoke malloc again to allocate space for the thread local
|
||||||
|
// variables on demand. This is why we use a _mi_preloading test on such
|
||||||
|
// platforms. However, code gen may move the initial thread local address
|
||||||
|
// load before the `if` and we therefore split it out in a separate funcion.
|
||||||
static mi_decl_thread bool recurse = false;
|
static mi_decl_thread bool recurse = false;
|
||||||
|
|
||||||
|
static mi_decl_noinline bool mi_recurse_enter_prim(void) {
|
||||||
|
if (recurse) return false;
|
||||||
|
recurse = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static mi_decl_noinline void mi_recurse_exit_prim(void) {
|
||||||
|
recurse = false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool mi_recurse_enter(void) {
|
static bool mi_recurse_enter(void) {
|
||||||
#if defined(__APPLE__) || defined(MI_TLS_RECURSE_GUARD)
|
#if defined(__APPLE__) || defined(MI_TLS_RECURSE_GUARD)
|
||||||
if (_mi_preloading()) return true;
|
if (_mi_preloading()) return true;
|
||||||
#endif
|
#endif
|
||||||
if (recurse) return false;
|
return mi_recurse_enter_prim();
|
||||||
recurse = true;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mi_recurse_exit(void) {
|
static void mi_recurse_exit(void) {
|
||||||
#if defined(__APPLE__) || defined(MI_TLS_RECURSE_GUARD)
|
#if defined(__APPLE__) || defined(MI_TLS_RECURSE_GUARD)
|
||||||
if (_mi_preloading()) return;
|
if (_mi_preloading()) return;
|
||||||
#endif
|
#endif
|
||||||
recurse = false;
|
mi_recurse_exit_prim();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _mi_fputs(mi_output_fun* out, void* arg, const char* prefix, const char* message) {
|
void _mi_fputs(mi_output_fun* out, void* arg, const char* prefix, const char* message) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue