From: Vadim Zeitlin Date: Sat, 11 Jul 2009 20:46:55 +0000 (+0000) Subject: Added wxThread::GetMainId(). X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/f9226383059545b8f76bcde41f90d18fbfcffe00?hp=7dfede7b9258ef73c402462e6442b1a8ae069d7a Added wxThread::GetMainId(). This is useful for checking if a message was logged from the main thread or not and also allows us to implement IsMain() by comparing GetCurrentId() with GetMainId() in all ports and avoid repetition. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61406 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/thread.h b/include/wx/thread.h index 64a62f17da..7e85ae2314 100644 --- a/include/wx/thread.h +++ b/include/wx/thread.h @@ -447,7 +447,17 @@ public: static wxThread *This(); // Returns true if current thread is the main thread. - static bool IsMain(); + // + // Notice that it also returns true if main thread id hadn't been + // initialized yet on the assumption that it's too early in wx startup + // process for any other threads to have been created in this case. + static bool IsMain() + { + return !ms_idMainThread || GetCurrentId() == ms_idMainThread; + } + + // Return the main thread id + static wxThreadIdType GetMainId() { return ms_idMainThread; } // Release the rest of our time slice letting the other threads run static void Yield(); @@ -466,7 +476,7 @@ public: // Get the platform specific thread ID and return as a long. This // can be used to uniquely identify threads, even if they are not // wxThreads. This is used by wxPython. - static wxThreadIdType GetCurrentId(); + static wxThreadIdType GetCurrentId(); // sets the concurrency level: this is, roughly, the number of threads // the system tries to schedule to run in parallel. 0 means the @@ -586,6 +596,11 @@ private: virtual void OnExit() { } friend class wxThreadInternal; + friend class wxThreadModule; + + + // the main thread identifier, should be set on startup + static wxThreadIdType ms_idMainThread; // the (platform-dependent) thread class implementation wxThreadInternal *m_internal; diff --git a/interface/wx/thread.h b/interface/wx/thread.h index 3dcb9f3f2a..89eccc0b13 100644 --- a/interface/wx/thread.h +++ b/interface/wx/thread.h @@ -989,7 +989,10 @@ public: /** Returns the platform specific thread ID of the current thread as a long. + This can be used to uniquely identify threads, even if they are not wxThreads. + + @see GetMainId() */ static wxThreadIdType GetCurrentId(); @@ -1007,6 +1010,15 @@ public: */ wxThreadKind GetKind() const; + /** + Returns the thread ID of the main thread. + + @see IsMain() + + @since 2.9.1 + */ + static wxThreadIdType GetMainId(); + /** Gets the priority of the thread, between zero and 100. @@ -1035,6 +1047,11 @@ public: /** Returns @true if the calling thread is the main application thread. + + Main thread in the context of wxWidgets is the one which initialized + the library. + + @see GetMainId(), GetCurrentId() */ static bool IsMain(); diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp index 29dcb255d9..c233c55e29 100644 --- a/src/msw/thread.cpp +++ b/src/msw/thread.cpp @@ -113,7 +113,7 @@ static DWORD gs_tlsThisThread = 0xFFFFFFFF; // id of the main thread - the one which can call GUI functions without first // calling wxMutexGuiEnter() -static DWORD gs_idMainThread = 0; +wxThreadIdType wxThread::ms_idMainThread = 0; // if it's false, some secondary thread is holding the GUI lock static bool gs_bGuiOwnedByMainThread = true; @@ -926,11 +926,6 @@ wxThread *wxThread::This() return thread; } -bool wxThread::IsMain() -{ - return ::GetCurrentThreadId() == gs_idMainThread || gs_idMainThread == 0; -} - void wxThread::Yield() { // 0 argument to Sleep() is special and means to just give away the rest of @@ -1278,8 +1273,7 @@ bool wxThreadModule::OnInit() gs_critsectThreadDelete = new wxCriticalSection; - // no error return for GetCurrentThreadId() - gs_idMainThread = ::GetCurrentThreadId(); + wxThread::ms_idMainThread = wxThread::GetCurrentId(); return true; } @@ -1393,7 +1387,7 @@ bool WXDLLIMPEXP_BASE wxGuiOwnedByMainThread() void WXDLLIMPEXP_BASE wxWakeUpMainThread() { // sending any message would do - hopefully WM_NULL is harmless enough - if ( !::PostThreadMessage(gs_idMainThread, WM_NULL, 0, 0) ) + if ( !::PostThreadMessage(ms_idMainThread, WM_NULL, 0, 0) ) { // should never happen wxLogLastError(wxT("PostThreadMessage(WM_NULL)")); diff --git a/src/os2/thread.cpp b/src/os2/thread.cpp index f0b8e6068e..c3461f4af9 100644 --- a/src/os2/thread.cpp +++ b/src/os2/thread.cpp @@ -57,7 +57,7 @@ enum wxThreadState // id of the main thread - the one which can call GUI functions without first // calling wxMutexGuiEnter() -static ULONG s_ulIdMainThread = 1; +wxThreadIdType wxThread::ms_idMainThread = 0; wxMutex* p_wxMainMutex; // OS2 substitute for Tls pointer the current parent thread object @@ -547,19 +547,6 @@ wxThread *wxThread::This() return pThread; } -bool wxThread::IsMain() -{ - PTIB ptib; - PPIB ppib; - - ::DosGetInfoBlocks(&ptib, &ppib); - - if (ptib->tib_ptib2->tib2_ultid == s_ulIdMainThread) - return true; - - return false; -} - #ifdef Yield #undef Yield #endif @@ -582,13 +569,13 @@ int wxThread::GetCPUCount() return CPUCount; } -unsigned long wxThread::GetCurrentId() +wxThreadIdType wxThread::GetCurrentId() { PTIB ptib; PPIB ppib; ::DosGetInfoBlocks(&ptib, &ppib); - return (unsigned long) ptib->tib_ptib2->tib2_ultid; + return (wxThreadIdType) ptib->tib_ptib2->tib2_ultid; } bool wxThread::SetConcurrency(size_t level) @@ -937,12 +924,8 @@ bool wxThreadModule::OnInit() gs_pCritsectGui = new wxCriticalSection(); gs_pCritsectGui->Enter(); - PTIB ptib; - PPIB ppib; - - ::DosGetInfoBlocks(&ptib, &ppib); + wxThread::ms_idMainThread = wxThread::GetCurrentId(); - s_ulIdMainThread = ptib->tib_ptib2->tib2_ultid; return true; } diff --git a/src/osx/carbon/thread.cpp b/src/osx/carbon/thread.cpp index f4bfdac173..51ebef71ee 100644 --- a/src/osx/carbon/thread.cpp +++ b/src/osx/carbon/thread.cpp @@ -49,7 +49,7 @@ enum wxThreadState // ---------------------------------------------------------------------------- // the task ID of the main thread -static wxThreadIdType gs_idMainThread = kInvalidID; +wxThreadIdType wxThread::ms_idMainThread = kInvalidID; // this is the Per-Task Storage for the pointer to the appropriate wxThread TaskStorageIndex gs_tlsForWXThread = 0; @@ -796,11 +796,6 @@ wxThread *wxThread::This() return thr; } -bool wxThread::IsMain() -{ - return GetCurrentId() == gs_idMainThread || gs_idMainThread == kInvalidID ; -} - #ifdef Yield #undef Yield #endif @@ -1214,7 +1209,7 @@ bool wxThreadModule::OnInit() verify_noerr( MPAllocateTaskStorageIndex( &gs_tlsForWXThread ) ) ; verify_noerr( MPSetTaskStorageValue( gs_tlsForWXThread, 0 ) ) ; - gs_idMainThread = wxThread::GetCurrentId(); + wxThread::ms_idMainThread = wxThread::GetCurrentId(); gs_critsectWaitingForGui = new wxCriticalSection(); gs_critsectGui = new wxCriticalSection(); diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index 2775f9576e..1b7248d98a 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -118,7 +118,11 @@ static wxArrayThread gs_allThreads; static wxMutex *gs_mutexAllThreads = NULL; // the id of the main thread -static pthread_t gs_tidMain = (pthread_t)-1; +// +// we suppose that 0 is not a valid pthread_t value but in principle this might +// be false (e.g. if it's a selector-like value), wxThread::IsMain() would need +// to be updated in such case +wxThreadIdType wxThread::ms_idMainThread = 0; // the key for the pointer to the associated wxThread object static pthread_key_t gs_keySelf; @@ -1057,11 +1061,6 @@ wxThread *wxThread::This() return (wxThread *)pthread_getspecific(gs_keySelf); } -bool wxThread::IsMain() -{ - return (bool)pthread_equal(pthread_self(), gs_tidMain) || gs_tidMain == (pthread_t)-1; -} - void wxThread::Yield() { #ifdef HAVE_SCHED_YIELD @@ -1110,23 +1109,11 @@ int wxThread::GetCPUCount() return -1; } -// VMS is a 64 bit system and threads have 64 bit pointers. -// FIXME: also needed for other systems???? -#ifdef __VMS -unsigned long long wxThread::GetCurrentId() -{ - return (unsigned long long)pthread_self(); -} - -#else // !__VMS - -unsigned long wxThread::GetCurrentId() +wxThreadIdType wxThread::GetCurrentId() { - return (unsigned long)pthread_self(); + return (wxThreadIdType)pthread_self(); } -#endif // __VMS/!__VMS - bool wxThread::SetConcurrency(size_t level) { @@ -1705,7 +1692,7 @@ bool wxThreadModule::OnInit() return false; } - gs_tidMain = pthread_self(); + wxThread::ms_idMainThread = wxThread::GetCurrentId(); gs_mutexAllThreads = new wxMutex();