]> AND Private Git Repository - loba.git/blobdiff - synchro.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Handle timeout exception in condition_t::timedwait().
[loba.git] / synchro.h
index 7b04f9241f24a2dd91d855c075270b19cfb9b70c..45e0901cac01d9343c48192ba1799fa15ac89c63 100644 (file)
--- a/synchro.h
+++ b/synchro.h
@@ -1,7 +1,7 @@
 #ifndef SYNCHRO_H
 #define SYNCHRO_H
 
 #ifndef SYNCHRO_H
 #define SYNCHRO_H
 
-#include <xbt/synchro.h>
+#include <xbt/synchro_core.h>
 
 class mutex_t {
 public:
 
 class mutex_t {
 public:
@@ -9,10 +9,11 @@ public:
     ~mutex_t()                  { xbt_mutex_destroy(mutex); }
     void acquire()              { xbt_mutex_acquire(mutex); }
     void release()              { xbt_mutex_release(mutex); }
     ~mutex_t()                  { xbt_mutex_destroy(mutex); }
     void acquire()              { xbt_mutex_acquire(mutex); }
     void release()              { xbt_mutex_release(mutex); }
-    xbt_mutex_t get()           { return mutex;             }
 
 private:
     xbt_mutex_t mutex;
 
 private:
     xbt_mutex_t mutex;
+
+    friend class condition_t;
 };
 
 class condition_t {
 };
 
 class condition_t {
@@ -21,9 +22,19 @@ public:
     ~condition_t()              { xbt_cond_destroy(cond);           }
     void broadcast()            { xbt_cond_broadcast(cond);         }
     void signal()               { xbt_cond_signal(cond);            }
     ~condition_t()              { xbt_cond_destroy(cond);           }
     void broadcast()            { xbt_cond_broadcast(cond);         }
     void signal()               { xbt_cond_signal(cond);            }
-    void wait(mutex_t& mutex)   { xbt_cond_wait(cond, mutex.get()); }
-    void timedwait(mutex_t& mutex, double delay) {
-        xbt_cond_timedwait(cond, mutex.get(), delay);
+    void wait(mutex_t& mutex)   { xbt_cond_wait(cond, mutex.mutex); }
+    bool timedwait(mutex_t& mutex, double delay) {
+        xbt_ex_t e;
+        TRY {
+            xbt_cond_timedwait(cond, mutex.mutex, delay);
+        }
+        CATCH (e) {
+            if (e.category != timeout_error)
+                RETHROW;
+            xbt_ex_free(e);
+            return false;       // got a timeout
+        }
+        return true;
     }
 
 private:
     }
 
 private: