1 #include <sched.h> // for sched_yield
2 #include "bits/callback.h" // for Transformer
5 void queue_ini(Queue *queue)
8 queue->cnl = queue->fin = 0;
9 pthread_cond_init(&queue->cnd, NULL);
10 pthread_mutex_init(&queue->mtx, NULL);
13 void queue_dst(Queue *queue)
15 pthread_cond_destroy(&queue->cnd);
16 pthread_mutex_destroy(&queue->mtx);
19 void queue_clr(Queue *queue, void *iter, void *arg, void *trans)
21 list_clr(&queue->lst, iter, arg, trans);
24 bool queue_enq(Queue *queue, void *dat)
28 pthread_mutex_lock(&queue->mtx);
31 list_apd(&queue->lst, dat);
32 pthread_cond_signal(&queue->cnd);
34 pthread_mutex_unlock(&queue->mtx);
39 void *queue_deq(Queue *queue, void *trans)
43 pthread_mutex_lock(&queue->mtx);
44 while (!queue->cnl && !dat) {
45 ListNode **node = &queue->lst.fst;
48 list_nrm(&queue->lst, node);
51 dat = ((Transformer) trans)(dat);
53 pthread_cond_wait(&queue->cnd, &queue->mtx);
56 pthread_mutex_unlock(&queue->mtx);
61 void queue_cnl(Queue *queue)
63 pthread_mutex_lock(&queue->mtx);
65 pthread_cond_broadcast(&queue->cnd);
66 pthread_mutex_unlock(&queue->mtx);
69 void queue_fin(Queue *queue)
71 pthread_mutex_lock(&queue->mtx);
73 pthread_mutex_unlock(&queue->mtx);
76 pthread_mutex_lock(&queue->mtx);
77 ListNode *node = queue->lst.fst;
78 pthread_mutex_unlock(&queue->mtx);