90823ae6fb7a14b513a7d84d0f6f449e166c9f43
[platform/upstream/pulseaudio.git] / src / queue.c
1 #include <assert.h>
2 #include <stdlib.h>
3
4 #include "queue.h"
5
6 struct queue_entry {
7     struct queue_entry *next;
8     void *data;
9 };
10
11 struct queue {
12     struct queue_entry *front, *back;
13     unsigned length;
14 };
15
16 struct queue* queue_new(void) {
17     struct queue *q = malloc(sizeof(struct queue));
18     assert(q);
19     q->front = q->back = NULL;
20     q->length = 0;
21     return q;
22 }
23
24 void queue_free(struct queue* q, void (*destroy)(void *p, void *userdata), void *userdata) {
25     struct queue_entry *e;
26     assert(q);
27
28     e = q->front;
29     while (e) {
30         struct queue_entry *n = e->next;
31
32         if (destroy)
33             destroy(e->data, userdata);
34
35         free(e);
36         e = n;
37     }
38
39     free(q);
40 }
41
42 void queue_push(struct queue *q, void *p) {
43     struct queue_entry *e;
44
45     e = malloc(sizeof(struct queue_entry));
46
47     e->data = p;
48     e->next = NULL;
49
50     if (q->back)
51         q->back->next = e;
52     else {
53         assert(!q->front);
54         q->front = e;
55     }
56
57     q->back = e;
58     q->length++;
59 }
60
61 void* queue_pop(struct queue *q) {
62     void *p;
63     struct queue_entry *e;
64     assert(q);
65
66     if (!(e = q->front))
67         return NULL;
68
69     q->front = e->next;
70     if (q->back == e)
71         q->back = NULL;
72
73     p = e->data;
74     free(e);
75
76     return p;
77 }