From f24ae5fb9223f69bf15e5418cdf856f111995e03 Mon Sep 17 00:00:00 2001 From: donassbr Date: Thu, 12 Jul 2007 13:55:39 +0000 Subject: [PATCH] Corrected mutex unlocking. Raise an exception if the timeout occurs on the timed functions. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3747 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/xbt/xbt_queue.c | 64 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/src/xbt/xbt_queue.c b/src/xbt/xbt_queue.c index 4e645af1a8..50a3d300bd 100644 --- a/src/xbt/xbt_queue.c +++ b/src/xbt/xbt_queue.c @@ -79,6 +79,7 @@ void xbt_queue_push(xbt_queue_t queue, const void *src) { } xbt_dynar_push(queue->data,src); xbt_cond_signal(queue->not_empty); + xbt_mutex_unlock(queue->mutex); } @@ -97,6 +98,7 @@ void xbt_queue_pop(xbt_queue_t queue, void* const dst) { } xbt_dynar_pop(queue->data,dst); xbt_cond_signal(queue->not_full); + xbt_mutex_unlock(queue->mutex); } /** @brief Unshift something to the message exchange queue. @@ -113,6 +115,7 @@ void xbt_queue_unshift(xbt_queue_t queue, const void *src) { } xbt_dynar_unshift(queue->data,src); xbt_cond_signal(queue->not_empty); + xbt_mutex_unlock(queue->mutex); } @@ -131,6 +134,7 @@ void xbt_queue_shift(xbt_queue_t queue, void* const dst) { } xbt_dynar_shift(queue->data,dst); xbt_cond_signal(queue->not_full); + xbt_mutex_unlock(queue->mutex); } @@ -142,12 +146,20 @@ void xbt_queue_shift(xbt_queue_t queue, void* const dst) { */ void xbt_queue_push_timed(xbt_queue_t queue, const void *src,double delay) { xbt_mutex_lock(queue->mutex); - while (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data)) { + if (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data)) { DEBUG2("Capacity of %p exceded (=%d). Waiting",queue,queue->capacity); xbt_cond_timedwait(queue->not_full,queue->mutex, delay); - } - xbt_dynar_push(queue->data,src); - xbt_cond_signal(queue->not_empty); + } + /* check if a timeout occurs */ + if (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data)) { + xbt_mutex_unlock(queue->mutex); + THROW0(timeout_error,0,"Timeout"); + } + else { + xbt_dynar_push(queue->data,src); + xbt_cond_signal(queue->not_empty); + xbt_mutex_unlock(queue->mutex); + } } @@ -158,12 +170,20 @@ void xbt_queue_push_timed(xbt_queue_t queue, const void *src,double delay) { */ void xbt_queue_pop_timed(xbt_queue_t queue, void* const dst,double delay) { xbt_mutex_lock(queue->mutex); - while (xbt_dynar_length(queue->data) == 0) { + if (xbt_dynar_length(queue->data) == 0) { DEBUG1("Queue %p empty. Waiting",queue); xbt_cond_timedwait(queue->not_empty,queue->mutex,delay); } - xbt_dynar_pop(queue->data,dst); - xbt_cond_signal(queue->not_full); + /* check if a timeout occurs */ + if (xbt_dynar_length(queue->data) == 0) { + xbt_mutex_unlock(queue->mutex); + THROW0(timeout_error,0,"Timeout"); + } + else { + xbt_dynar_pop(queue->data,dst); + xbt_cond_signal(queue->not_full); + xbt_mutex_unlock(queue->mutex); + } } /** @brief Unshift something to the message exchange queue, with a timeout. @@ -172,12 +192,22 @@ void xbt_queue_pop_timed(xbt_queue_t queue, void* const dst,double delay) { */ void xbt_queue_unshift_timed(xbt_queue_t queue, const void *src,double delay) { xbt_mutex_lock(queue->mutex); - while (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data)) { + if (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data)) { DEBUG2("Capacity of %p exceded (=%d). Waiting",queue,queue->capacity); xbt_cond_timedwait(queue->not_full,queue->mutex,delay); } - xbt_dynar_unshift(queue->data,src); - xbt_cond_signal(queue->not_empty); + /* check if a timeout occurs */ + + if (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data)) { + + xbt_mutex_unlock(queue->mutex); + THROW0(timeout_error,0,"Timeout"); + } + else { + xbt_dynar_unshift(queue->data,src); + xbt_cond_signal(queue->not_empty); + xbt_mutex_unlock(queue->mutex); + } } @@ -188,10 +218,18 @@ void xbt_queue_unshift_timed(xbt_queue_t queue, const void *src,double delay) { */ void xbt_queue_shift_timed(xbt_queue_t queue, void* const dst,double delay) { xbt_mutex_lock(queue->mutex); - while (xbt_dynar_length(queue->data) == 0) { + if (xbt_dynar_length(queue->data) == 0) { DEBUG1("Queue %p empty. Waiting",queue); xbt_cond_timedwait(queue->not_empty,queue->mutex,delay); } - xbt_dynar_shift(queue->data,dst); - xbt_cond_signal(queue->not_full); + /* check if a timeout occurs */ + if (xbt_dynar_length(queue->data) == 0) { + xbt_mutex_unlock(queue->mutex); + THROW0(timeout_error,0,"Timeout"); + } + else { + xbt_dynar_shift(queue->data,dst); + xbt_cond_signal(queue->not_full); + xbt_mutex_unlock(queue->mutex); + } } -- 2.20.1