X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fposix%2Fos-threads.h;h=5216ffe7793ac40bea9c28bf93ffbb6e7cba986b;hb=3b2bd169c03f74ccca35d9e211bbbc1308c33675;hp=9f7a688f26fbde241734b03989fb42222f1da7bb;hpb=f00ff009cfc5dfefdf09ca241b9560e74575b3f5;p=deb_libcec.git diff --git a/src/lib/platform/posix/os-threads.h b/src/lib/platform/posix/os-threads.h index 9f7a688..5216ffe 100644 --- a/src/lib/platform/posix/os-threads.h +++ b/src/lib/platform/posix/os-threads.h @@ -2,7 +2,7 @@ /* * 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. @@ -69,19 +69,45 @@ namespace PLATFORM #define MutexTryLock(mutex) (pthread_mutex_trylock(&mutex) == 0) #define MutexUnlock(mutex) pthread_mutex_unlock(&mutex) - typedef pthread_cond_t condition_t; - #define ConditionCreate(cond) pthread_cond_init(&cond, NULL) - #define ConditionDelete(cond) pthread_cond_destroy(&cond) - #define ConditionSignal(cond) pthread_cond_signal(&cond) - #define ConditionBroadcast(cond) pthread_cond_broadcast(&cond) - inline bool ConditionWait(condition_t &cond, mutex_t &mutex, uint32_t iTimeout) + class CConditionImpl { - sched_yield(); - if (iTimeout > 0) + public: + CConditionImpl(void) { - struct timespec timeout = GetAbsTime(iTimeout); - return (pthread_cond_timedwait(&cond, &mutex, &timeout) == 0); + pthread_cond_init(&m_condition, NULL); } - return (pthread_cond_wait(&cond, &mutex) == 0); - } + + virtual ~CConditionImpl(void) + { + pthread_cond_destroy(&m_condition); + } + + void Signal(void) + { + pthread_cond_signal(&m_condition); + } + + void Broadcast(void) + { + pthread_cond_broadcast(&m_condition); + } + + bool Wait(mutex_t &mutex) + { + sched_yield(); + return (pthread_cond_wait(&m_condition, &mutex) == 0); + } + + bool Wait(mutex_t &mutex, uint32_t iTimeoutMs) + { + if (iTimeoutMs == 0) + return Wait(mutex); + + sched_yield(); + struct timespec timeout = GetAbsTime(iTimeoutMs); + return (pthread_cond_timedwait(&m_condition, &mutex, &timeout) == 0); + } + + pthread_cond_t m_condition; + }; }