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

Private GIT Repository
Save notes for pstar.
[loba.git] / messages.cpp
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)
 {
 
 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;
     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");
         mutex.acquire();
         if (!queue.try_pop(task)) {
             XBT_DEBUG("waiting for a message to come");
+            bool hit_timeout;
             if (timeout > 0) {
             if (timeout > 0) {
-                if (!cond.timedwait(mutex, timeout))
-                    return false;
+                hit_timeout = !cond.timedwait(mutex, timeout);
             } else {
                 cond.wait(mutex);
             } else {
                 cond.wait(mutex);
+                hit_timeout = false;
             }
             bool pop_was_successful = queue.try_pop(task);
             }
             bool pop_was_successful = queue.try_pop(task);
-            xbt_assert(pop_was_successful);
+            xbt_assert(hit_timeout || pop_was_successful);
         }
         mutex.release();
     }
         }
         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);
     msg = static_cast<message*>(MSG_task_get_data(task));
     from = MSG_task_get_source(task);
     MSG_task_destroy(task);