X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5ae4444e56c58d6a957263114cff7d81ff48f6a8..c111bd7eb06c7bd66de5a930ebf86f69c7f984df:/include/simgrid/s4u/conditionVariable.hpp diff --git a/include/simgrid/s4u/conditionVariable.hpp b/include/simgrid/s4u/conditionVariable.hpp index f2790166a2..2858244ef6 100644 --- a/include/simgrid/s4u/conditionVariable.hpp +++ b/include/simgrid/s4u/conditionVariable.hpp @@ -6,6 +6,8 @@ #ifndef SIMGRID_S4U_COND_VARIABLE_HPP #define SIMGRID_S4U_COND_VARIABLE_HPP +#include +#include #include // std::swap #include @@ -46,15 +48,36 @@ public: return cond_ != nullptr; } - /** - * Wait functions - */ - void wait(Mutex *mutex); - void wait_for(Mutex *mutex, double time); - - /** - * Notify functions - */ + // Wait functions: + + void wait(std::unique_lock& lock); + 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: + + template + void wait(std::unique_lock& lock, P pred) + { + while (!pred()) + wait(lock); + } + template + bool wait_until(std::unique_lock& lock, double timeout_time, P pred) + { + while (!pred()) + 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)); + } + + // Notify functions + void notify(); void notify_all();