/*
* 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.
inline struct timespec GetAbsTime(uint64_t iIncreaseBy = 0)
{
- struct timespec abstime;
- struct timeval now;
- gettimeofday(&now, NULL);
- iIncreaseBy += now.tv_usec / 1000;
- abstime.tv_sec = now.tv_sec + (time_t)(iIncreaseBy / 1000);
- abstime.tv_nsec = (int32_t)((iIncreaseBy % (uint32_t)1000) * (uint32_t)1000000);
- return abstime;
+ struct timespec now;
+ #ifdef __APPLE__
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ now.tv_sec = tv.tv_sec;
+ now.tv_nsec = tv.tv_usec * 1000;
+ #else
+ clock_gettime(CLOCK_REALTIME, &now);
+ #endif
+ now.tv_nsec += iIncreaseBy % 1000 * 1000000;
+ now.tv_sec += iIncreaseBy / 1000 + now.tv_nsec / 1000000000;
+ now.tv_nsec %= 1000000000;
+ return now;
}
typedef pthread_t thread_t;
#define ThreadsCreate(thread, func, arg) (pthread_create(&thread, NULL, (void *(*) (void *))func, (void *)arg) == 0)
- #define ThreadsWait(thread, retval) (pthread_join(thread, retval) == 0)
+ #define ThreadsWait(thread, retval) (thread ? pthread_join(thread, retval) == 0 : true)
typedef pthread_mutex_t mutex_t;
#define MutexCreate(mutex) pthread_mutex_init(&mutex, GetRecursiveMutexAttribute());
#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;
+ };
}