From: <ibr...@us...> - 2012-07-28 15:24:56
|
Revision: 4389 http://tora.svn.sourceforge.net/tora/?rev=4389&view=rev Author: ibre5041 Date: 2012-07-28 15:24:49 +0000 (Sat, 28 Jul 2012) Log Message: ----------- store thread name in thread info - on linux only Modified Paths: -------------- branches/tora3/src/ts_log/critical_section.h branches/tora3/src/ts_log/thread_safe_log.h Modified: branches/tora3/src/ts_log/critical_section.h =================================================================== --- branches/tora3/src/ts_log/critical_section.h 2012-07-28 00:03:08 UTC (rev 4388) +++ branches/tora3/src/ts_log/critical_section.h 2012-07-28 15:24:49 UTC (rev 4389) @@ -30,6 +30,41 @@ virtual void operator()() = 0; DWORD dwThreadID; HANDLE hHandle; + + void set_name(const char*n) + { +#if !defined(QT_NO_DEBUG) && defined(Q_CC_MSVC) && !defined(Q_OS_WINCE) + +#ifndef Q_OS_WIN64 +# define ULONG_PTR DWORD +#endif + + typedef struct tagTHREADNAME_INFO + { + DWORD dwType; // must be 0x1000 + LPCSTR szName; // pointer to name (in user addr space) + HANDLE dwThreadID; // thread ID (-1=caller thread) + DWORD dwFlags; // reserved for future use, must be zero + } THREADNAME_INFO; + + //void qt_set_thread_name(HANDLE threadId, LPCSTR threadName) + { + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = n; // threadName; + info.dwThreadID = dwThreadID; // threadId; + info.dwFlags = 0; + + __try + { + RaiseException(0x406D1388, 0, sizeof(info)/sizeof(DWORD), (const ULONG_PTR*)&info); + } + __except (EXCEPTION_CONTINUE_EXECUTION) + { + } + } +#endif // !QT_NO_DEBUG && Q_CC_MSVC && !Q_OS_WINCE + } }; @@ -148,6 +183,11 @@ _me = NULL; } } + void set_name(const char*) + { + // TODO get get thread native id and then use platform dependent way + // boost does not support this + } boost::thread *_me; }; @@ -206,6 +246,9 @@ #include <QMutex> #include <QThread> +#if defined(__linux__) +#include <sys/prctl.h> +#endif class qt_thread_manager { @@ -213,9 +256,24 @@ struct thread_obj_base : public QThread { virtual void operator()() = 0; + + void set_name(const char* n) + { + QThread::setObjectName(QString::fromLatin1(n)); + } + private: virtual void run() { + // This was copied from QT trunk - as of 4.8.2 it is not used yet + QByteArray objectName = QThread::objectName().toLatin1(); + if (objectName.isEmpty()) + objectName = QThread::metaObject()->className(); +#if defined(__linux__) + prctl(PR_SET_NAME, (unsigned long)objectName.constData(), 0, 0, 0); +#elif defined(Q_OS_MAC) + pthread_setname_np(objectName.constData()); +#endif (*this)(); } bool join() Modified: branches/tora3/src/ts_log/thread_safe_log.h =================================================================== --- branches/tora3/src/ts_log/thread_safe_log.h 2012-07-28 00:03:08 UTC (rev 4388) +++ branches/tora3/src/ts_log/thread_safe_log.h 2012-07-28 15:24:49 UTC (rev 4389) @@ -72,7 +72,9 @@ thread_info() : m_bHasFinished( false), m_pThis( NULL) - {} + { + thread_obj_base::set_name("logWriterShared"); + } /* virtual */ void operator()() { while ( true) @@ -345,8 +347,11 @@ struct thread_info : public thread_obj_base { thread_info() - : m_pThis( NULL), m_bHasFinished( false) - {} + : m_pThis( NULL) + , m_bHasFinished( false) + { + thread_obj_base::set_name("logWriterOwnThread"); + } /* virtual */ void operator()() { while ( true) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |