- // We caught a signal.
- wxASSERT( m_signals > m_canceled);
- -- m_waiters;
- if ( -- m_signals == m_canceled)
- {
- // This was the last signal. open the gate.
- wxASSERT( m_waiters == m_canceled);
- m_gate.Post();
- }
+ 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( wx("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;
+ }