one more correction to wxCondition::WaitTimeout() return code: don't overwrite err with the semaphore wait result (bug 1387179)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42206 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-10-21 16:06:11 +00:00
parent 4cbc928afc
commit e7e9ac91c2

View File

@@ -116,12 +116,12 @@ wxCondError wxConditionInternal::Wait()
// a potential race condition can occur here // a potential race condition can occur here
// //
// after a thread increments nwaiters, and unlocks the mutex and before the // after a thread increments m_numWaiters, and unlocks the mutex and before
// semaphore.Wait() is called, if another thread can cause a signal to be // the semaphore.Wait() is called, if another thread can cause a signal to
// generated // be generated
// //
// this race condition is handled by using a semaphore and incrementing the // this race condition is handled by using a semaphore and incrementing the
// semaphore only if 'nwaiters' is greater that zero since the semaphore, // semaphore only if m_numWaiters is greater that zero since the semaphore,
// can 'remember' signals the race condition will not occur // can 'remember' signals the race condition will not occur
// wait ( if necessary ) and decrement semaphore // wait ( if necessary ) and decrement semaphore
@@ -154,22 +154,22 @@ wxCondError wxConditionInternal::WaitTimeout(unsigned long milliseconds)
if ( err == wxSEMA_TIMEOUT ) if ( err == wxSEMA_TIMEOUT )
{ {
// another potential race condition exists here it is caused when a // another potential race condition exists here it is caused when a
// 'waiting' thread timesout, and returns from WaitForSingleObject, but // 'waiting' thread times out, and returns from WaitForSingleObject,
// has not yet decremented 'nwaiters'. // but has not yet decremented m_numWaiters
// //
// at this point if another thread calls signal() then the semaphore // at this point if another thread calls signal() then the semaphore
// will be incremented, but the waiting thread will miss it. // will be incremented, but the waiting thread will miss it.
// //
// to handle this particular case, the waiting thread calls // to handle this particular case, the waiting thread calls
// WaitForSingleObject again with a timeout of 0, after locking // WaitForSingleObject again with a timeout of 0, after locking
// 'nwaiters_mutex'. this call does not block because of the zero // m_csWaiters. This call does not block because of the zero
// timeout, but will allow the waiting thread to catch the missed // timeout, but will allow the waiting thread to catch the missed
// signals. // signals.
wxCriticalSectionLocker lock(m_csWaiters); wxCriticalSectionLocker lock(m_csWaiters);
err = m_semaphore.WaitTimeout(0); wxSemaError err2 = m_semaphore.WaitTimeout(0);
if ( err != wxSEMA_NO_ERROR ) if ( err2 != wxSEMA_NO_ERROR )
{ {
m_numWaiters--; m_numWaiters--;
} }