if (iTimeout == 0)
return Wait(mutex, predicate);
- bool bReturn(true);
- if (!predicate)
+ if (predicate)
+ return true;
+
+ bool bReturn(false);
+ bool bBreak(false);
+ CTimeout timeout(iTimeout);
+ uint32_t iMsLeft(0);
+
+ while (!bReturn && !bBreak)
{
- CTimeout timeout(iTimeout);
- uint32_t iMsLeft(0);
- bReturn = false;
- while (!bReturn)
- {
- iMsLeft = timeout.TimeLeft();
- if ((bReturn = iMsLeft == 0 || predicate) == false)
- m_condition.Wait(mutex.m_mutex, iMsLeft);
- }
+ iMsLeft = timeout.TimeLeft();
+ if ((bReturn = predicate) == false && (bBreak = iMsLeft == 0) == false)
+ m_condition.Wait(mutex.m_mutex, iMsLeft);
}
return bReturn;
}
class CEvent
{
public:
- CEvent(void) :
+ CEvent(bool bAutoReset = true) :
m_bSignaled(false),
m_bBroadcast(false),
- m_iWaitingThreads(0) {}
+ m_iWaitingThreads(0),
+ m_bAutoReset(bAutoReset) {}
virtual ~CEvent(void) {}
void Broadcast(void)
{
CLockObject lock(m_mutex);
bool bReturn(m_bSignaled);
- if (bReturn && (--m_iWaitingThreads == 0 || !m_bBroadcast))
+ if (bReturn && (--m_iWaitingThreads == 0 || !m_bBroadcast) && m_bAutoReset)
m_bSignaled = false;
return bReturn;
}
- volatile bool m_bSignaled;
- CCondition<volatile bool&> m_condition;
- CMutex m_mutex;
- volatile bool m_bBroadcast;
- unsigned int m_iWaitingThreads;
+ volatile bool m_bSignaled;
+ CCondition<volatile bool> m_condition;
+ CMutex m_mutex;
+ volatile bool m_bBroadcast;
+ unsigned int m_iWaitingThreads;
+ bool m_bAutoReset;
};
}