]> code.delx.au - pulseaudio/blob - src/queue.c
main part of the native protocol
[pulseaudio] / 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 q->length--;
77
78 return p;
79 }
80
81 int queue_is_empty(struct queue *q) {
82 assert(q);
83 return q->length == 0;
84 }