From bac065ed8ef52ee1d74ae249e14aef0a3a5a822e Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Tue, 21 Jun 2016 11:10:01 +0200 Subject: [PATCH] [s4u] Make wait_for return a std::cv --- include/simgrid/s4u/conditionVariable.hpp | 6 ++++-- src/s4u/s4u_conditionVariable.cpp | 26 +++++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/include/simgrid/s4u/conditionVariable.hpp b/include/simgrid/s4u/conditionVariable.hpp index ce06ef00ca..f29a26dcdb 100644 --- a/include/simgrid/s4u/conditionVariable.hpp +++ b/include/simgrid/s4u/conditionVariable.hpp @@ -6,6 +6,7 @@ #ifndef SIMGRID_S4U_COND_VARIABLE_HPP #define SIMGRID_S4U_COND_VARIABLE_HPP +#include #include #include // std::swap @@ -52,7 +53,7 @@ public: */ void wait(std::unique_lock& lock); // TODO, return std::cv_status - void wait_for(std::unique_lock& lock, double duration); + std::cv_status wait_for(std::unique_lock& lock, double duration); // TODO, wait_until /** Variant which takes a predice */ @@ -62,9 +63,10 @@ public: while (!pred()) wait(lock); } + // TODO, return std::cv_status template - void wait_for(std::unique_lock& lock, double duration, P pred) + std::cv_status wait_for(std::unique_lock& lock, double duration, P pred) { while (!pred()) wait_for(lock, duration); diff --git a/src/s4u/s4u_conditionVariable.cpp b/src/s4u/s4u_conditionVariable.cpp index 32c8aabdbd..bb367af7e0 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" @@ -20,8 +23,27 @@ 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 (e.category == timeout_error) { + // We have to take the lock: + try { + lock.mutex()->lock(); + } + catch (...) { + std::terminate(); + } + return std::cv_status::timeout; + } + std::terminate(); + } + catch (...) { + std::terminate(); + } } /** -- 2.20.1