diff --git a/ixwebsocket/windows/IXSetThreadName_windows.cpp b/ixwebsocket/windows/IXSetThreadName_windows.cpp index 615e7ecd..3c21a852 100644 --- a/ixwebsocket/windows/IXSetThreadName_windows.cpp +++ b/ixwebsocket/windows/IXSetThreadName_windows.cpp @@ -5,12 +5,41 @@ */ #include "../IXSetThreadName.h" #include +#include namespace ix { + const DWORD MS_VC_EXCEPTION = 0x406D1388; + +#pragma pack(push,8) + 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. + } THREADNAME_INFO; +#pragma pack(pop) + + void SetThreadName(DWORD dwThreadID, const char* threadName) + { + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = threadName; + info.dwThreadID = dwThreadID; + info.dwFlags = 0; + + __try + { + RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)& info); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + } + } + void setThreadName(const std::string& name) { - // FIXME - std::cerr << "setThreadName not implemented on Windows yet" << std::endl; + SetThreadName(-1, name.c_str()); } }