X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fthreads%2Fmutex.h;h=11e3606d09250e5d715eb116ad2a3d2ca939117a;hb=d068b3d4be849b301cd8e0b481080628289c897b;hp=bb4e006e331b373dfacd585eb682e53e5f47f697;hpb=41c655b6ba019bd5c342be9fcfa8c34fad0178ef;p=deb_libcec.git diff --git a/src/lib/platform/threads/mutex.h b/src/lib/platform/threads/mutex.h index bb4e006..11e3606 100644 --- a/src/lib/platform/threads/mutex.h +++ b/src/lib/platform/threads/mutex.h @@ -54,11 +54,13 @@ namespace PLATFORM inline PreventCopy &operator=(const PreventCopy &c){ *this = c; return *this; } }; - class CCondition; + template + class CCondition; class CMutex : public PreventCopy { - friend class CCondition; + template + friend class CCondition; public: inline CMutex(void) : m_iLockCount(0) @@ -223,16 +225,66 @@ namespace PLATFORM volatile bool m_bIsLocked; }; - class CCondition : public PreventCopy + template + class CCondition : public PreventCopy + { + public: + inline CCondition(void) {} + inline ~CCondition(void) + { + m_condition.Broadcast(); + } + + inline void Broadcast(void) + { + m_condition.Broadcast(); + } + + inline void Signal(void) + { + m_condition.Signal(); + } + + inline bool Wait(CMutex &mutex, _Predicate &predicate) + { + while(!predicate) + m_condition.Wait(mutex.m_mutex); + return true; + } + + inline bool Wait(CMutex &mutex, _Predicate &predicate, uint32_t iTimeout) + { + if (iTimeout == 0) + return Wait(mutex, predicate); + + bool bReturn(true); + if (!predicate) + { + 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); + } + } + return bReturn; + } + + private: + CConditionImpl m_condition; + }; + + class CEvent { public: - inline CCondition(void) : - m_bPredicate(false), + CEvent(void) : + m_bSignaled(false), + m_bBroadcast(false), m_iWaitingThreads(0) {} - inline ~CCondition(void) - { - Broadcast(); - } + virtual ~CEvent(void) {} void Broadcast(void) { @@ -246,57 +298,53 @@ namespace PLATFORM m_condition.Signal(); } - bool Wait(CMutex &mutex, uint32_t iTimeout = 0) + bool Wait(void) { - { - CLockObject lock(m_mutex); - ++m_iWaitingThreads; - } + CLockObject lock(m_mutex); + ++m_iWaitingThreads; - if (iTimeout > 0) - { - CTimeout timeout(iTimeout); - while (!m_bPredicate && timeout.TimeLeft() > 0) - m_condition.Wait(mutex.m_mutex, timeout.TimeLeft()); - } - else - { - while (!m_bPredicate) - m_condition.Wait(mutex.m_mutex, 0); - } + bool bReturn = m_condition.Wait(m_mutex, m_bSignaled); + return ResetAndReturn() && bReturn; + } + + bool Wait(uint32_t iTimeout) + { + if (iTimeout == 0) + return Wait(); - return ResetAndReturn(); + CLockObject lock(m_mutex); + ++m_iWaitingThreads; + bool bReturn = m_condition.Wait(m_mutex, m_bSignaled, iTimeout); + return ResetAndReturn() && bReturn; } static void Sleep(uint32_t iTimeout) { - CCondition w; - CMutex m; - CLockObject lock(m); - w.Wait(m, iTimeout); + CEvent event; + event.Wait(iTimeout); } private: void Set(bool bBroadcast = false) { CLockObject lock(m_mutex); - m_bPredicate = true; + m_bSignaled = true; m_bBroadcast = bBroadcast; } bool ResetAndReturn(void) { CLockObject lock(m_mutex); - bool bReturn(m_bPredicate); + bool bReturn(m_bSignaled); if (bReturn && (--m_iWaitingThreads == 0 || !m_bBroadcast)) - m_bPredicate = false; + m_bSignaled = false; return bReturn; } - CMutex m_mutex; - CConditionImpl m_condition; - volatile bool m_bPredicate; - volatile bool m_bBroadcast; - unsigned int m_iWaitingThreads; + volatile bool m_bSignaled; + CCondition m_condition; + CMutex m_mutex; + volatile bool m_bBroadcast; + unsigned int m_iWaitingThreads; }; }