X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0f85c75558b648a231f53f4dba18cc6788858b10..fb33f893495b18dc7a0e13182b901d4cf662150f:/include/simgrid/s4u/conditionVariable.hpp diff --git a/include/simgrid/s4u/conditionVariable.hpp b/include/simgrid/s4u/conditionVariable.hpp index 2db6fb8f9d..d3e777e6ae 100644 --- a/include/simgrid/s4u/conditionVariable.hpp +++ b/include/simgrid/s4u/conditionVariable.hpp @@ -17,16 +17,16 @@ #include #include -#include +#include +#include namespace simgrid { namespace s4u { -class Mutex; - -/** A condition variable +/** @brief A condition variable + * @ingroup s4u_api * - * This is based on std::condition_variable and should respect the same + * This is a drop-in replacement of `std::condition_variable` and should respect the same * semantic. But we currently use (only) double for both durations and * timestamp timeouts. */ @@ -46,41 +46,20 @@ public: static Ptr createConditionVariable(); - // Wait functions: + // Wait functions without time: 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); - - /** Wait for a given duraiton - * - * This version gives us the ability to do (in C++): - * - * - * using namespace std::literals::chrono_literals; - * - * cond->wait_for(lock, 1ms); - * cond->wait_for(lock, 1s); - * cond->wait_for(lock, 1min); - * cond->wait_for(lock, 1h); - * - */ - template - std::cv_status wait_for(std::unique_lock& lock, std::chrono::duration duration) - { - typedef std::chrono::duration SecondsDouble; - auto seconds = std::chrono::duration_cast(duration); - return this->wait_for(lock, duration.count()); - } - - // Variants which takes a predicate: - template void wait(std::unique_lock& lock, P pred) { while (!pred()) wait(lock); } + + // Wait function taking a plain double as time: + + std::cv_status wait_until(std::unique_lock& lock, double timeout_time); + std::cv_status wait_for(std::unique_lock& lock, double duration); template bool wait_until(std::unique_lock& lock, double timeout_time, P pred) { @@ -94,13 +73,39 @@ public: { return this->wait_until(lock, SIMIX_get_clock() + duration, std::move(pred)); } + + // Wait function taking a C++ style time: + template - bool wait_for(std::unique_lock& lock, std::chrono::duration duration, P pred) + bool wait_for( + std::unique_lock& lock, std::chrono::duration duration, + P pred) { - typedef std::chrono::duration SecondsDouble; - auto seconds = std::chrono::duration_cast(duration); + auto seconds = std::chrono::duration_cast(duration); return this->wait_for(lock, seconds.count(), pred); } + template + std::cv_status wait_for( + std::unique_lock& lock, std::chrono::duration duration) + { + auto seconds = std::chrono::duration_cast(duration); + return this->wait_for(lock, seconds.count()); + } + template + std::cv_status wait_until(std::unique_lock& lock, + const SimulationTimePoint& timeout_time) + { + auto timeout_native = std::chrono::time_point_cast(timeout_time); + return this->wait_until(lock, timeout_native.time_since_epoch().count()); + } + template + bool wait_until(std::unique_lock& lock, + const SimulationTimePoint& timeout_time, P pred) + { + auto timeout_native = std::chrono::time_point_cast(timeout_time); + return this->wait_until(lock, timeout_native.time_since_epoch().count(), + std::move(pred)); + } // Notify functions