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();
// 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
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;
/**
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();
*/
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.
/**
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();
// 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;
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
gs_critsectThreadDelete = new wxCriticalSection;
- // no error return for GetCurrentThreadId()
- gs_idMainThread = ::GetCurrentThreadId();
+ wxThread::ms_idMainThread = wxThread::GetCurrentId();
return true;
}
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)"));
// 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
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
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)
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;
}
// ----------------------------------------------------------------------------
// 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;
return thr;
}
-bool wxThread::IsMain()
-{
- return GetCurrentId() == gs_idMainThread || gs_idMainThread == kInvalidID ;
-}
-
#ifdef Yield
#undef Yield
#endif
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();
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;
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
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)
{
return false;
}
- gs_tidMain = pthread_self();
+ wxThread::ms_idMainThread = wxThread::GetCurrentId();
gs_mutexAllThreads = new wxMutex();