SDL: windows: fix race condition with exception-based thread naming.

From 186c6e5c9dbfcff1fe60fe67b1d1ec47684058f1 Mon Sep 17 00:00:00 2001
From: Sasha Szpakowski <[EMAIL REDACTED]>
Date: Thu, 17 Oct 2024 21:52:20 -0300
Subject: [PATCH] windows: fix race condition with exception-based thread
 naming.

---
 src/thread/windows/SDL_systhread.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)
 mode change 100644 => 100755 src/thread/windows/SDL_systhread.c

diff --git a/src/thread/windows/SDL_systhread.c b/src/thread/windows/SDL_systhread.c
old mode 100644
new mode 100755
index aeda019ae4d1f..2dcfe8f8820ef
--- a/src/thread/windows/SDL_systhread.c
+++ b/src/thread/windows/SDL_systhread.c
@@ -32,6 +32,8 @@
 #define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000
 #endif
 
+#define SDL_DEBUGGER_NAME_EXCEPTION_CODE 0x406D1388
+
 typedef void (__cdecl * SDL_EndThreadExCallback) (unsigned retval);
 typedef uintptr_t (__cdecl * SDL_BeginThreadExCallback)
                    (void *security, unsigned stacksize, unsigned (__stdcall *startaddr)(void *),
@@ -97,10 +99,13 @@ typedef struct tagTHREADNAME_INFO
 } THREADNAME_INFO;
 #pragma pack(pop)
 
-static LONG NTAPI EmptyVectoredExceptionHandler(EXCEPTION_POINTERS *ExceptionInfo)
+static LONG NTAPI EmptyVectoredExceptionHandler(EXCEPTION_POINTERS *info)
 {
-    (void)ExceptionInfo;
-    return EXCEPTION_CONTINUE_EXECUTION;
+    if (info != NULL && info->ExceptionRecord != NULL && info->ExceptionRecord->ExceptionCode == SDL_DEBUGGER_NAME_EXCEPTION_CODE) {
+        return EXCEPTION_CONTINUE_EXECUTION;
+    } else {
+        return EXCEPTION_CONTINUE_SEARCH;
+    }
 }
 
 typedef HRESULT(WINAPI *pfnSetThreadDescription)(HANDLE, PCWSTR);
@@ -148,7 +153,7 @@ void SDL_SYS_SetupThread(const char *name)
             inf.dwFlags = 0;
 
             // The debugger catches this, renames the thread, continues on.
-            RaiseException(0x406D1388, 0, sizeof(inf) / sizeof(ULONG), (const ULONG_PTR *)&inf);
+            RaiseException(SDL_DEBUGGER_NAME_EXCEPTION_CODE, 0, sizeof(inf) / sizeof(ULONG), (const ULONG_PTR *)&inf);
             RemoveVectoredExceptionHandler(exceptionHandlerHandle);
         }
     }