From 8878e826fa3e7b1231e652fc13d11c7a61629d13 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 20 Apr 2022 18:05:27 +0200 Subject: [PATCH] Add queue_ppd --- queue.c | 30 ++++++++++++++++++------------ queue.h | 10 ++++++++++ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/queue.c b/queue.c index 98613d7..c2e61e6 100644 --- a/queue.c +++ b/queue.c @@ -21,20 +21,26 @@ void queue_clr(Queue *queue, void *iter, void *arg, void *trans) list_clr(&queue->lst, iter, arg, trans); } -bool queue_enq(Queue *queue, void *dat) -{ - bool success = false; - - pthread_mutex_lock(&queue->mtx); - if (!queue->fin) { - success = true; - list_apd(&queue->lst, dat); - pthread_cond_signal(&queue->cnd); +#define ENQUEUE(queue_fun, list_fun) \ + bool queue_fun(Queue *queue, void *dat) \ + { \ + bool success = false; \ + \ + pthread_mutex_lock(&queue->mtx); \ + if (!queue->fin) { \ + success = true; \ + list_fun(&queue->lst, dat); \ + pthread_cond_signal(&queue->cnd); \ + } \ + pthread_mutex_unlock(&queue->mtx); \ + \ + return success; \ } - pthread_mutex_unlock(&queue->mtx); - return success; -} +ENQUEUE(queue_enq, list_apd) +ENQUEUE(queue_ppd, list_ppd) + +#undef ENQUEUE void *queue_deq(Queue *queue, void *trans) { diff --git a/queue.h b/queue.h index cb4ad42..d5eae57 100644 --- a/queue.h +++ b/queue.h @@ -57,6 +57,16 @@ bool queue_enq(Queue *queue, void *dat); Notifies waiting consumer threads. */ +bool queue_ppd(Queue *queue, void *dat); +/* + [Thread Safe] + Enqueues an element at the front of the queue. + Returns true if the enqueueing was successful (this is always the case if queue_fin + has not been called) + + Notifies waiting consumer threads. +*/ + void *queue_deq(Queue *queue, void *trans); /* [Thread Safe] -- 2.44.0