]> code.delx.au - pulseaudio/blob - src/polypcore/queue.c
01f957d9b9168a6e27956c41ba5d393d2808396c
[pulseaudio] / src / polypcore / 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 Lesser General Public License as
8 published by the Free Software Foundation; either version 2.1 of the
9 License, 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 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License 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 <polyp/xmalloc.h>
30
31 #include "queue.h"
32
33 struct queue_entry {
34 struct queue_entry *next;
35 void *data;
36 };
37
38 struct pa_queue {
39 struct queue_entry *front, *back;
40 unsigned length;
41 };
42
43 pa_queue* pa_queue_new(void) {
44 pa_queue *q = pa_xnew(pa_queue, 1);
45 q->front = q->back = NULL;
46 q->length = 0;
47 return q;
48 }
49
50 void pa_queue_free(pa_queue* q, void (*destroy)(void *p, void *userdata), void *userdata) {
51 struct queue_entry *e;
52 assert(q);
53
54 e = q->front;
55 while (e) {
56 struct queue_entry *n = e->next;
57
58 if (destroy)
59 destroy(e->data, userdata);
60
61 pa_xfree(e);
62 e = n;
63 }
64
65 pa_xfree(q);
66 }
67
68 void pa_queue_push(pa_queue *q, void *p) {
69 struct queue_entry *e;
70
71 e = pa_xnew(struct queue_entry, 1);
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(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 pa_xfree(e);
100
101 q->length--;
102
103 return p;
104 }
105
106 int pa_queue_is_empty(pa_queue *q) {
107 assert(q);
108 return q->length == 0;
109 }