|  | @@ -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)
 |