* http://www.pulse-eight.net/
*/
-#include "../os.h"
+#include "lib/platform/os.h"
#if defined(__WINDOWS__)
-#include "../windows/os-threads.h"
+#include "lib/platform/windows/os-threads.h"
#else
-#include "../posix/os-threads.h"
+#include "lib/platform/posix/os-threads.h"
#endif
-#include "../util/timeutils.h"
+#include "lib/platform/util/timeutils.h"
namespace PLATFORM
{
private:
inline PreventCopy(const PreventCopy &c) { *this = c; }
- inline PreventCopy &operator=(const PreventCopy &c){ *this = c; return *this; }
+ inline PreventCopy &operator=(const PreventCopy & UNUSED(c)){ return *this; }
};
template <typename _Predicate>
inline bool Lock(void)
{
- MutexLock(m_mutex);
- ++m_iLockCount;
- return true;
+ if (MutexLock(m_mutex))
+ {
+ ++m_iLockCount;
+ return true;
+ }
+ return false;
}
inline void Unlock(void)
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);
- uint64_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;
};
}