X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4a201b7ceece70d2bc461ac48c8b746a36d07243..f2ab03c68105029c71a20ae3363cfdfc950a5c90:/src/xbt/xbt_queue.c diff --git a/src/xbt/xbt_queue.c b/src/xbt/xbt_queue.c index b609da3b3b..68be624238 100644 --- a/src/xbt/xbt_queue.c +++ b/src/xbt/xbt_queue.c @@ -1,7 +1,8 @@ /* A (synchronized) message queue. */ /* Popping an empty queue is blocking, as well as pushing a full one */ -/* Copyright (c) 2007 Martin Quinson. All rights reserved. */ +/* Copyright (c) 2007-2014. The SimGrid Team. + * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -10,11 +11,11 @@ #include "xbt/sysdep.h" #include "xbt/log.h" #include "xbt/dynar.h" +#include "xbt/synchro_core.h" -#include "xbt/synchro.h" #include "xbt/queue.h" /* this module */ -#include "gras/virtu.h" -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_queue, xbt, "Message exchanging queue"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_queue, xbt, + "Message exchanging queue"); typedef struct s_xbt_queue_ { int capacity; @@ -31,7 +32,8 @@ typedef struct s_xbt_queue_ { xbt_queue_t xbt_queue_new(int capacity, unsigned long elm_size) { xbt_queue_t res = xbt_new0(s_xbt_queue_t, 1); - xbt_assert0(capacity >= 0, "Capacity cannot be negative"); + if (capacity<0) + capacity=0; res->capacity = capacity; res->data = xbt_dynar_new(elm_size, NULL); @@ -52,7 +54,7 @@ void xbt_queue_free(xbt_queue_t * queue) xbt_mutex_destroy((*queue)->mutex); xbt_cond_destroy((*queue)->not_full); xbt_cond_destroy((*queue)->not_empty); - free((*queue)); + free(*queue); *queue = NULL; } @@ -77,7 +79,8 @@ void xbt_queue_push(xbt_queue_t queue, const void *src) xbt_mutex_acquire(queue->mutex); while (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data)) { - DEBUG2("Capacity of %p exceded (=%d). Waiting", queue, queue->capacity); + XBT_DEBUG("Capacity of %p exceeded (=%d). Waiting", queue, + queue->capacity); xbt_cond_wait(queue->not_full, queue->mutex); } xbt_dynar_push(queue->data, src); @@ -96,8 +99,8 @@ void xbt_queue_push(xbt_queue_t queue, const void *src) void xbt_queue_pop(xbt_queue_t queue, void *const dst) { xbt_mutex_acquire(queue->mutex); - while (xbt_dynar_length(queue->data) == 0) { - DEBUG1("Queue %p empty. Waiting", queue); + while (xbt_dynar_is_empty(queue->data)) { + XBT_DEBUG("Queue %p empty. Waiting", queue); xbt_cond_wait(queue->not_empty, queue->mutex); } xbt_dynar_pop(queue->data, dst); @@ -116,7 +119,8 @@ void xbt_queue_unshift(xbt_queue_t queue, const void *src) xbt_mutex_acquire(queue->mutex); while (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data)) { - DEBUG2("Capacity of %p exceded (=%d). Waiting", queue, queue->capacity); + XBT_DEBUG("Capacity of %p exceeded (=%d). Waiting", queue, + queue->capacity); xbt_cond_wait(queue->not_full, queue->mutex); } xbt_dynar_unshift(queue->data, src); @@ -135,8 +139,8 @@ void xbt_queue_unshift(xbt_queue_t queue, const void *src) void xbt_queue_shift(xbt_queue_t queue, void *const dst) { xbt_mutex_acquire(queue->mutex); - while (xbt_dynar_length(queue->data) == 0) { - DEBUG1("Queue %p empty. Waiting", queue); + while (xbt_dynar_is_empty(queue->data)) { + XBT_DEBUG("Queue %p empty. Waiting", queue); xbt_cond_wait(queue->not_empty, queue->mutex); } xbt_dynar_shift(queue->data, dst); @@ -154,7 +158,6 @@ 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) { double begin = xbt_time(); - xbt_ex_t e; xbt_mutex_acquire(queue->mutex); @@ -163,20 +166,22 @@ void xbt_queue_push_timed(xbt_queue_t queue, const void *src, double delay) queue->capacity == xbt_dynar_length(queue->data)) { xbt_mutex_release(queue->mutex); - THROW2(timeout_error, 0, "Capacity of %p exceded (=%d), and delay = 0", - queue, queue->capacity); + THROWF(timeout_error, 0, + "Capacity of %p exceeded (=%d), and delay = 0", queue, + queue->capacity); } } else { while (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data) && (delay < 0 || (xbt_time() - begin) <= delay)) { - DEBUG2("Capacity of %p exceded (=%d). Waiting", queue, queue->capacity); + XBT_DEBUG("Capacity of %p exceeded (=%d). Waiting", queue, + queue->capacity); TRY { xbt_cond_timedwait(queue->not_full, queue->mutex, delay < 0 ? -1 : delay - (xbt_time() - begin)); } - CATCH(e) { + CATCH_ANONYMOUS { xbt_mutex_release(queue->mutex); RETHROW; } @@ -197,24 +202,23 @@ 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 begin = xbt_time(); - xbt_ex_t e; xbt_mutex_acquire(queue->mutex); if (delay == 0) { - if (xbt_dynar_length(queue->data) == 0) { + if (xbt_dynar_is_empty(queue->data)) { xbt_mutex_release(queue->mutex); - THROW0(timeout_error, 0, "Delay = 0, and queue is empty"); + THROWF(timeout_error, 0, "Delay = 0, and queue is empty"); } } else { - while ((xbt_dynar_length(queue->data) == 0) && + while ((xbt_dynar_is_empty(queue->data)) && (delay < 0 || (xbt_time() - begin) <= delay)) { - DEBUG1("Queue %p empty. Waiting", queue); + XBT_DEBUG("Queue %p empty. Waiting", queue); TRY { xbt_cond_timedwait(queue->not_empty, queue->mutex, delay < 0 ? -1 : delay - (xbt_time() - begin)); } - CATCH(e) { + CATCH_ANONYMOUS { xbt_mutex_release(queue->mutex); RETHROW; } @@ -230,10 +234,10 @@ 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) +void xbt_queue_unshift_timed(xbt_queue_t queue, const void *src, + double delay) { double begin = xbt_time(); - xbt_ex_t e; xbt_mutex_acquire(queue->mutex); @@ -242,20 +246,22 @@ void xbt_queue_unshift_timed(xbt_queue_t queue, const void *src, double delay) queue->capacity == xbt_dynar_length(queue->data)) { xbt_mutex_release(queue->mutex); - THROW2(timeout_error, 0, "Capacity of %p exceded (=%d), and delay = 0", - queue, queue->capacity); + THROWF(timeout_error, 0, + "Capacity of %p exceeded (=%d), and delay = 0", queue, + queue->capacity); } } else { while (queue->capacity != 0 && queue->capacity == xbt_dynar_length(queue->data) && (delay < 0 || (xbt_time() - begin) <= delay)) { - DEBUG2("Capacity of %p exceded (=%d). Waiting", queue, queue->capacity); + XBT_DEBUG("Capacity of %p exceeded (=%d). Waiting", queue, + queue->capacity); TRY { xbt_cond_timedwait(queue->not_full, queue->mutex, delay < 0 ? -1 : delay - (xbt_time() - begin)); } - CATCH(e) { + CATCH_ANONYMOUS { xbt_mutex_release(queue->mutex); RETHROW; } @@ -273,36 +279,36 @@ void xbt_queue_unshift_timed(xbt_queue_t queue, const void *src, double delay) * @see #xbt_queue_shift * */ -void xbt_queue_shift_timed(xbt_queue_t queue, void *const dst, double delay) +void xbt_queue_shift_timed(xbt_queue_t queue, void *const dst, + double delay) { double begin = xbt_time(); - xbt_ex_t e; xbt_mutex_acquire(queue->mutex); if (delay == 0) { - if (xbt_dynar_length(queue->data) == 0) { + if (xbt_dynar_is_empty(queue->data)) { xbt_mutex_release(queue->mutex); - THROW0(timeout_error, 0, "Delay = 0, and queue is empty"); + THROWF(timeout_error, 0, "Delay = 0, and queue is empty"); } } else { - while ((xbt_dynar_length(queue->data) == 0) && + while ((xbt_dynar_is_empty(queue->data)) && (delay < 0 || (xbt_time() - begin) <= delay)) { - DEBUG1("Queue %p empty. Waiting", queue); + XBT_DEBUG("Queue %p empty. Waiting", queue); TRY { xbt_cond_timedwait(queue->not_empty, queue->mutex, delay < 0 ? -1 : delay - (xbt_time() - begin)); } - CATCH(e) { + CATCH_ANONYMOUS { xbt_mutex_release(queue->mutex); RETHROW; } } } - if (xbt_dynar_length(queue->data) == 0) { + if (xbt_dynar_is_empty(queue->data)) { xbt_mutex_release(queue->mutex); - THROW1(timeout_error, 0, "Timeout (%f) elapsed, but queue still empty", + THROWF(timeout_error, 0, "Timeout (%f) elapsed, but queue still empty", delay); }