X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6670f56440ae9209b3e2e51e06acf3bc5aaf1905..b99450eecb344b39cb8dc31e56d458e582a8eeba:/src/os2/thread.cpp diff --git a/src/os2/thread.cpp b/src/os2/thread.cpp index c36201e2c9..e4d1387488 100644 --- a/src/os2/thread.cpp +++ b/src/os2/thread.cpp @@ -6,14 +6,9 @@ // Created: 04/22/98 // RCS-ID: $Id$ // Copyright: (c) Stefan Neis (2003) -// // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ - #pragma implementation "thread.h" -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- @@ -23,15 +18,19 @@ #if wxUSE_THREADS -#include +#include "wx/thread.h" + +#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/intl.h" #include "wx/utils.h" -#include "wx/log.h" -#include "wx/thread.h" + +#include #define INCL_DOSSEMAPHORES #define INCL_DOSPROCESS @@ -58,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 @@ -97,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: @@ -124,10 +124,20 @@ wxMutexInternal::~wxMutexInternal() if (m_vMutex) { if (::DosCloseMutexSem(m_vMutex)) - wxLogLastError(_T("DosCloseMutexSem(mutex)")); + { + wxLogLastError(wxT("DosCloseMutexSem(mutex)")); + } } } +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; @@ -137,6 +147,7 @@ wxMutexError wxMutexInternal::LockTimeout(ULONG ulMilliseconds) switch (ulrc) { case ERROR_TIMEOUT: + return wxMUTEX_TIMEOUT; case ERROR_TOO_MANY_SEM_REQUESTS: return wxMUTEX_BUSY; @@ -210,7 +221,7 @@ wxSemaphoreInternal::wxSemaphoreInternal(int initialcount, int maxcount) ulrc = ::DosCreateMutexSem(NULL, &m_vMutex, 0L, FALSE); if (ulrc != 0) { - wxLogLastError(_T("DosCreateMutexSem()")); + wxLogLastError(wxT("DosCreateMutexSem()")); m_vMutex = NULL; m_vEvent = NULL; return; @@ -218,7 +229,7 @@ wxSemaphoreInternal::wxSemaphoreInternal(int initialcount, int maxcount) ulrc = ::DosCreateEventSem(NULL, &m_vEvent, 0L, FALSE); if ( ulrc != 0) { - wxLogLastError(_T("DosCreateEventSem()")); + wxLogLastError(wxT("DosCreateEventSem()")); ::DosCloseMutexSem(m_vMutex); m_vMutex = NULL; m_vEvent = NULL; @@ -233,11 +244,11 @@ wxSemaphoreInternal::~wxSemaphoreInternal() { if ( ::DosCloseEventSem(m_vEvent) ) { - wxLogLastError(_T("DosCloseEventSem(semaphore)")); + wxLogLastError(wxT("DosCloseEventSem(semaphore)")); } if ( ::DosCloseMutexSem(m_vMutex) ) { - wxLogLastError(_T("DosCloseMutexSem(semaphore)")); + wxLogLastError(wxT("DosCloseMutexSem(semaphore)")); } else m_vEvent = NULL; @@ -261,7 +272,7 @@ wxSemaError wxSemaphoreInternal::WaitTimeout(unsigned long ulMilliseconds) return wxSEMA_TIMEOUT; default: - wxLogLastError(_T("DosWaitEventSem(semaphore)")); + wxLogLastError(wxT("DosWaitEventSem(semaphore)")); return wxSEMA_MISC_ERROR; } ulrc = :: DosRequestMutexSem(m_vMutex, ulMilliseconds); @@ -321,7 +332,7 @@ wxSemaError wxSemaphoreInternal::Post() return wxSEMA_OVERFLOW; if ( ulrc != NO_ERROR && ulrc != ERROR_ALREADY_POSTED ) { - wxLogLastError(_T("DosPostEventSem(semaphore)")); + wxLogLastError(wxT("DosPostEventSem(semaphore)")); return wxSEMA_MISC_ERROR; } @@ -385,11 +396,9 @@ private: unsigned int m_nPriority; // thread priority in "wx" units }; -void wxThreadInternal::OS2ThreadStart( - void * pParam -) +void wxThreadInternal::OS2ThreadStart( void * pParam ) { - DWORD dwRet; + DWORD dwRet; bool bWasCancelled; wxThread *pThread = (wxThread *)pParam; @@ -540,19 +549,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 @@ -562,13 +558,6 @@ void wxThread::Yield() ::DosSleep(0); } -void wxThread::Sleep( - unsigned long ulMilliseconds -) -{ - ::DosSleep(ulMilliseconds); -} - int wxThread::GetCPUCount() { ULONG CPUCount; @@ -582,18 +571,18 @@ 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) { - wxASSERT_MSG( IsMain(), _T("should only be called from the main thread") ); + wxASSERT_MSG( IsMain(), wxT("should only be called from the main thread") ); // ok only for the default one if ( level == 0 ) @@ -677,7 +666,7 @@ wxThread::ExitCode wxThread::Wait() // although under Windows we can wait for any thread, it's an error to // wait for a detached one in wxWin API wxCHECK_MSG( !IsDetached(), (ExitCode)-1, - _T("can't wait for detached thread") ); + wxT("can't wait for detached thread") ); ExitCode rc = (ExitCode)-1; (void)Delete(&rc); return(rc); @@ -937,12 +926,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; } @@ -978,7 +963,7 @@ void WXDLLEXPORT wxWakeUpMainThread() #endif } -void WXDLLEXPORT wxMutexGuiEnter() +void wxMutexGuiEnterImpl() { // this would dead lock everything... wxASSERT_MSG( !wxThread::IsMain(), @@ -1000,7 +985,7 @@ void WXDLLEXPORT wxMutexGuiEnter() gs_pCritsectGui->Enter(); } -void WXDLLEXPORT wxMutexGuiLeave() +void wxMutexGuiLeaveImpl() { wxCriticalSectionLocker enter(*gs_pCritsectWaitingForGui);