rename configuration file
[profile/ivi/pulseaudio-panda.git] / 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 }