#ifndef GLTB_CONDITIONVARIABLE_H #define GLTB_CONDITIONVARIABLE_H #ifdef WIN32 #include #else #include #include #endif #include "GLTB/mutex.h" #include "GLTB/referencedobject.h" #include "GLTB/refptr.h" namespace gltb { class ConditionVariable : public ReferencedObject { public: ConditionVariable() { #ifdef WIN32 InitializeConditionVariable(&conditionVariable); #else pthread_cond_init(&conditionVariable,NULL); #endif } ~ConditionVariable() { #ifdef WIN32 // nothing to do here #else pthread_cond_destroy(&conditionVariable); #endif } void signal() { #ifdef WIN32 WakeConditionVariable(&conditionVariable); #else pthread_cond_signal(&conditionVariable); #endif } void signalAll() { #ifdef WIN32 WakeAllConditionVariable(&conditionVariable); #else pthread_cond_broadcast(&conditionVariable); #endif } /** * Wait indefinitely for the variable to be signaled. */ void wait(gltb::RefPtr mutex) { #ifdef WIN32 SleepConditionVariableCS(&conditionVariable, mutex->_getNative(), INFINITE); #else pthread_cond_wait(&conditionVariable, mutex->_getNative()); #endif } /** * Wait for the variable to be signaled or until the time runs out. * * @param timeout timeout in millisecons * @returns true if variable was signaled, false if a timeout occurred */ bool wait(gltb::RefPtr mutex, int timeout) { #ifdef WIN32 int result = SleepConditionVariableCS(&conditionVariable, mutex->_getNative(), timeout); int error = GetLastError(); if(error == ERROR_TIMEOUT) { return false; } return true; #else timespec duration; duration.tv_sec = timeout / 1000; duration.tv_nsec = (timeout - duration.tv_sec * 1000) * 1000000; int result = pthread_cond_timedwait(&conditionVariable, mutex->_getNative(), &duration); if(result == ETIMEDOUT) { return false; } return true; #endif } private: #ifdef WIN32 CONDITION_VARIABLE conditionVariable; #else pthread_cond_t conditionVariable; #endif }; } #endif