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

Private GIT Repository
Be consistent and hold mutex in any case when returning from condition_t::timedwait().
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Mon, 30 Apr 2018 11:25:42 +0000 (13:25 +0200)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Mon, 30 Apr 2018 11:25:42 +0000 (13:25 +0200)
messages.cpp
synchro.h

index 6c9f3ec0402f3c357676f2bd53be29a83207c096..70e2236198839f8d53a56b918483646658b7fe66 100644 (file)
@@ -63,7 +63,7 @@ void message_queue::push(msg_task_t task)
 
 bool message_queue::pop(message*& msg, msg_host_t& from, double timeout)
 {
-    msg_task_t task;
+    msg_task_t task = nullptr;
     if (!queue.try_pop(task)) {
         if (timeout == 0.0)
             return false;
@@ -71,17 +71,21 @@ bool message_queue::pop(message*& msg, msg_host_t& from, double timeout)
         mutex.acquire();
         if (!queue.try_pop(task)) {
             XBT_DEBUG("waiting for a message to come");
+            bool hit_timeout;
             if (timeout > 0) {
-                if (!cond.timedwait(mutex, timeout))
-                    return false;
+                hit_timeout = !cond.timedwait(mutex, timeout);
             } else {
                 cond.wait(mutex);
+                hit_timeout = false;
             }
             bool pop_was_successful = queue.try_pop(task);
-            xbt_assert(pop_was_successful);
+            xbt_assert(hit_timeout || pop_was_successful);
         }
         mutex.release();
     }
+    if (task == nullptr)
+        return false;
+
     msg = static_cast<message*>(MSG_task_get_data(task));
     from = MSG_task_get_source(task);
     MSG_task_destroy(task);
index 45e0901cac01d9343c48192ba1799fa15ac89c63..fed9e87518354e452866395813423d47315d3eed 100644 (file)
--- a/synchro.h
+++ b/synchro.h
@@ -32,6 +32,7 @@ public:
             if (e.category != timeout_error)
                 RETHROW;
             xbt_ex_free(e);
+            mutex.acquire();
             return false;       // got a timeout
         }
         return true;