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
This commit is contained in:
Vadim Zeitlin
2006-02-19 14:38:20 +00:00
parent b0c43acc87
commit 2d0bea2c37

View File

@@ -64,19 +64,11 @@ wxMutexError wxMutex::Unlock()
// wxConditionInternal // wxConditionInternal
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
#if defined(__WXMSW__) || defined(__OS2__) || defined(__EMX__)
// Win32 and OS/2 don't have explicit support for the POSIX condition // Win32 and OS/2 don't have explicit support for the POSIX condition
// variables and their events/event semaphores have quite different semantics, // variables and their events/event semaphores have quite different semantics,
// so we reimplement the conditions from scratch using the mutexes and // so we reimplement the conditions from scratch using the mutexes and
// semaphores // semaphores
#if defined(__OS2__) || defined(__EMX__) #if defined(__WXMSW__) || defined(__OS2__) || defined(__EMX__)
void InterlockedIncrement(LONG *num)
{
::DosEnterCritSec();
(*num)++;
::DosExitCritSec();
}
#endif
class wxConditionInternal class wxConditionInternal
{ {
@@ -115,7 +107,10 @@ wxConditionInternal::wxConditionInternal(wxMutex& mutex)
wxCondError wxConditionInternal::Wait() wxCondError wxConditionInternal::Wait()
{ {
// increment the number of waiters // increment the number of waiters
::InterlockedIncrement(&m_numWaiters); {
wxCriticalSectionLocker lock(m_csWaiters);
m_numWaiters++;
}
m_mutex.Unlock(); m_mutex.Unlock();
@@ -143,7 +138,10 @@ wxCondError wxConditionInternal::Wait()
wxCondError wxConditionInternal::WaitTimeout(unsigned long milliseconds) wxCondError wxConditionInternal::WaitTimeout(unsigned long milliseconds)
{ {
::InterlockedIncrement(&m_numWaiters); {
wxCriticalSectionLocker lock(m_csWaiters);
m_numWaiters++;
}
m_mutex.Unlock(); m_mutex.Unlock();
@@ -214,7 +212,8 @@ wxCondError wxConditionInternal::Broadcast()
return wxCOND_NO_ERROR; return wxCOND_NO_ERROR;
} }
#endif
#endif // MSW or OS2
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxCondition // wxCondition