7 Queue *queue = malloc(sizeof(Queue));
10 queue->list = list_create(NULL);
11 pthread_cond_init(&queue->cv, NULL);
12 pthread_mutex_init(&queue->mtx, NULL);
16 void queue_delete(Queue *queue)
18 pthread_cond_destroy(&queue->cv);
19 pthread_mutex_destroy(&queue->mtx);
20 list_clear(&queue->list);
24 void queue_enqueue(Queue *queue, void *elem)
26 pthread_mutex_lock(&queue->mtx);
27 if (! queue->finish) {
28 list_put(&queue->list, elem, NULL);
29 pthread_cond_signal(&queue->cv);
31 pthread_mutex_unlock(&queue->mtx);
34 void *queue_dequeue(Queue *queue)
36 return queue_dequeue_callback(queue, NULL);
39 void *queue_dequeue_callback(Queue *queue, void (*callback)(void *elem))
43 while (! queue->cancel && ! elem) {
44 pthread_mutex_lock(&queue->mtx);
46 ListPair **lptr = &queue->list.first;
49 ListPair *next = (*lptr)->next;
56 pthread_cond_wait(&queue->cv, &queue->mtx);
59 pthread_mutex_unlock(&queue->mtx);
65 void queue_cancel(Queue *queue)
69 pthread_mutex_lock(&queue->mtx);
70 pthread_cond_broadcast(&queue->cv);
71 pthread_mutex_unlock(&queue->mtx);
74 void queue_finish(Queue *queue)
76 pthread_mutex_lock(&queue->mtx);
78 pthread_mutex_unlock(&queue->mtx);
81 pthread_mutex_lock(&queue->mtx);
82 ListPair *first = queue->list.first;
83 pthread_mutex_unlock(&queue->mtx);