From: Vadim Zeitlin Date: Sun, 19 Feb 2006 14:38:20 +0000 (+0000) Subject: fix MT-unsafe accesses to wxConditionInternal::m_numWaiters X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/2d0bea2c37ff0c3af4396c62a89be5aee1cc8065?ds=inline fix MT-unsafe accesses to wxConditionInternal::m_numWaiters git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37638 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/thrimpl.cpp b/include/wx/thrimpl.cpp index c1f13ec3d9..6e49c573e1 100644 --- a/include/wx/thrimpl.cpp +++ b/include/wx/thrimpl.cpp @@ -64,19 +64,11 @@ wxMutexError wxMutex::Unlock() // wxConditionInternal // -------------------------------------------------------------------------- -#if defined(__WXMSW__) || defined(__OS2__) || defined(__EMX__) // 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 -#if defined(__OS2__) || defined(__EMX__) -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(); @@ -143,7 +138,10 @@ wxCondError wxConditionInternal::Wait() wxCondError wxConditionInternal::WaitTimeout(unsigned long milliseconds) { - ::InterlockedIncrement(&m_numWaiters); + { + wxCriticalSectionLocker lock(m_csWaiters); + m_numWaiters++; + } m_mutex.Unlock(); @@ -214,7 +212,8 @@ wxCondError wxConditionInternal::Broadcast() return wxCOND_NO_ERROR; } -#endif + +#endif // MSW or OS2 // ---------------------------------------------------------------------------- // wxCondition