Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[s4u] ConditionVariable, implement missing wait methods
[simgrid.git] / include / simgrid / s4u / conditionVariable.hpp
1 /* Copyright (c) 2006-2016. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #ifndef SIMGRID_S4U_COND_VARIABLE_HPP
7 #define SIMGRID_S4U_COND_VARIABLE_HPP
8
9 #include <condition_variable>
10 #include <mutex>
11 #include <utility> // std::swap
12
13 #include <simgrid/simix.h>
14 #include <simgrid/s4u/mutex.hpp>
15
16 namespace simgrid {
17 namespace s4u {
18
19 class Mutex;
20
21 XBT_PUBLIC_CLASS ConditionVariable {
22   
23 public:
24   ConditionVariable();
25
26   ConditionVariable(ConditionVariable* cond) : cond_(SIMIX_cond_ref(cond->cond_)) {}
27   ~ConditionVariable();
28
29   // Copy+move (with the copy-and-swap idiom):
30   ConditionVariable(ConditionVariable const& cond) : cond_(SIMIX_cond_ref(cond.cond_)) {}
31   friend void swap(ConditionVariable& first, ConditionVariable& second)
32   {
33     using std::swap;
34     swap(first.cond_, second.cond_);
35   }
36   ConditionVariable& operator=(ConditionVariable cond)
37   {
38     swap(*this, cond);
39     return *this;
40   }
41   ConditionVariable(ConditionVariable&& cond) : cond_(nullptr)
42   {
43     swap(*this, cond);
44   }
45
46   bool valid() const
47   {
48     return cond_ != nullptr;
49   }
50   
51   //  Wait functions:
52
53   void wait(std::unique_lock<Mutex>& lock);
54   std::cv_status wait_until(std::unique_lock<Mutex>& lock, double timeout_time);
55   std::cv_status wait_for(std::unique_lock<Mutex>& lock, double duration);
56
57   // Variants which takes a predicate:
58
59   template<class P>
60   void wait(std::unique_lock<Mutex>& lock, P pred)
61   {
62     while (!pred())
63       wait(lock);
64   }
65   template<class P>
66   bool wait_until(std::unique_lock<Mutex>& lock, double timeout_time, P pred)
67   {
68     while (!pred())
69       if (this->wait_until(lock, timeout_time) == std::cv_status::timeout)
70         return pred();
71     return true;
72   }
73   template<class P>
74   bool wait_for(std::unique_lock<Mutex>& lock, double duration, P pred)
75   {
76     return this->wait_until(lock, SIMIX_get_clock() + duration, std::move(pred));
77   }
78
79   // Notify functions
80
81   void notify();
82   void notify_all();
83
84 private:
85   smx_cond_t cond_;
86
87 };
88 }} // namespace simgrid::s4u
89
90 #endif /* SIMGRID_S4U_COND_VARIABLE_HPP */