From aa392170a2b0fc392c8203a4b31301eb7c94890e Mon Sep 17 00:00:00 2001 From: faketruth Date: Fri, 23 Dec 2011 14:26:29 +0000 Subject: Added thread names to cThread so when debugging in Visual Studio you actually know what thread you're looking at git-svn-id: http://mc-server.googlecode.com/svn/trunk@100 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/cThread.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) (limited to 'source/cThread.cpp') diff --git a/source/cThread.cpp b/source/cThread.cpp index d0ada2b4e..4d09907ab 100644 --- a/source/cThread.cpp +++ b/source/cThread.cpp @@ -11,12 +11,48 @@ #include "cEvent.h" #include "cMCLogger.h" -cThread::cThread( ThreadFunc a_ThreadFunction, void* a_Param ) +#ifdef _WIN32 +// +// Usage: SetThreadName (-1, "MainThread"); +// +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; + +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) + { + } +} +#endif + +cThread::cThread( ThreadFunc a_ThreadFunction, void* a_Param, const char* a_ThreadName /* = 0 */ ) : m_ThreadFunction( a_ThreadFunction ) , m_Param( a_Param ) , m_Event( new cEvent() ) , m_StopEvent( 0 ) + , m_ThreadName( 0 ) { + if( a_ThreadName ) + { + m_ThreadName = new char[ strlen(a_ThreadName)+1 ]; + strcpy(m_ThreadName, a_ThreadName); + } } cThread::~cThread() @@ -28,6 +64,8 @@ cThread::~cThread() m_StopEvent->Wait(); delete m_StopEvent; } + + delete [] m_ThreadName; } void cThread::Start( bool a_bWaitOnDelete /* = true */ ) @@ -40,13 +78,19 @@ void cThread::Start( bool a_bWaitOnDelete /* = true */ ) if( pthread_create( &SndThread, NULL, MyThread, this) ) LOGERROR("ERROR: Could not create thread!"); #else + DWORD ThreadID = 0; HANDLE hThread = CreateThread( 0 // security ,0 // stack size , (LPTHREAD_START_ROUTINE) MyThread // function name ,this // parameters ,0 // flags - ,0 ); // thread id + ,&ThreadID ); // thread id CloseHandle( hThread ); + + if( m_ThreadName ) + { + SetThreadName(ThreadID, m_ThreadName ); + } #endif // Wait until thread has actually been created -- cgit v1.2.3