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/cClientHandle.cpp | 6 +++--- source/cRoot.cpp | 2 +- source/cServer.cpp | 4 ++-- source/cThread.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- source/cThread.h | 4 +++- 5 files changed, 55 insertions(+), 9 deletions(-) (limited to 'source') diff --git a/source/cClientHandle.cpp b/source/cClientHandle.cpp index b8de73467..8374a8045 100644 --- a/source/cClientHandle.cpp +++ b/source/cClientHandle.cpp @@ -159,8 +159,8 @@ cClientHandle::cClientHandle(const cSocket & a_Socket) memset( m_LoadedChunks, 0x00, sizeof(cChunk*)*VIEWDISTANCE*VIEWDISTANCE ); ////////////////////////////////////////////////////////////////////////// - m_pState->pReceiveThread = new cThread( ReceiveThread, this ); - m_pState->pSendThread = new cThread( SendThread, this ); + m_pState->pReceiveThread = new cThread( ReceiveThread, this, "cClientHandle::ReceiveThread" ); + m_pState->pSendThread = new cThread( SendThread, this, "cClientHandle::SendThread" ); m_pState->pReceiveThread->Start( true ); m_pState->pSendThread->Start( true ); ////////////////////////////////////////////////////////////////////////// @@ -433,7 +433,7 @@ void cClientHandle::HandlePacket( cPacket* a_Packet ) } if( m_pState->pAuthenticateThread ) delete m_pState->pAuthenticateThread; - m_pState->pAuthenticateThread = new cThread( AuthenticateThread, this ); + m_pState->pAuthenticateThread = new cThread( AuthenticateThread, this, "cClientHandle::AuthenticateThread" ); m_pState->pAuthenticateThread->Start( true ); } break; diff --git a/source/cRoot.cpp b/source/cRoot.cpp index 518275088..928461976 100644 --- a/source/cRoot.cpp +++ b/source/cRoot.cpp @@ -111,7 +111,7 @@ void cRoot::Start() m_Server->StartListenThread(); //cHeartBeat* HeartBeat = new cHeartBeat(); - m_InputThread = new cThread( InputThread, this ); + m_InputThread = new cThread( InputThread, this, "cRoot::InputThread" ); m_InputThread->Start( true ); while( !m_bStop && !m_bRestart ) // These are modified by external threads diff --git a/source/cServer.cpp b/source/cServer.cpp index e6d475f46..5fbd6d8c7 100644 --- a/source/cServer.cpp +++ b/source/cServer.cpp @@ -340,8 +340,8 @@ void ServerTickThread( void * a_Param ) void cServer::StartListenThread() { - m_pState->pListenThread = new cThread( ServerListenThread, this ); - m_pState->pTickThread = new cThread( ServerTickThread, this ); + m_pState->pListenThread = new cThread( ServerListenThread, this, "cServer::ServerListenThread" ); + m_pState->pTickThread = new cThread( ServerTickThread, this, "cServer::ServerTickThread" ); m_pState->pListenThread->Start( true ); m_pState->pTickThread->Start( true ); } 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 diff --git a/source/cThread.h b/source/cThread.h index 1e9d73c17..f2cd8a75d 100644 --- a/source/cThread.h +++ b/source/cThread.h @@ -5,7 +5,7 @@ class cThread { public: typedef void (ThreadFunc)(void*); - cThread( ThreadFunc a_ThreadFunction, void* a_Param ); + cThread( ThreadFunc a_ThreadFunction, void* a_Param, const char* a_ThreadName = 0 ); ~cThread(); void Start( bool a_bWaitOnDelete = true ); @@ -22,4 +22,6 @@ private: void* m_Param; cEvent* m_Event; cEvent* m_StopEvent; + + char* m_ThreadName; }; \ No newline at end of file -- cgit v1.2.3