]> git.lizzy.rs Git - dragonstd.git/blob - queue.c
Cleanup number code
[dragonstd.git] / queue.c
1 #include <stdlib.h>
2 #include "queue.h"
3
4 Queue *queue_create()
5 {
6         Queue *queue = malloc(sizeof(Queue));
7         queue->list = list_create(NULL);
8         pthread_mutex_init(&queue->mtx, NULL);
9         return queue;
10 }
11
12 void queue_delete(Queue *queue)
13 {
14         pthread_mutex_destroy(&queue->mtx);
15         list_clear(&queue->list);
16         free(queue);
17 }
18
19 void queue_enqueue(Queue *queue, void *elem)
20 {
21         pthread_mutex_lock(&queue->mtx);
22         list_put(&queue->list, elem, NULL);
23         pthread_mutex_unlock(&queue->mtx);
24 }
25
26 void *dequeue(Queue *queue)
27 {
28         return queue_dequeue_callback(queue, NULL);
29 }
30
31 void *queue_dequeue_callback(Queue *queue, void (*callback)(void *elem))
32 {
33         pthread_mutex_lock(&queue->mtx);
34         void *elem = NULL;
35         ListPair **lptr = &queue->list.first;
36         if (*lptr) {
37                 elem = (*lptr)->key;
38                 ListPair *next = (*lptr)->next;
39                 free(*lptr);
40                 *lptr = next;
41
42                 if (callback)
43                         callback(elem);
44         }
45         pthread_mutex_unlock(&queue->mtx);
46         return elem;
47 }