From a9696bff0990aae5d10afd990f38ff376a96e9e3 Mon Sep 17 00:00:00 2001 From: mquinson Date: Tue, 20 May 2008 09:01:08 +0000 Subject: [PATCH] Rewrite the timeout computation to reduce numerical instabilities issues git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@5442 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/xbt/xbt_queue.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/xbt/xbt_queue.c b/src/xbt/xbt_queue.c index d3bc436de0..e7358c8793 100644 --- a/src/xbt/xbt_queue.c +++ b/src/xbt/xbt_queue.c @@ -145,7 +145,7 @@ void xbt_queue_shift(xbt_queue_t queue, void* const dst) { * @see #xbt_queue_push */ void xbt_queue_push_timed(xbt_queue_t queue, const void *src,double delay) { - double timeout = xbt_time() + delay; + double begin = xbt_time(); xbt_ex_t e; xbt_mutex_acquire(queue->mutex); @@ -161,13 +161,13 @@ void xbt_queue_push_timed(xbt_queue_t queue, const void *src,double delay) { } else { while (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data) && - (delay<0 || xbt_time() < timeout) ) { + (delay<0 || (xbt_time() - begin) <= delay) ) { DEBUG2("Capacity of %p exceded (=%d). Waiting", queue,queue->capacity); TRY { xbt_cond_timedwait(queue->not_full,queue->mutex, - delay < 0 ? -1 : timeout - xbt_time()); + delay < 0 ? -1 : delay - (xbt_time()-begin)); } CATCH(e) { xbt_mutex_release(queue->mutex); RETHROW; @@ -187,7 +187,7 @@ 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) { - double timeout = xbt_time() + delay; + double begin = xbt_time(); xbt_ex_t e; xbt_mutex_acquire(queue->mutex); @@ -199,11 +199,11 @@ void xbt_queue_pop_timed(xbt_queue_t queue, void* const dst,double delay) { } } else { while ( (xbt_dynar_length(queue->data) == 0) && - (delay<0 || xbt_time() < timeout) ) { + (delay<0 || (xbt_time() - begin) <= delay) ) { DEBUG1("Queue %p empty. Waiting",queue); TRY { xbt_cond_timedwait(queue->not_empty,queue->mutex, - delay<0 ? -1 : timeout - xbt_time()); + delay<0 ? -1 : delay - (xbt_time()-begin)); } CATCH(e) { xbt_mutex_release(queue->mutex); RETHROW; @@ -221,7 +221,7 @@ void xbt_queue_pop_timed(xbt_queue_t queue, void* const dst,double delay) { * @see #xbt_queue_unshift */ void xbt_queue_unshift_timed(xbt_queue_t queue, const void *src,double delay) { - double timeout = xbt_time() + delay; + double begin = xbt_time(); xbt_ex_t e; xbt_mutex_acquire(queue->mutex); @@ -237,13 +237,13 @@ void xbt_queue_unshift_timed(xbt_queue_t queue, const void *src,double delay) { } else { while (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data) && - (delay<0 || xbt_time() < timeout) ) { + (delay<0 || (xbt_time() - begin) <= delay) ) { DEBUG2("Capacity of %p exceded (=%d). Waiting", queue,queue->capacity); TRY { xbt_cond_timedwait(queue->not_full,queue->mutex, - delay < 0 ? -1 : timeout - xbt_time()); + delay < 0 ? -1 : delay - (xbt_time()-begin)); } CATCH(e) { xbt_mutex_release(queue->mutex); RETHROW; @@ -263,7 +263,7 @@ 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) { - double timeout = xbt_time() + delay; + double begin = xbt_time(); xbt_ex_t e; xbt_mutex_acquire(queue->mutex); @@ -275,11 +275,11 @@ void xbt_queue_shift_timed(xbt_queue_t queue, void* const dst,double delay) { } } else { while ( (xbt_dynar_length(queue->data) == 0) && - (delay<0 || xbt_time() < timeout) ) { + (delay<0 || (xbt_time() - begin) <= delay) ) { DEBUG1("Queue %p empty. Waiting",queue); TRY { xbt_cond_timedwait(queue->not_empty,queue->mutex, - delay<0 ? -1 : timeout - xbt_time()); + delay<0 ? -1 : delay - (xbt_time()-begin)); } CATCH(e) { xbt_mutex_release(queue->mutex); RETHROW; -- 2.20.1