]> code.delx.au - pulseaudio/blob - polyp/queue.c
9befd4753ae4510b704d4f7ff36b0aa934e786ec
[pulseaudio] / polyp / queue.c
1 /* $Id$ */
2
3 /***
4 This file is part of polypaudio.
5
6 polypaudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published
8 by the Free Software Foundation; either version 2 of the License,
9 or (at your option) any later version.
10
11 polypaudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with polypaudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 USA.
20 ***/
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <assert.h>
27 #include <stdlib.h>
28
29 #include "queue.h"
30
31 struct queue_entry {
32 struct queue_entry *next;
33 void *data;
34 };
35
36 struct pa_queue {
37 struct queue_entry *front, *back;
38 unsigned length;
39 };
40
41 struct pa_queue* pa_queue_new(void) {
42 struct pa_queue *q = malloc(sizeof(struct pa_queue));
43 assert(q);
44 q->front = q->back = NULL;
45 q->length = 0;
46 return q;
47 }
48
49 void pa_queue_free(struct pa_queue* q, void (*destroy)(void *p, void *userdata), void *userdata) {
50 struct queue_entry *e;
51 assert(q);
52
53 e = q->front;
54 while (e) {
55 struct queue_entry *n = e->next;
56
57 if (destroy)
58 destroy(e->data, userdata);
59
60 free(e);
61 e = n;
62 }
63
64 free(q);
65 }
66
67 void pa_queue_push(struct pa_queue *q, void *p) {
68 struct queue_entry *e;
69
70 e = malloc(sizeof(struct queue_entry));
71
72 e->data = p;
73 e->next = NULL;
74
75 if (q->back)
76 q->back->next = e;
77 else {
78 assert(!q->front);
79 q->front = e;
80 }
81
82 q->back = e;
83 q->length++;
84 }
85
86 void* pa_queue_pop(struct pa_queue *q) {
87 void *p;
88 struct queue_entry *e;
89 assert(q);
90
91 if (!(e = q->front))
92 return NULL;
93
94 q->front = e->next;
95 if (q->back == e)
96 q->back = NULL;
97
98 p = e->data;
99 free(e);
100
101 q->length--;
102
103 return p;
104 }
105
106 int pa_queue_is_empty(struct pa_queue *q) {
107 assert(q);
108 return q->length == 0;
109 }