From 186c6e5c9dbfcff1fe60fe67b1d1ec47684058f1 Mon Sep 17 00:00:00 2001 From: Sasha Szpakowski 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 aeda019ae4..2dcfe8f882 --- 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); } }