/*
* This file is part of the libCEC(R) library.
*
- * libCEC(R) is Copyright (C) 2011 Pulse-Eight Limited. All rights reserved.
+ * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved.
* libCEC(R) is an original work, containing original code.
*
* libCEC(R) is a trademark of Pulse-Eight Limited.
bool m_bClearOnExit;
};
- class CCondition : public PreventCopy
+ class CTryLockObject : public PreventCopy
{
public:
- inline CCondition(void)
+ inline CTryLockObject(CMutex &mutex, bool bClearOnExit = false) :
+ m_mutex(mutex),
+ m_bClearOnExit(bClearOnExit),
+ m_bIsLocked(m_mutex.TryLock())
+ {
+ }
+
+ inline ~CTryLockObject(void)
+ {
+ if (m_bClearOnExit)
+ Clear();
+ else if (m_bIsLocked)
+ Unlock();
+ }
+
+ inline bool TryLock(void)
+ {
+ bool bReturn = m_mutex.TryLock();
+ m_bIsLocked |= bReturn;
+ return bReturn;
+ }
+
+ inline void Unlock(void)
{
- ConditionCreate(m_condition);
+ if (m_bIsLocked)
+ {
+ m_bIsLocked = false;
+ m_mutex.Unlock();
+ }
}
+ inline bool Clear(void)
+ {
+ m_bIsLocked = false;
+ return m_mutex.Clear();
+ }
+
+ inline bool Lock(void)
+ {
+ bool bReturn = m_mutex.Lock();
+ m_bIsLocked |= bReturn;
+ return bReturn;
+ }
+
+ inline bool IsLocked(void) const
+ {
+ return m_bIsLocked;
+ }
+
+ private:
+ CMutex & m_mutex;
+ bool m_bClearOnExit;
+ volatile bool m_bIsLocked;
+ };
+
+ class CCondition : public PreventCopy
+ {
+ public:
+ inline CCondition(void) {}
inline ~CCondition(void)
{
- Broadcast();
- ConditionDelete(m_condition);
+ m_condition.Broadcast();
}
inline void Broadcast(void)
{
- ConditionBroadcast(m_condition);
+ m_condition.Broadcast();
}
inline void Signal(void)
{
- ConditionSignal(m_condition);
+ m_condition.Signal();
}
inline bool Wait(CMutex &mutex, uint32_t iTimeout = 0)
{
- return ConditionWait(m_condition, mutex.m_mutex, iTimeout);
+ return m_condition.Wait(mutex.m_mutex, iTimeout);
}
static void Sleep(uint32_t iTimeout)
w.Wait(m, iTimeout);
}
- condition_t m_condition;
+ private:
+ CConditionImpl m_condition;
};
}