SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING
diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index cd5f0c3..9c914d0 100644
--- a/include/SDL_hints.h
+++ b/include/SDL_hints.h
@@ -689,6 +689,17 @@
#define SDL_HINT_BMP_SAVE_LEGACY_FORMAT "SDL_BMP_SAVE_LEGACY_FORMAT"
/**
+ * \brief Tell SDL not to name threads on Windows.
+ *
+ * The variable can be set to the following values:
+ * "0" - SDL will raise the 0x406D1388 Exception to name threads.
+ * This is the default behavior of SDL <= 2.0.4. (default)
+ * "1" - SDL will not raise this exception, and threads will be unnamed.
+ * For .NET languages this is required when running under a debugger.
+ */
+#define SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING "SDL_WINDOWS_DISABLE_THREAD_NAMING"
+
+/**
* \brief An enumeration of hint priorities
*/
typedef enum
diff --git a/src/thread/windows/SDL_systhread.c b/src/thread/windows/SDL_systhread.c
index ae525ae..ffad0d8 100644
--- a/src/thread/windows/SDL_systhread.c
+++ b/src/thread/windows/SDL_systhread.c
@@ -24,6 +24,7 @@
/* Win32 thread management routines for SDL */
+#include "SDL_hints.h"
#include "SDL_thread.h"
#include "../SDL_thread_c.h"
#include "../SDL_systhread.h"
@@ -167,8 +168,15 @@
SDL_SYS_SetupThread(const char *name)
{
if ((name != NULL) && IsDebuggerPresent()) {
- /* This magic tells the debugger to name a thread if it's listening. */
THREADNAME_INFO inf;
+
+ /* C# and friends will try to catch this Exception, let's avoid it. */
+ const char *hint = SDL_GetHint(SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING);
+ if (hint && *hint == '1') {
+ return;
+ }
+
+ /* This magic tells the debugger to name a thread if it's listening. */
SDL_zero(inf);
inf.dwType = 0x1000;
inf.szName = name;