// %flair:license{ // This file is part of the Flair framework distributed under the // CECILL-C License, Version 1.0. // %flair:license} // created: 2014/02/07 // filename: ConditionVariable_impl.cpp // // author: Guillaume Sanahuja // Copyright Heudiasyc UMR UTC/CNRS 7253 // // version: $Id: $ // // purpose: Class defining a condition variable // // /*********************************************************************/ #include "ConditionVariable_impl.h" #include "ConditionVariable.h" #include "Mutex_impl.h" #include using std::string; using namespace flair::core; ConditionVariable_impl::ConditionVariable_impl(ConditionVariable *self) { this->self = self; int status; #ifdef __XENO__ status = rt_cond_create(&m_ResumeCond, NULL); #else status = pthread_cond_init(&m_ResumeCond, 0); #endif if (status != 0) { char errorMsg[256]; self->Err("error creating condition variable (%s)\n", strerror_r(-status, errorMsg, sizeof(errorMsg))); } } ConditionVariable_impl::~ConditionVariable_impl() { int status; #ifdef __XENO__ status = rt_cond_delete(&m_ResumeCond); #else status = pthread_cond_destroy(&m_ResumeCond); #endif if (status != 0) { char errorMsg[256]; self->Err("error destroying condition variable (%s)\n", strerror_r(-status, errorMsg, sizeof(errorMsg))); } } void ConditionVariable_impl::CondWait(void) { int status; #ifdef __XENO__ status = rt_cond_wait(&m_ResumeCond, &self->Mutex::pimpl_->mutex, TM_INFINITE); #else status = pthread_cond_wait(&m_ResumeCond, &self->Mutex::pimpl_->mutex); #endif if (status != 0) { char errorMsg[256]; self->Err("error (%s)\n", strerror_r(-status, errorMsg, sizeof(errorMsg))); } } bool ConditionVariable_impl::CondWaitUntil(Time date) { int status; #ifdef __XENO__ status = rt_cond_wait_until(&m_ResumeCond, &self->Mutex::pimpl_->mutex, date); #else struct timespec restrict; restrict.tv_sec = date / 1000000000; restrict.tv_nsec = date % 1000000000; status = pthread_cond_timedwait(&m_ResumeCond, &self->Mutex::pimpl_->mutex, &restrict); #endif if (status == 0) return true; if (status != ETIMEDOUT) { char errorMsg[256]; self->Err("error (%s)\n", strerror_r(-status, errorMsg, sizeof(errorMsg))); } return false; } void ConditionVariable_impl::CondSignal(void) { int status; #ifdef __XENO__ status = rt_cond_signal(&m_ResumeCond); #else status = pthread_cond_signal(&m_ResumeCond); #endif if (status != 0) { char errorMsg[256]; self->Err("error (%s)\n", strerror_r(-status, errorMsg, sizeof(errorMsg))); } }