4 void queue_ini(Queue *queue)
7 queue->cnl = queue->fin = 0;
8 pthread_cond_init(&queue->cnd, NULL);
9 pthread_mutex_init(&queue->mtx, NULL);
12 void queue_dst(Queue *queue)
14 pthread_cond_destroy(&queue->cnd);
15 pthread_mutex_destroy(&queue->mtx);
18 void queue_clr(Queue *queue, Iterator iter, void *arg, Transformer trans)
20 list_clr(&queue->lst, iter, arg, trans);
23 bool queue_enq(Queue *queue, void *dat)
27 pthread_mutex_lock(&queue->mtx);
30 list_apd(&queue->lst, dat);
31 pthread_cond_signal(&queue->cnd);
33 pthread_mutex_unlock(&queue->mtx);
38 void *queue_deq(Queue *queue, Transformer trans)
42 pthread_mutex_lock(&queue->mtx);
43 while (! queue->cnl && ! dat) {
44 ListNode **node = &queue->lst.fst;
47 list_nrm(&queue->lst, node);
52 pthread_cond_wait(&queue->cnd, &queue->mtx);
55 pthread_mutex_unlock(&queue->mtx);
60 void queue_cnl(Queue *queue)
62 pthread_mutex_lock(&queue->mtx);
64 pthread_cond_broadcast(&queue->cnd);
65 pthread_mutex_unlock(&queue->mtx);
68 void queue_fin(Queue *queue)
70 pthread_mutex_lock(&queue->mtx);
72 pthread_mutex_unlock(&queue->mtx);
75 pthread_mutex_lock(&queue->mtx);
76 ListNode *node = queue->lst.fst;
77 pthread_mutex_unlock(&queue->mtx);