X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a88a4036e14334a7a01fc40a7d547687ba6dee38..c111bd7eb06c7bd66de5a930ebf86f69c7f984df:/src/s4u/s4u_conditionVariable.cpp diff --git a/src/s4u/s4u_conditionVariable.cpp b/src/s4u/s4u_conditionVariable.cpp index 32c8aabdbd..28c9fc0c7f 100644 --- a/src/s4u/s4u_conditionVariable.cpp +++ b/src/s4u/s4u_conditionVariable.cpp @@ -1,5 +1,8 @@ +#include #include +#include + #include "simgrid/s4u/conditionVariable.hpp" #include "simgrid/simix.h" @@ -19,9 +22,42 @@ s4u::ConditionVariable::~ConditionVariable() { void s4u::ConditionVariable::wait(std::unique_lock& lock) { simcall_cond_wait(cond_, lock.mutex()->mutex_); } - -void s4u::ConditionVariable::wait_for(std::unique_lock& lock, double timeout) { - simcall_cond_wait_timeout(cond_, lock.mutex()->mutex_, timeout); + +std::cv_status s4u::ConditionVariable::wait_for(std::unique_lock& lock, double timeout) { + try { + simcall_cond_wait_timeout(cond_, lock.mutex()->mutex_, timeout); + return std::cv_status::timeout; + } + catch (xbt_ex& e) { + + // If the exception was a timeout, we have to take the lock again: + if (e.category == timeout_error) { + try { + lock.mutex()->lock(); + return std::cv_status::timeout; + } + catch (...) { + std::terminate(); + } + } + + // Another exception: should we reaquire the lock? + std::terminate(); + } + catch (...) { + std::terminate(); + } +} + +std::cv_status s4u::ConditionVariable::wait_until(std::unique_lock& lock, double timeout_time) +{ + double now = SIMIX_get_clock(); + double timeout; + if (timeout_time < now) + timeout = 0.0; + else + timeout = timeout_time - now; + return this->wait_for(lock, timeout); } /**