X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/88a7a4e10ed18f81a576dcd866cfbf02bf404c00..2a392e2d16cc2fde3463f1bac95f424ac35b40b7:/src/os2/thread.cpp diff --git a/src/os2/thread.cpp b/src/os2/thread.cpp index e1dd0bf7d4..c3461f4af9 100644 --- a/src/os2/thread.cpp +++ b/src/os2/thread.cpp @@ -22,13 +22,13 @@ #ifndef WX_PRECOMP #include "wx/intl.h" + #include "wx/log.h" + #include "wx/app.h" + #include "wx/module.h" #endif //WX_PRECOMP -#include "wx/app.h" #include "wx/apptrait.h" -#include "wx/module.h" #include "wx/utils.h" -#include "wx/log.h" #include @@ -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 @@ -96,7 +96,8 @@ public: bool IsOk() const { return m_vMutex != NULL; } wxMutexError Lock() { return LockTimeout(SEM_INDEFINITE_WAIT); } - wxMutexError TryLock() { return LockTimeout(SEM_IMMEDIATE_RETURN); } + wxMutexError Lock(unsigned long ms) { return LockTimeout(ms); } + wxMutexError TryLock(); wxMutexError Unlock(); private: @@ -127,6 +128,14 @@ wxMutexInternal::~wxMutexInternal() } } +wxMutexError wxMutexInternal::TryLock() +{ + const wxMutexError rc = LockTimeout( SEM_IMMEDIATE_RETURN ); + + // we have a special return code for timeout in this case + return rc == wxMUTEX_TIMEOUT ? wxMUTEX_BUSY : rc; +} + wxMutexError wxMutexInternal::LockTimeout(ULONG ulMilliseconds) { APIRET ulrc; @@ -136,6 +145,7 @@ wxMutexError wxMutexInternal::LockTimeout(ULONG ulMilliseconds) switch (ulrc) { case ERROR_TIMEOUT: + return wxMUTEX_TIMEOUT; case ERROR_TOO_MANY_SEM_REQUESTS: return wxMUTEX_BUSY; @@ -537,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 @@ -559,13 +556,6 @@ void wxThread::Yield() ::DosSleep(0); } -void wxThread::Sleep( - unsigned long ulMilliseconds -) -{ - ::DosSleep(ulMilliseconds); -} - int wxThread::GetCPUCount() { ULONG CPUCount; @@ -579,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) @@ -934,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; } @@ -975,7 +961,7 @@ void WXDLLEXPORT wxWakeUpMainThread() #endif } -void WXDLLEXPORT wxMutexGuiEnter() +void wxMutexGuiEnterImpl() { // this would dead lock everything... wxASSERT_MSG( !wxThread::IsMain(), @@ -997,7 +983,7 @@ void WXDLLEXPORT wxMutexGuiEnter() gs_pCritsectGui->Enter(); } -void WXDLLEXPORT wxMutexGuiLeave() +void wxMutexGuiLeaveImpl() { wxCriticalSectionLocker enter(*gs_pCritsectWaitingForGui);