|
@@ -894,26 +894,29 @@ int mg_atomic_dec(volatile int * addr)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-// Set the thread name for debugging purposes in Visual Studio
|
|
|
|
-// http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
|
|
|
|
-
|
|
|
|
-#if defined(_WIN32)
|
|
|
|
-const DWORD MS_VC_EXCEPTION = 0x406D1388;
|
|
|
|
-
|
|
|
|
|
|
+#if !defined(NO_THREAD_NAME)
|
|
|
|
+#if defined(_WIN32) && defined(_MSC_VER)
|
|
|
|
+/* Set the thread name for debugging purposes in Visual Studio
|
|
|
|
+ http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
|
|
|
|
+*/
|
|
#pragma pack(push,8)
|
|
#pragma pack(push,8)
|
|
typedef struct tagTHREADNAME_INFO
|
|
typedef struct tagTHREADNAME_INFO
|
|
{
|
|
{
|
|
- DWORD dwType; // Must be 0x1000.
|
|
|
|
- LPCSTR szName; // Pointer to name (in user addr space).
|
|
|
|
- DWORD dwThreadID; // Thread ID (-1=caller thread).
|
|
|
|
- DWORD dwFlags; // Reserved for future use, must be zero.
|
|
|
|
|
|
+ DWORD dwType; /* Must be 0x1000. */
|
|
|
|
+ LPCSTR szName; /* Pointer to name (in user addr space). */
|
|
|
|
+ DWORD dwThreadID; /* Thread ID (-1=caller thread). */
|
|
|
|
+ DWORD dwFlags; /* Reserved for future use, must be zero. */
|
|
} THREADNAME_INFO;
|
|
} THREADNAME_INFO;
|
|
#pragma pack(pop)
|
|
#pragma pack(pop)
|
|
|
|
+#elif defined(__linux__)
|
|
|
|
+#include <sys/prctl.h>
|
|
#endif
|
|
#endif
|
|
|
|
|
|
void mg_set_thread_name(const char* threadName)
|
|
void mg_set_thread_name(const char* threadName)
|
|
{
|
|
{
|
|
#if defined(_WIN32)
|
|
#if defined(_WIN32)
|
|
|
|
+#if defined(_MSC_VER)
|
|
|
|
+ /* Windows and Visual Studio Compiler */
|
|
THREADNAME_INFO info;
|
|
THREADNAME_INFO info;
|
|
info.dwType = 0x1000;
|
|
info.dwType = 0x1000;
|
|
info.szName = threadName;
|
|
info.szName = threadName;
|
|
@@ -922,13 +925,31 @@ void mg_set_thread_name(const char* threadName)
|
|
|
|
|
|
__try
|
|
__try
|
|
{
|
|
{
|
|
- RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info);
|
|
|
|
|
|
+ RaiseException(0x406D1388, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info);
|
|
}
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
|
|
+#elif defined(__MINGW32__)
|
|
|
|
+ /* No option known to set thread name for MinGW */
|
|
|
|
+#endif
|
|
|
|
+#elif defined(__linux__)
|
|
|
|
+ /* Not Windows */
|
|
|
|
+ (void)prctl(PR_SET_NAME,threadName,0,0,0);
|
|
|
|
+#elif defined(__APPLE__) || defined(__MACH__)
|
|
|
|
+ /* OS X */
|
|
|
|
+ (void)pthread_setname_np(threadName);
|
|
|
|
+#elif defined(BSD) || defined(__FreeBSD__) || defined(__OpenBSD__)
|
|
|
|
+ /* BSD */
|
|
|
|
+ pthread_set_name_np(pthread_self(), threadName);
|
|
|
|
+#else
|
|
|
|
+ /* POSIX */
|
|
|
|
+ (void)pthread_setname_np(pthread_self(), threadName);
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
+#else /* !defined(NO_THREAD_NAME) */
|
|
|
|
+void mg_set_thread_name(const char* threadName) {}
|
|
|
|
+#endif
|
|
|
|
|
|
#if defined(MG_LEGACY_INTERFACE)
|
|
#if defined(MG_LEGACY_INTERFACE)
|
|
const char **mg_get_valid_option_names(void)
|
|
const char **mg_get_valid_option_names(void)
|