- m_varSection.Enter();
- m_waiters -= m_canceled;
- m_signals -= m_canceled;
- m_canceled = 0;
- m_varSection.Leave();
- }
- m_gate.Post();
-
- m_mutex.Unlock();
-
- wxSemaError err = m_semaphore.WaitTimeout( msectimeout);
- wxASSERT( err == wxSEMA_NO_ERROR || err == wxSEMA_TIMEOUT);
-
- m_varSection.Enter();
- if ( err != wxSEMA_NO_ERROR)
- {
- if ( m_signals > m_canceled)
- {
- // A signal is being sent after we timed out.
-
- if ( m_waiters == m_signals)
- {
- // There are no excess waiters to catch the signal, so
- // we must throw it away.
-
- wxSemaError err2 = m_semaphore.Wait();
- if ( err2 != wxSEMA_NO_ERROR)
- {
- wxLogSysError(_("Error while waiting on semaphore"));
- }
- wxASSERT( err2 == wxSEMA_NO_ERROR);
- -- m_waiters;
- if ( -- m_signals == m_canceled)
- {
- // This was the last signal. open the gate.
- wxASSERT( m_waiters == m_canceled);
- m_gate.Post();
- }
- }
- else
- {
- // There are excess waiters to catch the signal, leave
- // it be.
- -- m_waiters;
- }
- }
- else
- {
- // No signals is being sent.
- // The gate may be open or closed, so we can't touch m_waiters.
- ++ m_canceled;
- ++ m_signals;
- }