X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d1bab566475b6573c1c0c982eec395c6d8eef13a..29a7b4d041fa15b6b45b70b7e4ce2151a9673820:/include/wx/thrimpl.cpp diff --git a/include/wx/thrimpl.cpp b/include/wx/thrimpl.cpp index 72684b044d..6e49c573e1 100644 --- a/include/wx/thrimpl.cpp +++ b/include/wx/thrimpl.cpp @@ -64,19 +64,11 @@ wxMutexError wxMutex::Unlock() // wxConditionInternal // -------------------------------------------------------------------------- -#if defined(__WXMSW__) || defined(__WXPM__) // Win32 and OS/2 don't have explicit support for the POSIX condition // variables and their events/event semaphores have quite different semantics, // so we reimplement the conditions from scratch using the mutexes and // semaphores -#ifdef __WXPM__ -void InterlockedIncrement(LONG *num) -{ - ::DosEnterCritSec(); - (*num)++; - ::DosExitCritSec(); -} -#endif +#if defined(__WXMSW__) || defined(__OS2__) || defined(__EMX__) class wxConditionInternal { @@ -115,7 +107,10 @@ wxConditionInternal::wxConditionInternal(wxMutex& mutex) wxCondError wxConditionInternal::Wait() { // increment the number of waiters - ::InterlockedIncrement(&m_numWaiters); + { + wxCriticalSectionLocker lock(m_csWaiters); + m_numWaiters++; + } m_mutex.Unlock(); @@ -133,12 +128,20 @@ wxCondError wxConditionInternal::Wait() wxSemaError err = m_semaphore.Wait(); m_mutex.Lock(); - return err == wxSEMA_NO_ERROR ? wxCOND_NO_ERROR : wxCOND_MISC_ERROR; + if ( err == wxSEMA_NO_ERROR ) + return wxCOND_NO_ERROR; + else if ( err == wxSEMA_TIMEOUT ) + return wxCOND_TIMEOUT; + else + return wxCOND_MISC_ERROR; } wxCondError wxConditionInternal::WaitTimeout(unsigned long milliseconds) { - ::InterlockedIncrement(&m_numWaiters); + { + wxCriticalSectionLocker lock(m_csWaiters); + m_numWaiters++; + } m_mutex.Unlock(); @@ -148,7 +151,7 @@ wxCondError wxConditionInternal::WaitTimeout(unsigned long milliseconds) wxSemaError err = m_semaphore.WaitTimeout(milliseconds); - if ( err == wxSEMA_BUSY ) + if ( err == wxSEMA_TIMEOUT ) { // another potential race condition exists here it is caused when a // 'waiting' thread timesout, and returns from WaitForSingleObject, but @@ -174,7 +177,9 @@ wxCondError wxConditionInternal::WaitTimeout(unsigned long milliseconds) m_mutex.Lock(); - return err == wxSEMA_NO_ERROR ? wxCOND_NO_ERROR : wxCOND_MISC_ERROR; + return err == wxSEMA_NO_ERROR ? wxCOND_NO_ERROR + : err == wxSEMA_TIMEOUT ? wxCOND_TIMEOUT + : wxCOND_MISC_ERROR; } wxCondError wxConditionInternal::Signal() @@ -207,7 +212,8 @@ wxCondError wxConditionInternal::Broadcast() return wxCOND_NO_ERROR; } -#endif + +#endif // MSW or OS2 // ---------------------------------------------------------------------------- // wxCondition