From 3634a92de5281a6b19ca03b49b21dad853f386b3 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Mon, 30 Apr 2018 13:18:54 +0200 Subject: [PATCH] Handle timeout exception in condition_t::timedwait(). --- messages.cpp | 17 +++++------------ synchro.h | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/messages.cpp b/messages.cpp index 547a29f..6c9f3ec 100644 --- a/messages.cpp +++ b/messages.cpp @@ -70,19 +70,12 @@ bool message_queue::pop(message*& msg, msg_host_t& from, double timeout) mutex.acquire(); if (!queue.try_pop(task)) { - xbt_ex_t e; XBT_DEBUG("waiting for a message to come"); - TRY { - if (timeout > 0) - cond.timedwait(mutex, timeout); - else - cond.wait(mutex); - } - CATCH (e) { - if (e.category != timeout_error) - RETHROW; - xbt_ex_free(e); - return false; // got a timeout + if (timeout > 0) { + if (!cond.timedwait(mutex, timeout)) + return false; + } else { + cond.wait(mutex); } bool pop_was_successful = queue.try_pop(task); xbt_assert(pop_was_successful); diff --git a/synchro.h b/synchro.h index e366bee..45e0901 100644 --- a/synchro.h +++ b/synchro.h @@ -23,8 +23,18 @@ public: void broadcast() { xbt_cond_broadcast(cond); } void signal() { xbt_cond_signal(cond); } void wait(mutex_t& mutex) { xbt_cond_wait(cond, mutex.mutex); } - void timedwait(mutex_t& mutex, double delay) { - xbt_cond_timedwait(cond, mutex.mutex, delay); + 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: -- 2.39.5