Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[s4u] Remove broken ConditionVariable::wait_for(lock, duration, pred)
[simgrid.git] / src / s4u / s4u_conditionVariable.cpp
1 #include <exception>
2 #include <mutex>
3
4 #include <xbt/log.hpp>
5
6 #include "simgrid/s4u/conditionVariable.hpp"
7 #include "simgrid/simix.h"
8
9 using namespace simgrid;
10
11 s4u::ConditionVariable::ConditionVariable()  : cond_(simcall_cond_init()){
12     
13 }
14
15 s4u::ConditionVariable::~ConditionVariable() {
16   SIMIX_cond_unref(cond_);
17 }
18
19 /**
20  * Wait functions
21  */
22 void s4u::ConditionVariable::wait(std::unique_lock<Mutex>& lock) {
23   simcall_cond_wait(cond_, lock.mutex()->mutex_);
24 }
25   
26 std::cv_status s4u::ConditionVariable::wait_for(std::unique_lock<Mutex>& lock, double timeout) {
27   try {
28     simcall_cond_wait_timeout(cond_, lock.mutex()->mutex_, timeout);
29     return std::cv_status::timeout;
30   }
31   catch (xbt_ex& e) {
32     if (e.category == timeout_error) {
33       // We have to take the lock:
34       try {
35         lock.mutex()->lock();
36       }
37       catch (...) {
38         std::terminate();
39       }
40       return std::cv_status::timeout;
41     }
42     std::terminate();
43   }
44   catch (...) {
45     std::terminate();
46   }
47 }
48   
49 /**
50  * Notify functions
51  */
52 void s4u::ConditionVariable::notify() { 
53    simcall_cond_signal(cond_);
54 }
55  
56 void s4u::ConditionVariable::notify_all() {
57   simcall_cond_broadcast(cond_);
58 }
59
60