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:
@@ -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
|
||||||
|
Reference in New Issue
Block a user