From 324204969dba501413a9f62de983806a6fddd6a0 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Mon, 30 Apr 2018 13:25:42 +0200 Subject: [PATCH] Be consistent and hold mutex in any case when returning from condition_t::timedwait(). --- messages.cpp | 12 ++++++++---- synchro.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/messages.cpp b/messages.cpp index 6c9f3ec..70e2236 100644 --- a/messages.cpp +++ b/messages.cpp @@ -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(MSG_task_get_data(task)); from = MSG_task_get_source(task); MSG_task_destroy(task); diff --git a/synchro.h b/synchro.h index 45e0901..fed9e87 100644 --- 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; -- 2.39.5