1 /*
2 * queue.c, queue
3 *
4 * Copyright (c) 2009-2010 Wind River Systems, Inc.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 #include <stdlib.h>
20
21 #include <queue.h>
22
__queue_init(struct queue * queue)23 inline void __queue_init(struct queue *queue)
24 {
25 queue->head = NULL;
26 queue->tail = NULL;
27 queue->length = 0;
28 }
29
queue_alloc(void)30 struct queue *queue_alloc(void)
31 {
32 struct queue *queue;
33
34 queue = malloc(sizeof(struct queue));
35 if (queue)
36 __queue_init(queue);
37
38 return queue;
39 }
40
__queue_free(struct queue * queue)41 inline void __queue_free(struct queue *queue)
42 {
43 free(queue);
44 }
45
queue_free_all(struct queue * queue)46 void queue_free_all(struct queue *queue)
47 {
48 struct list *list = queue->head;
49
50 list_free_all(list);
51 __queue_init(queue);
52 }
53
__queue_push_head(struct queue * queue,struct list * entry)54 void __queue_push_head(struct queue *queue, struct list *entry)
55 {
56 queue->head = __list_add_head(queue->head, entry);
57 if (!queue->tail)
58 queue->tail = queue->head;
59
60 queue->length++;
61 }
62
queue_push_head(struct queue * queue,void * data)63 int queue_push_head(struct queue *queue, void *data)
64 {
65 struct list *entry = list_alloc(data);
66
67 if (!entry)
68 return -1;
69 else
70 queue->head = __list_add_head(queue->head, entry);
71
72 if (!queue->tail)
73 queue->tail = queue->head;
74
75 queue->length++;
76 return 0;
77 }
78
__queue_push_tail(struct queue * queue,struct list * entry)79 void __queue_push_tail(struct queue *queue, struct list *entry)
80 {
81 queue->tail = list_add_tail(queue->tail, entry);
82 if (queue->tail == NULL) {
83 return;
84 }
85 if (queue->tail->next)
86 queue->tail = queue->tail->next;
87 else
88 queue->head = queue->tail;
89
90 queue->length++;
91 }
92
queue_push_tail(struct queue * queue,void * data)93 int queue_push_tail(struct queue *queue, void *data)
94 {
95 struct list *entry = list_alloc(data);
96
97 if (!entry)
98 return -1;
99 else
100 queue->tail = __list_add_tail(queue->tail, entry);
101
102 if (queue->tail->next)
103 queue->tail = queue->tail->next;
104 else
105 queue->head = queue->tail;
106
107 queue->length++;
108 return 0;
109 }
110
__queue_pop_head(struct queue * queue)111 struct list *__queue_pop_head(struct queue *queue)
112 {
113 struct list *entry = queue->head;
114
115 if (entry) {
116 queue->head = __list_remove(queue->head, entry);
117 if (!queue->head)
118 queue->tail = NULL;
119
120 queue->length--;
121 }
122
123 return entry;
124 }
125
queue_pop_head(struct queue * queue)126 void *queue_pop_head(struct queue *queue)
127 {
128 struct list *entry;
129 void *data = NULL;
130
131 entry = __queue_pop_head(queue);
132 if (entry) {
133 data = entry->data;
134 __list_free(entry);
135 }
136
137 return data;
138 }
139
__queue_pop_tail(struct queue * queue)140 struct list *__queue_pop_tail(struct queue *queue)
141 {
142 struct list *entry = queue->tail;
143 struct list *prev;
144
145 if (entry) {
146 prev = entry->prev;
147 queue->head = __list_remove(queue->head, entry);
148 queue->tail = prev;
149 queue->length--;
150 }
151
152 return entry;
153 }
154
queue_pop_tail(struct queue * queue)155 void *queue_pop_tail(struct queue *queue)
156 {
157 struct list *entry;
158 void *data = NULL;
159
160 entry = __queue_pop_tail(queue);
161 if (entry) {
162 data = entry->data;
163 __list_free(entry);
164 }
165
166 return data;
167 }
168
__queue_peek_head(struct queue * queue)169 inline struct list *__queue_peek_head(struct queue *queue)
170 {
171 return queue->head;
172 }
173
__queue_peek_tail(struct queue * queue)174 inline struct list *__queue_peek_tail(struct queue *queue)
175 {
176 return queue->tail;
177 }
178
queue_peek_head(struct queue * queue)179 inline void *queue_peek_head(struct queue *queue)
180 {
181 struct list *entry;
182 void *data = NULL;
183
184 entry = __queue_peek_head(queue);
185 if (entry)
186 data = entry->data;
187
188 return data;
189 }
190
queue_peek_tail(struct queue * queue)191 inline void *queue_peek_tail(struct queue *queue)
192 {
193 struct list *entry;
194 void *data = NULL;
195
196 entry = __queue_peek_tail(queue);
197 if (entry)
198 data = entry->data;
199
200 return data;
201 }
202
queue_length(struct queue * queue)203 int queue_length(struct queue *queue)
204 {
205 return queue->length;
206 }
207