ypedef 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;
void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName)
{
THREADNAME_INFO info;
{
info.dwType = 0x1000;
info.szName = szThreadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
}
__try
{
RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info );
}
__except (EXCEPTION_CONTINUE_EXECUTION)
{
}
}
char* GetThreadName(void)
{
char* pszName=NULL;
__asm{
mov eax, fs:[0x18] // Locate the caller's TIB
mov eax, [eax+0x14] // Read the pvArbitary field in the TIB
mov [pszName], eax // pszName = pTIB->pvArbitary
}
return pszName ? pszName : "Win32 Thread";
}
#elif UNITY_APPLE
// pthread_setname_np is OSX 10.6 and later only
int (*dynamic_pthread_setname_np)(const char*);
*reinterpret_cast<void**>(&dynamic_pthread_setname_np) = dlsym(RTLD_DEFAULT, "pthread_setname_np");
if (dynamic_pthread_setname_np)
dynamic_pthread_setname_np(name);
#elif PLATFORM_ANDROID || PLATFORM_TIZEN
prctl(PR_SET_NAME, (unsigned long)(name ? name : "<Unknown>"), 0, 0, 0);
#endif