]> git.lizzy.rs Git - dragonstd.git/commitdiff
Add queue_ppd
authorElias Fleckenstein <eliasfleckenstein@web.de>
Wed, 20 Apr 2022 16:05:27 +0000 (18:05 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Wed, 20 Apr 2022 16:05:27 +0000 (18:05 +0200)
queue.c
queue.h

diff --git a/queue.c b/queue.c
index 98613d74da08742d63fa3c29eedb1fd29a2241fb..c2e61e6b4b618bc27fde60c50ed60352c885cdbb 100644 (file)
--- 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 cb4ad42964a45052b73a3bf99d86c54600a7a5df..d5eae5717fc3ec94189c1d4590ff990f52e0a72e 100644 (file)
--- 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]