7 Queue *queue = malloc(sizeof(Queue));
9 queue->list = list_create(NULL);
10 pthread_cond_init(&queue->cv, NULL);
11 pthread_mutex_init(&queue->mtx, NULL);
15 void queue_delete(Queue *queue)
17 pthread_cond_destroy(&queue->cv);
18 pthread_mutex_destroy(&queue->mtx);
19 list_clear(&queue->list);
23 void queue_enqueue(Queue *queue, void *elem)
25 pthread_mutex_lock(&queue->mtx);
26 list_put(&queue->list, elem, NULL);
27 pthread_cond_signal(&queue->cv);
28 pthread_mutex_unlock(&queue->mtx);
31 void *dequeue(Queue *queue)
33 return queue_dequeue_callback(queue, NULL);
36 void *queue_dequeue_callback(Queue *queue, void (*callback)(void *elem))
40 while (! queue->cancel && ! elem) {
41 pthread_mutex_lock(&queue->mtx);
43 ListPair **lptr = &queue->list.first;
46 ListPair *next = (*lptr)->next;
53 pthread_cond_wait(&queue->cv, &queue->mtx);
56 pthread_mutex_unlock(&queue->mtx);
62 void queue_cancel(Queue *queue)
66 pthread_mutex_lock(&queue->mtx);
67 pthread_cond_broadcast(&queue->cv);
68 pthread_mutex_unlock(&queue->mtx);