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
// --------------------------------------------------------------------------
#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