X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/851011012031214525df480e2c5abddb490228fe..4fd0a2b6cf055692f936e29294496d14a6091ff1:/include/simgrid/s4u/conditionVariable.hpp diff --git a/include/simgrid/s4u/conditionVariable.hpp b/include/simgrid/s4u/conditionVariable.hpp index ce06ef00ca..0c34c9284f 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 @@ -17,6 +18,12 @@ namespace s4u { class Mutex; +/** A condition variable + * + * This is based on std::condition_variable and should respect the same + * semantic. But we currently use (only) double for both durations and + * timestamp timeouts. + */ XBT_PUBLIC_CLASS ConditionVariable { public: @@ -47,33 +54,36 @@ public: return cond_ != nullptr; } - /** - * Wait functions - */ + // Wait functions: + void wait(std::unique_lock& lock); - // TODO, return std::cv_status - void wait_for(std::unique_lock& lock, double duration); - // TODO, wait_until + std::cv_status wait_until(std::unique_lock& lock, double timeout_time); + std::cv_status wait_for(std::unique_lock& lock, double duration); + + // Variants which takes a predicate: - /** Variant which takes a predice */ template void wait(std::unique_lock& lock, P pred) { while (!pred()) wait(lock); } - // TODO, return std::cv_status template - void wait_for(std::unique_lock& lock, double duration, P pred) + bool wait_until(std::unique_lock& lock, double timeout_time, P pred) { while (!pred()) - wait_for(lock, duration); + if (this->wait_until(lock, timeout_time) == std::cv_status::timeout) + return pred(); + return true; + } + template + bool wait_for(std::unique_lock& lock, double duration, P pred) + { + return this->wait_until(lock, SIMIX_get_clock() + duration, std::move(pred)); } - // TODO,wait_until - /** - * Notify functions - */ + // Notify functions + void notify(); void notify_all();