diff --git a/ide/vs2022/mimalloc-test-stress.vcxproj b/ide/vs2022/mimalloc-test-stress.vcxproj
index 128a4ff6..d6af71ce 100644
--- a/ide/vs2022/mimalloc-test-stress.vcxproj
+++ b/ide/vs2022/mimalloc-test-stress.vcxproj
@@ -282,8 +282,8 @@
-
- {abb5eae7-b3e6-432e-b636-333449892ea7}
+
+ {abb5eae7-b3e6-432e-b636-333449892ea6}
diff --git a/include/mimalloc/prim.h b/include/mimalloc/prim.h
index 011a330b..03ebe7dd 100644
--- a/include/mimalloc/prim.h
+++ b/include/mimalloc/prim.h
@@ -120,6 +120,7 @@ void _mi_prim_thread_associate_default_heap(mi_heap_t* heap);
// Is this thread part of a thread pool?
bool _mi_prim_thread_is_in_threadpool(void);
+#define MI_WIN_USE_FIXED_TLS 1
//-------------------------------------------------------------------
// Access to TLS (thread local storage) slots.
@@ -211,7 +212,7 @@ static inline void mi_prim_tls_slot_set(size_t slot, void* value) mi_attr_noexce
// thread-local initialization checks in the fast path.
// We allocate a user TLS slot at process initialization (see `windows/prim.c`)
// and store the offset `_mi_win_tls_offset`.
-#define MI_HAS_TLS_SLOT 1 // 2 = we can reliably initialize the slot (saving a test on each malloc)
+#define MI_HAS_TLS_SLOT 2 // 2 = we can reliably initialize the slot (saving a test on each malloc)
extern mi_decl_hidden size_t _mi_win_tls_offset;
diff --git a/src/init.c b/src/init.c
index 3b143a37..77630a50 100644
--- a/src/init.c
+++ b/src/init.c
@@ -372,6 +372,7 @@ mi_tld_t* _mi_thread_tld(void) mi_attr_noexcept {
}
}
+
/* -----------------------------------------------------------
Sub process
----------------------------------------------------------- */
diff --git a/src/prim/windows/prim.c b/src/prim/windows/prim.c
index dcefdbed..992e8eea 100644
--- a/src/prim/windows/prim.c
+++ b/src/prim/windows/prim.c
@@ -650,32 +650,29 @@ bool _mi_prim_random_buf(void* buf, size_t buf_len) {
mi_decl_cache_align size_t _mi_win_tls_offset = 0;
#endif
-//static void mi_debug_out(const char* s) {
-// HANDLE h = GetStdHandle(STD_ERROR_HANDLE);
-// WriteConsole(h, s, (DWORD)_mi_strlen(s), NULL, NULL);
-//}
-
static void mi_win_tls_init(DWORD reason) {
+ #if MI_HAS_TLS_SLOT >= 2 // we must initialize the TLS slot before any allocation
+ #if MI_WIN_USE_FIXED_TLS==1
+ if (reason==DLL_PROCESS_ATTACH && _mi_win_tls_offset == 0) {
+ const DWORD tls_slot = TlsAlloc(); // usually returns slot 1
+ if (tls_slot == TLS_OUT_OF_INDEXES) {
+ _mi_error_message(EFAULT, "unable to allocate the a TLS slot (rebuild without MI_WIN_USE_FIXED_TLS?)\n");
+ }
+ _mi_win_tls_offset = (size_t)tls_slot * sizeof(void*);
+ }
+ #endif
if (reason==DLL_PROCESS_ATTACH || reason==DLL_THREAD_ATTACH) {
- #if MI_WIN_USE_FIXED_TLS==1 // we must allocate a TLS slot dynamically
- if (_mi_win_tls_offset == 0 && reason == DLL_PROCESS_ATTACH) {
- const DWORD tls_slot = TlsAlloc(); // usually returns slot 1
- if (tls_slot == TLS_OUT_OF_INDEXES) {
- _mi_error_message(EFAULT, "unable to allocate the a TLS slot (rebuild without MI_WIN_USE_FIXED_TLS?)\n");
- }
- _mi_win_tls_offset = (size_t)tls_slot * sizeof(void*);
- }
- #endif
- #if MI_HAS_TLS_SLOT >= 2 // we must initialize the TLS slot before any allocation
if (mi_prim_get_default_heap() == NULL) {
- _mi_heap_set_default_direct((mi_heap_t*)&_mi_heap_empty);
- #if MI_DEBUG && MI_WIN_USE_FIXED_TLS==1
- void* const p = TlsGetValue((DWORD)(_mi_win_tls_offset / sizeof(void*)));
- mi_assert_internal(p == (void*)&_mi_heap_empty);
- #endif
+ _mi_heap_set_default_direct((mi_heap_t*)&_mi_heap_empty);
}
+ #if MI_DEBUG && MI_WIN_USE_FIXED_TLS==1
+ void* const p = TlsGetValue((DWORD)(_mi_win_tls_offset / sizeof(void*)));
+ mi_assert_internal(p == (void*)&_mi_heap_empty);
#endif
- }
+ }
+ #else
+ MI_UNUSED(reason);
+ #endif
}
static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) {
@@ -698,7 +695,7 @@ static void NTAPI mi_win_main(PVOID module, DWORD reason, LPVOID reserved) {
#define MI_PRIM_HAS_PROCESS_ATTACH 1
// Windows DLL: easy to hook into process_init and thread_done
- BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) {
+ BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) {
mi_win_main((PVOID)inst,reason,reserved);
return TRUE;
}