1eef4f27bSRobert Mustacchi /*
2eef4f27bSRobert Mustacchi  * Copyright 2014-2017 Cavium, Inc.
3eef4f27bSRobert Mustacchi  * The contents of this file are subject to the terms of the Common Development
4eef4f27bSRobert Mustacchi  * and Distribution License, v.1,  (the "License").
5eef4f27bSRobert Mustacchi  *
6eef4f27bSRobert Mustacchi  * You may not use this file except in compliance with the License.
7eef4f27bSRobert Mustacchi  *
8eef4f27bSRobert Mustacchi  * You can obtain a copy of the License at available
9eef4f27bSRobert Mustacchi  * at http://opensource.org/licenses/CDDL-1.0
10eef4f27bSRobert Mustacchi  *
11eef4f27bSRobert Mustacchi  * See the License for the specific language governing permissions and
12eef4f27bSRobert Mustacchi  * limitations under the License.
13eef4f27bSRobert Mustacchi  */
14eef4f27bSRobert Mustacchi 
15eef4f27bSRobert Mustacchi /*******************************************************************************
16eef4f27bSRobert Mustacchi  *
17eef4f27bSRobert Mustacchi  * Single link list routines:
18eef4f27bSRobert Mustacchi  *    void              s_list_init        (s_list_t *,  *head, *tail, cnt)
19eef4f27bSRobert Mustacchi  *    void              s_list_clear       (s_list_t *)
20eef4f27bSRobert Mustacchi  *    void              s_list_push_head   (s_list_t *,  s_list_entry_t *)
21eef4f27bSRobert Mustacchi  *    s_list_entry_t *  s_list_pop_head    (s_list_t *)
22eef4f27bSRobert Mustacchi  *    void              s_list_push_tail   (s_list_t *,  s_list_entry_t *)
23eef4f27bSRobert Mustacchi  *    s_list_entry_t *  s_list_peek_head   (s_list_t *)
24eef4f27bSRobert Mustacchi  *    s_list_entry_t *  s_list_peek_tail   (s_list_t *)
25eef4f27bSRobert Mustacchi  *    s_list_entry_t *  s_list_next_entry  (s_list_entry_t *)
26eef4f27bSRobert Mustacchi  *    unsigned long     s_list_entry_cnt   (s_list_t *)
27eef4f27bSRobert Mustacchi  *    char              s_list_is_empty    (s_list_t *)
28eef4f27bSRobert Mustacchi  *    void              s_list_add_head    (s_list_t *,  s_list_t *)
29eef4f27bSRobert Mustacchi  *    void              s_list_add_tail    (s_list_t *,  s_list_t *)
30eef4f27bSRobert Mustacchi  *    void              s_list_split       (d_list_t *,  d_list_t *, d_list_entry_t *, ulong)
31eef4f27bSRobert Mustacchi  *
32eef4f27bSRobert Mustacchi  * Double link list routines:
33eef4f27bSRobert Mustacchi  *    void              d_list_init        (d_list_t *,  *head, *tail, cnt)
34eef4f27bSRobert Mustacchi  *    void              d_list_clear       (d_list_t *)
35eef4f27bSRobert Mustacchi  *    void              d_list_push_head   (d_list_t *,  d_list_entry_t *)
36eef4f27bSRobert Mustacchi  *    d_list_entry_t *  d_list_pop_head    (d_list_t *)
37eef4f27bSRobert Mustacchi  *    void              d_list_push_tail   (d_list_t *,  d_list_entry_t *)
38eef4f27bSRobert Mustacchi  *    d_list_entry_t *  d_list_pop_tail    (d_list_t *)
39eef4f27bSRobert Mustacchi  *    d_list_entry_t *  d_list_peek_head   (d_list_t *)
40eef4f27bSRobert Mustacchi  *    d_list_entry_t *  d_list_peek_tail   (d_list_t *)
41eef4f27bSRobert Mustacchi  *    d_list_entry_t *  d_list_next_entry  (d_list_entry_t *)
42eef4f27bSRobert Mustacchi  *    void              d_list_remove_entry(d_list_t *,  d_list_entry_t *)
43eef4f27bSRobert Mustacchi  *    void              d_list_insert_entry(d_list_t *,  *prev, *next, *new)
44eef4f27bSRobert Mustacchi  *    d_list_entry_t *  d_list_prev_entry  (d_list_entry_t *)
45eef4f27bSRobert Mustacchi  *    unsigned long     d_list_entry_cnt   (d_list_t *)
46eef4f27bSRobert Mustacchi  *    char              d_list_is_empty    (d_list_t *)
47eef4f27bSRobert Mustacchi  *    void              d_list_add_head    (d_list_t *,  d_list_t *)
48eef4f27bSRobert Mustacchi  *    void              d_list_add_tail    (d_list_t *,  d_list_t *)
49eef4f27bSRobert Mustacchi  *
50eef4f27bSRobert Mustacchi  * Array list routines:
51eef4f27bSRobert Mustacchi  *    void              q_list_init        (q_list_t *,  q_list_entry *, ulong)
52eef4f27bSRobert Mustacchi  *    void              q_list_clear       (q_list_t *)
53eef4f27bSRobert Mustacchi  *    void              q_list_push_head   (q_list_t *,  q_list_entry_t)
54eef4f27bSRobert Mustacchi  *    q_list_entry_t    q_list_pop_head    (q_list_t *)
55eef4f27bSRobert Mustacchi  *    void              q_list_push_tail   (q_list_t *,  q_list_entry_t)
56eef4f27bSRobert Mustacchi  *    q_list_entry_t    q_list_pop_tail    (q_list_t *)
57eef4f27bSRobert Mustacchi  *    q_list_entry_t    q_list_peek_head   (q_list_t *)
58eef4f27bSRobert Mustacchi  *    q_list_entry_t    q_list_peek_tail   (q_list_t *)
59eef4f27bSRobert Mustacchi  *    unsigned long     q_list_entry_cnt   (q_list_t *)
60eef4f27bSRobert Mustacchi  *    char              q_list_is_empty    (q_list_t *)
61eef4f27bSRobert Mustacchi  *    char              q_list_is_full     (q_list_t *)
62eef4f27bSRobert Mustacchi  *
63eef4f27bSRobert Mustacchi  * History:
64eef4f27bSRobert Mustacchi  *    03/30/98 Hav Khauv                Initial version.
65eef4f27bSRobert Mustacchi  ******************************************************************************/
66eef4f27bSRobert Mustacchi 
67eef4f27bSRobert Mustacchi #ifndef _listq_h_
68eef4f27bSRobert Mustacchi #define _listq_h_
69eef4f27bSRobert Mustacchi 
70eef4f27bSRobert Mustacchi 
71eef4f27bSRobert Mustacchi 
72eef4f27bSRobert Mustacchi /*******************************************************************************
73eef4f27bSRobert Mustacchi  * Single link list.
74eef4f27bSRobert Mustacchi  ******************************************************************************/
75eef4f27bSRobert Mustacchi 
76eef4f27bSRobert Mustacchi typedef struct _s_list_entry_t
77eef4f27bSRobert Mustacchi {
78eef4f27bSRobert Mustacchi     struct _s_list_entry_t *next;
79eef4f27bSRobert Mustacchi } s_list_entry_t;
80eef4f27bSRobert Mustacchi 
81eef4f27bSRobert Mustacchi #define S_LINK_CAST(_p)                 ((s_list_entry_t *) (_p))
82eef4f27bSRobert Mustacchi 
83eef4f27bSRobert Mustacchi 
84eef4f27bSRobert Mustacchi typedef struct _s_list_t
85eef4f27bSRobert Mustacchi {
86eef4f27bSRobert Mustacchi     s_list_entry_t *head;
87eef4f27bSRobert Mustacchi     s_list_entry_t *tail;
88eef4f27bSRobert Mustacchi     unsigned long cnt;
89eef4f27bSRobert Mustacchi } s_list_t;
90eef4f27bSRobert Mustacchi 
91eef4f27bSRobert Mustacchi 
92eef4f27bSRobert Mustacchi 
93eef4f27bSRobert Mustacchi #ifdef _INLINE_LISTQ_CALLS
94eef4f27bSRobert Mustacchi 
95eef4f27bSRobert Mustacchi 
96eef4f27bSRobert Mustacchi __inline
97*55fea89dSDan Cross void
s_list_init(s_list_t * s_list,s_list_entry_t * head_entry,s_list_entry_t * tail_entry,unsigned long entry_cnt)98eef4f27bSRobert Mustacchi s_list_init(
99eef4f27bSRobert Mustacchi     s_list_t *s_list,
100eef4f27bSRobert Mustacchi     s_list_entry_t *head_entry,
101eef4f27bSRobert Mustacchi     s_list_entry_t *tail_entry,
102eef4f27bSRobert Mustacchi     unsigned long entry_cnt)
103eef4f27bSRobert Mustacchi {
104eef4f27bSRobert Mustacchi     s_list->head = head_entry;
105eef4f27bSRobert Mustacchi     s_list->tail = tail_entry;
106eef4f27bSRobert Mustacchi     s_list->cnt = entry_cnt;
107eef4f27bSRobert Mustacchi }
108eef4f27bSRobert Mustacchi 
109eef4f27bSRobert Mustacchi 
110eef4f27bSRobert Mustacchi __inline
111*55fea89dSDan Cross void
s_list_clear(s_list_t * s_list)112eef4f27bSRobert Mustacchi s_list_clear(
113eef4f27bSRobert Mustacchi     s_list_t *s_list)
114eef4f27bSRobert Mustacchi {
115eef4f27bSRobert Mustacchi     s_list->head = (s_list_entry_t *) 0;
116eef4f27bSRobert Mustacchi     s_list->tail = (s_list_entry_t *) 0;
117eef4f27bSRobert Mustacchi     s_list->cnt = 0;
118eef4f27bSRobert Mustacchi }
119eef4f27bSRobert Mustacchi 
120eef4f27bSRobert Mustacchi 
121eef4f27bSRobert Mustacchi __inline
122eef4f27bSRobert Mustacchi void
s_list_push_head(s_list_t * s_list,s_list_entry_t * s_entry)123eef4f27bSRobert Mustacchi s_list_push_head(
124eef4f27bSRobert Mustacchi     s_list_t *s_list,
125eef4f27bSRobert Mustacchi     s_list_entry_t *s_entry)
126eef4f27bSRobert Mustacchi {
127eef4f27bSRobert Mustacchi     s_entry->next = s_list->head;
128eef4f27bSRobert Mustacchi 
129eef4f27bSRobert Mustacchi     if(s_list->tail == (s_list_entry_t *) 0)
130eef4f27bSRobert Mustacchi     {
131eef4f27bSRobert Mustacchi         s_list->tail = s_entry;
132eef4f27bSRobert Mustacchi     }
133eef4f27bSRobert Mustacchi     s_list->head = s_entry;
134eef4f27bSRobert Mustacchi 
135eef4f27bSRobert Mustacchi     s_list->cnt++;
136eef4f27bSRobert Mustacchi }
137eef4f27bSRobert Mustacchi 
138eef4f27bSRobert Mustacchi 
139eef4f27bSRobert Mustacchi __inline
140eef4f27bSRobert Mustacchi s_list_entry_t *
s_list_pop_head(s_list_t * s_list)141eef4f27bSRobert Mustacchi s_list_pop_head(
142eef4f27bSRobert Mustacchi     s_list_t *s_list)
143eef4f27bSRobert Mustacchi {
144eef4f27bSRobert Mustacchi     s_list_entry_t *s_entry;
145eef4f27bSRobert Mustacchi 
146eef4f27bSRobert Mustacchi     s_entry = s_list->head;
147eef4f27bSRobert Mustacchi     if(s_list->head)
148eef4f27bSRobert Mustacchi     {
149eef4f27bSRobert Mustacchi         s_list->head = s_list->head->next;
150eef4f27bSRobert Mustacchi         if(s_list->head == (s_list_entry_t *) 0)
151eef4f27bSRobert Mustacchi         {
152eef4f27bSRobert Mustacchi             s_list->tail = (s_list_entry_t *) 0;
153eef4f27bSRobert Mustacchi         }
154eef4f27bSRobert Mustacchi 
155eef4f27bSRobert Mustacchi         s_list->cnt--;
156eef4f27bSRobert Mustacchi     }
157eef4f27bSRobert Mustacchi 
158eef4f27bSRobert Mustacchi     return s_entry;
159eef4f27bSRobert Mustacchi }
160eef4f27bSRobert Mustacchi 
161eef4f27bSRobert Mustacchi 
162eef4f27bSRobert Mustacchi __inline
163eef4f27bSRobert Mustacchi void
s_list_push_tail(s_list_t * s_list,s_list_entry_t * s_entry)164eef4f27bSRobert Mustacchi s_list_push_tail(
165eef4f27bSRobert Mustacchi     s_list_t *s_list,
166eef4f27bSRobert Mustacchi     s_list_entry_t *s_entry)
167eef4f27bSRobert Mustacchi {
168eef4f27bSRobert Mustacchi     s_entry->next = (s_list_entry_t *) 0;
169eef4f27bSRobert Mustacchi 
170eef4f27bSRobert Mustacchi     if(s_list->tail)
171eef4f27bSRobert Mustacchi     {
172eef4f27bSRobert Mustacchi         s_list->tail->next = s_entry;
173eef4f27bSRobert Mustacchi     }
174eef4f27bSRobert Mustacchi     else
175eef4f27bSRobert Mustacchi     {
176eef4f27bSRobert Mustacchi         s_list->head = s_entry;
177eef4f27bSRobert Mustacchi     }
178eef4f27bSRobert Mustacchi     s_list->tail = s_entry;
179eef4f27bSRobert Mustacchi 
180eef4f27bSRobert Mustacchi     s_list->cnt++;
181eef4f27bSRobert Mustacchi }
182eef4f27bSRobert Mustacchi 
183eef4f27bSRobert Mustacchi 
184eef4f27bSRobert Mustacchi __inline
185eef4f27bSRobert Mustacchi s_list_entry_t *
s_list_peek_head(s_list_t * s_list)186eef4f27bSRobert Mustacchi s_list_peek_head(
187eef4f27bSRobert Mustacchi     s_list_t *s_list)
188eef4f27bSRobert Mustacchi {
189eef4f27bSRobert Mustacchi     return s_list->head;
190eef4f27bSRobert Mustacchi }
191eef4f27bSRobert Mustacchi 
192eef4f27bSRobert Mustacchi 
193eef4f27bSRobert Mustacchi __inline
194eef4f27bSRobert Mustacchi s_list_entry_t *
s_list_peek_tail(s_list_t * s_list)195eef4f27bSRobert Mustacchi s_list_peek_tail(
196eef4f27bSRobert Mustacchi     s_list_t *s_list)
197eef4f27bSRobert Mustacchi {
198eef4f27bSRobert Mustacchi     return s_list->tail;
199eef4f27bSRobert Mustacchi }
200eef4f27bSRobert Mustacchi 
201eef4f27bSRobert Mustacchi 
202eef4f27bSRobert Mustacchi __inline
203eef4f27bSRobert Mustacchi s_list_entry_t *
s_list_next_entry(s_list_entry_t * s_entry)204eef4f27bSRobert Mustacchi s_list_next_entry(
205eef4f27bSRobert Mustacchi     s_list_entry_t *s_entry)
206eef4f27bSRobert Mustacchi {
207eef4f27bSRobert Mustacchi     return s_entry->next;
208eef4f27bSRobert Mustacchi }
209eef4f27bSRobert Mustacchi 
210eef4f27bSRobert Mustacchi 
211eef4f27bSRobert Mustacchi __inline
212eef4f27bSRobert Mustacchi unsigned long
s_list_entry_cnt(s_list_t * s_list)213eef4f27bSRobert Mustacchi s_list_entry_cnt(
214eef4f27bSRobert Mustacchi     s_list_t *s_list)
215eef4f27bSRobert Mustacchi {
216eef4f27bSRobert Mustacchi     return s_list->cnt;
217eef4f27bSRobert Mustacchi }
218eef4f27bSRobert Mustacchi 
219eef4f27bSRobert Mustacchi 
220eef4f27bSRobert Mustacchi __inline
221eef4f27bSRobert Mustacchi char
s_list_is_empty(s_list_t * s_list)222eef4f27bSRobert Mustacchi s_list_is_empty(
223eef4f27bSRobert Mustacchi     s_list_t *s_list)
224eef4f27bSRobert Mustacchi {
225eef4f27bSRobert Mustacchi     return s_list->cnt == 0;
226eef4f27bSRobert Mustacchi }
227eef4f27bSRobert Mustacchi 
228eef4f27bSRobert Mustacchi 
229eef4f27bSRobert Mustacchi __inline
230eef4f27bSRobert Mustacchi void
s_list_add_head(s_list_t * s_list,s_list_t * s_list_head)231eef4f27bSRobert Mustacchi s_list_add_head(
232eef4f27bSRobert Mustacchi     s_list_t *s_list,
233eef4f27bSRobert Mustacchi     s_list_t *s_list_head)
234eef4f27bSRobert Mustacchi {
235eef4f27bSRobert Mustacchi     if(s_list->cnt == 0)
236eef4f27bSRobert Mustacchi     {
237eef4f27bSRobert Mustacchi         *s_list = *s_list_head;
238eef4f27bSRobert Mustacchi     }
239eef4f27bSRobert Mustacchi     else if(s_list_head->cnt)
240eef4f27bSRobert Mustacchi     {
241eef4f27bSRobert Mustacchi         s_list_head->tail->next = s_list->head;
242eef4f27bSRobert Mustacchi         s_list->head = s_list_head->head;
243eef4f27bSRobert Mustacchi         s_list->cnt += s_list_head->cnt;
244eef4f27bSRobert Mustacchi     }
245eef4f27bSRobert Mustacchi }
246eef4f27bSRobert Mustacchi 
247eef4f27bSRobert Mustacchi 
248eef4f27bSRobert Mustacchi __inline
249eef4f27bSRobert Mustacchi void
s_list_add_tail(s_list_t * s_list,s_list_t * s_list_tail)250eef4f27bSRobert Mustacchi s_list_add_tail(
251eef4f27bSRobert Mustacchi     s_list_t *s_list,
252eef4f27bSRobert Mustacchi     s_list_t *s_list_tail)
253eef4f27bSRobert Mustacchi {
254eef4f27bSRobert Mustacchi     if(s_list->cnt == 0)
255eef4f27bSRobert Mustacchi     {
256eef4f27bSRobert Mustacchi         *s_list = *s_list_tail;
257eef4f27bSRobert Mustacchi     }
258eef4f27bSRobert Mustacchi     else if(s_list_tail->cnt)
259eef4f27bSRobert Mustacchi     {
260eef4f27bSRobert Mustacchi         s_list->tail->next = s_list_tail->head;
261eef4f27bSRobert Mustacchi         s_list->tail = s_list_tail->tail;
262eef4f27bSRobert Mustacchi         s_list->cnt += s_list_tail->cnt;
263eef4f27bSRobert Mustacchi     }
264eef4f27bSRobert Mustacchi }
265eef4f27bSRobert Mustacchi 
266eef4f27bSRobert Mustacchi __inline
267eef4f27bSRobert Mustacchi void
s_list_split(s_list_t * s_list,s_list_t * s_list_head,s_list_entry_t * split_entry,unsigned long entry_cnt)268eef4f27bSRobert Mustacchi s_list_split(
269*55fea89dSDan Cross     s_list_t * s_list,
270*55fea89dSDan Cross     s_list_t * s_list_head,
271*55fea89dSDan Cross     s_list_entry_t * split_entry,
272eef4f27bSRobert Mustacchi     unsigned long entry_cnt)
273eef4f27bSRobert Mustacchi {
274eef4f27bSRobert Mustacchi     if (split_entry->next == NULL) {
275eef4f27bSRobert Mustacchi         s_list_head->head = s_list->head;
276eef4f27bSRobert Mustacchi         s_list_head->tail = split_entry;
277eef4f27bSRobert Mustacchi         s_list_head->cnt = entry_cnt;
278eef4f27bSRobert Mustacchi 
279eef4f27bSRobert Mustacchi         s_list->head = NULL;
280eef4f27bSRobert Mustacchi         s_list->tail = NULL;
281eef4f27bSRobert Mustacchi         s_list->cnt = 0;
282eef4f27bSRobert Mustacchi     } else {
283eef4f27bSRobert Mustacchi         s_list_head->head = s_list->head;
284eef4f27bSRobert Mustacchi         s_list_head->tail = split_entry;
285eef4f27bSRobert Mustacchi         s_list_head->cnt = entry_cnt;
286eef4f27bSRobert Mustacchi 
287eef4f27bSRobert Mustacchi         s_list->head = split_entry->next;
288eef4f27bSRobert Mustacchi         s_list->cnt = s_list->cnt - entry_cnt;
289eef4f27bSRobert Mustacchi         split_entry->next = NULL;
290*55fea89dSDan Cross 
291eef4f27bSRobert Mustacchi     }
292eef4f27bSRobert Mustacchi }
293eef4f27bSRobert Mustacchi 
294eef4f27bSRobert Mustacchi #else
295eef4f27bSRobert Mustacchi 
296eef4f27bSRobert Mustacchi 
297eef4f27bSRobert Mustacchi #define s_list_init(_s_list, _head_entry, _tail_entry, _entry_cnt) \
298eef4f27bSRobert Mustacchi     (_s_list)->head = (_head_entry); \
299eef4f27bSRobert Mustacchi     (_s_list)->tail = (_tail_entry); \
300eef4f27bSRobert Mustacchi     (_s_list)->cnt = (_entry_cnt)
301eef4f27bSRobert Mustacchi 
302eef4f27bSRobert Mustacchi 
303eef4f27bSRobert Mustacchi #define s_list_clear(_s_list) \
304eef4f27bSRobert Mustacchi     (_s_list)->head = (s_list_entry_t *) 0; \
305eef4f27bSRobert Mustacchi     (_s_list)->tail = (s_list_entry_t *) 0; \
306eef4f27bSRobert Mustacchi     (_s_list)->cnt = 0
307eef4f27bSRobert Mustacchi 
308eef4f27bSRobert Mustacchi 
309eef4f27bSRobert Mustacchi #define s_list_push_head(_s_list, _s_entry) \
310eef4f27bSRobert Mustacchi     (_s_entry)->next = (_s_list)->head; \
311eef4f27bSRobert Mustacchi     if((_s_list)->tail == (s_list_entry_t *) 0) \
312eef4f27bSRobert Mustacchi     { \
313eef4f27bSRobert Mustacchi         (_s_list)->tail = (_s_entry); \
314eef4f27bSRobert Mustacchi     } \
315eef4f27bSRobert Mustacchi     (_s_list)->head = (_s_entry); \
316eef4f27bSRobert Mustacchi     (_s_list)->cnt++
317eef4f27bSRobert Mustacchi 
318eef4f27bSRobert Mustacchi 
319eef4f27bSRobert Mustacchi #define s_list_pop_head(_s_list) \
320eef4f27bSRobert Mustacchi     (_s_list)->head; \
321eef4f27bSRobert Mustacchi     if((_s_list)->head) \
322eef4f27bSRobert Mustacchi     { \
323eef4f27bSRobert Mustacchi         (_s_list)->head = (_s_list)->head->next; \
324eef4f27bSRobert Mustacchi         if((_s_list)->head == (s_list_entry_t *) 0) \
325eef4f27bSRobert Mustacchi         { \
326eef4f27bSRobert Mustacchi             (_s_list)->tail = (s_list_entry_t *) 0; \
327eef4f27bSRobert Mustacchi         } \
328eef4f27bSRobert Mustacchi         (_s_list)->cnt--; \
329eef4f27bSRobert Mustacchi     }
330eef4f27bSRobert Mustacchi 
331eef4f27bSRobert Mustacchi 
332eef4f27bSRobert Mustacchi #define s_list_push_tail(_s_list, _s_entry) \
333eef4f27bSRobert Mustacchi     (_s_entry)->next = (s_list_entry_t *) 0; \
334eef4f27bSRobert Mustacchi     if((_s_list)->tail) \
335eef4f27bSRobert Mustacchi     { \
336eef4f27bSRobert Mustacchi         (_s_list)->tail->next = (_s_entry); \
337eef4f27bSRobert Mustacchi     } \
338eef4f27bSRobert Mustacchi     else \
339eef4f27bSRobert Mustacchi     { \
340eef4f27bSRobert Mustacchi         (_s_list)->head = (_s_entry); \
341eef4f27bSRobert Mustacchi     } \
342eef4f27bSRobert Mustacchi     (_s_list)->tail = (_s_entry); \
343*55fea89dSDan Cross     (_s_list)->cnt++
344eef4f27bSRobert Mustacchi 
345eef4f27bSRobert Mustacchi 
346eef4f27bSRobert Mustacchi #define s_list_peek_head(_s_list)       ((_s_list)->head)
347eef4f27bSRobert Mustacchi 
348eef4f27bSRobert Mustacchi 
349eef4f27bSRobert Mustacchi #define s_list_peek_tail(_s_list)       ((_s_list)->tail)
350eef4f27bSRobert Mustacchi 
351eef4f27bSRobert Mustacchi 
352eef4f27bSRobert Mustacchi #define s_list_next_entry(_s_entry)     ((_s_entry)->next)
353eef4f27bSRobert Mustacchi 
354eef4f27bSRobert Mustacchi 
355eef4f27bSRobert Mustacchi #define s_list_entry_cnt(_s_list)       ((_s_list)->cnt)
356eef4f27bSRobert Mustacchi 
357eef4f27bSRobert Mustacchi 
358eef4f27bSRobert Mustacchi #define s_list_is_empty(_s_list)        ((_s_list)->cnt == 0)
359eef4f27bSRobert Mustacchi 
360eef4f27bSRobert Mustacchi 
361eef4f27bSRobert Mustacchi #define s_list_add_head(_s_list, _s_list_head) \
362eef4f27bSRobert Mustacchi     if((_s_list)->cnt == 0) \
363eef4f27bSRobert Mustacchi     { \
364eef4f27bSRobert Mustacchi         *(_s_list) = *(_s_list_head); \
365eef4f27bSRobert Mustacchi     } \
366eef4f27bSRobert Mustacchi     else if((_s_list_head)->cnt) \
367eef4f27bSRobert Mustacchi     { \
368eef4f27bSRobert Mustacchi         (_s_list_head)->tail->next = (_s_list)->head; \
369eef4f27bSRobert Mustacchi         (_s_list)->head = (_s_list_head)->head; \
370eef4f27bSRobert Mustacchi         (_s_list)->cnt += (_s_list_head)->cnt; \
371eef4f27bSRobert Mustacchi     }
372eef4f27bSRobert Mustacchi 
373eef4f27bSRobert Mustacchi #define s_list_add_tail(_s_list, _s_list_tail) \
374eef4f27bSRobert Mustacchi     if((_s_list)->cnt == 0) \
375eef4f27bSRobert Mustacchi     { \
376eef4f27bSRobert Mustacchi         *(_s_list) = *(_s_list_tail); \
377eef4f27bSRobert Mustacchi     } \
378eef4f27bSRobert Mustacchi     else if((_s_list_tail)->cnt) \
379eef4f27bSRobert Mustacchi     { \
380eef4f27bSRobert Mustacchi         (_s_list)->tail->next = (_s_list_tail)->head; \
381eef4f27bSRobert Mustacchi         (_s_list)->tail = (_s_list_tail)->tail; \
382eef4f27bSRobert Mustacchi         (_s_list)->cnt += (_s_list_tail)->cnt; \
383eef4f27bSRobert Mustacchi     }
384eef4f27bSRobert Mustacchi 
385eef4f27bSRobert Mustacchi #define s_list_split(_s_list, _s_list_head, _split_entry, _entry_cnt) \
386eef4f27bSRobert Mustacchi     if ((_split_entry)->next == NULL) { \
387eef4f27bSRobert Mustacchi         (_s_list_head)->head = (_s_list)->head; \
388eef4f27bSRobert Mustacchi         (_s_list_head)->tail = _split_entry; \
389eef4f27bSRobert Mustacchi         (_s_list_head)->cnt = _entry_cnt; \
390eef4f27bSRobert Mustacchi         (_s_list)->head = NULL; \
391eef4f27bSRobert Mustacchi         (_s_list)->tail = NULL; \
392eef4f27bSRobert Mustacchi         (_s_list)->cnt = 0; \
393eef4f27bSRobert Mustacchi     } else { \
394eef4f27bSRobert Mustacchi         (_s_list_head)->head = (_s_list)->head; \
395eef4f27bSRobert Mustacchi         (_s_list_head)->tail = _split_entry; \
396eef4f27bSRobert Mustacchi         (_s_list_head)->cnt = (_entry_cnt); \
397eef4f27bSRobert Mustacchi         (_s_list)->head = (_split_entry)->next; \
398eef4f27bSRobert Mustacchi         (_s_list)->cnt = (_s_list)->cnt - (_entry_cnt); \
399eef4f27bSRobert Mustacchi         (_split_entry)->next = NULL; \
400eef4f27bSRobert Mustacchi     }
401eef4f27bSRobert Mustacchi 
402eef4f27bSRobert Mustacchi #endif
403eef4f27bSRobert Mustacchi 
404eef4f27bSRobert Mustacchi 
405eef4f27bSRobert Mustacchi 
406eef4f27bSRobert Mustacchi /*******************************************************************************
407eef4f27bSRobert Mustacchi  * Double link list entry.
408eef4f27bSRobert Mustacchi  ******************************************************************************/
409eef4f27bSRobert Mustacchi 
410eef4f27bSRobert Mustacchi typedef struct _d_list_entry_t
411eef4f27bSRobert Mustacchi {
412eef4f27bSRobert Mustacchi     struct _d_list_entry_t *next;
413eef4f27bSRobert Mustacchi     struct _d_list_entry_t *prev;
414eef4f27bSRobert Mustacchi } d_list_entry_t;
415eef4f27bSRobert Mustacchi 
416eef4f27bSRobert Mustacchi #define D_LINK_CAST(_p)                 ((d_list_entry_t *) (_p))
417eef4f27bSRobert Mustacchi 
418eef4f27bSRobert Mustacchi 
419eef4f27bSRobert Mustacchi typedef struct _d_list_t
420eef4f27bSRobert Mustacchi {
421eef4f27bSRobert Mustacchi     d_list_entry_t *head;
422eef4f27bSRobert Mustacchi     d_list_entry_t *tail;
423eef4f27bSRobert Mustacchi     unsigned long cnt;
424eef4f27bSRobert Mustacchi } d_list_t;
425eef4f27bSRobert Mustacchi 
426eef4f27bSRobert Mustacchi 
427eef4f27bSRobert Mustacchi 
428eef4f27bSRobert Mustacchi #ifdef _INLINE_LISTQ_CALLS
429eef4f27bSRobert Mustacchi 
430eef4f27bSRobert Mustacchi 
431eef4f27bSRobert Mustacchi __inline
432*55fea89dSDan Cross void
d_list_init(d_list_t * d_list,d_list_entry_t * head_entry,d_list_entry_t * tail_entry,unsigned long entry_cnt)433eef4f27bSRobert Mustacchi d_list_init(
434eef4f27bSRobert Mustacchi     d_list_t *d_list,
435eef4f27bSRobert Mustacchi     d_list_entry_t *head_entry,
436eef4f27bSRobert Mustacchi     d_list_entry_t *tail_entry,
437eef4f27bSRobert Mustacchi     unsigned long entry_cnt)
438eef4f27bSRobert Mustacchi {
439eef4f27bSRobert Mustacchi     d_list->head = head_entry;
440eef4f27bSRobert Mustacchi     d_list->tail = tail_entry;
441eef4f27bSRobert Mustacchi     d_list->cnt = entry_cnt;
442eef4f27bSRobert Mustacchi }
443eef4f27bSRobert Mustacchi 
444eef4f27bSRobert Mustacchi 
445eef4f27bSRobert Mustacchi __inline
446*55fea89dSDan Cross void
d_list_clear(d_list_t * d_list)447eef4f27bSRobert Mustacchi d_list_clear(
448eef4f27bSRobert Mustacchi     d_list_t *d_list)
449eef4f27bSRobert Mustacchi {
450eef4f27bSRobert Mustacchi     d_list->head = (d_list_entry_t *) 0;
451eef4f27bSRobert Mustacchi     d_list->tail = (d_list_entry_t *) 0;
452eef4f27bSRobert Mustacchi     d_list->cnt = 0;
453eef4f27bSRobert Mustacchi }
454eef4f27bSRobert Mustacchi 
455eef4f27bSRobert Mustacchi 
456eef4f27bSRobert Mustacchi __inline
457eef4f27bSRobert Mustacchi void
d_list_push_head(d_list_t * d_list,d_list_entry_t * d_entry)458eef4f27bSRobert Mustacchi d_list_push_head(
459eef4f27bSRobert Mustacchi     d_list_t *d_list,
460eef4f27bSRobert Mustacchi     d_list_entry_t *d_entry)
461eef4f27bSRobert Mustacchi {
462eef4f27bSRobert Mustacchi     d_entry->prev = (d_list_entry_t *) 0;
463eef4f27bSRobert Mustacchi     d_entry->next = d_list->head;
464eef4f27bSRobert Mustacchi 
465eef4f27bSRobert Mustacchi     if(d_list->tail == (d_list_entry_t *) 0)
466eef4f27bSRobert Mustacchi     {
467eef4f27bSRobert Mustacchi         d_list->tail = d_entry;
468eef4f27bSRobert Mustacchi     }
469eef4f27bSRobert Mustacchi     else
470eef4f27bSRobert Mustacchi     {
471eef4f27bSRobert Mustacchi         d_list->head->prev = d_entry;
472eef4f27bSRobert Mustacchi     }
473eef4f27bSRobert Mustacchi 
474eef4f27bSRobert Mustacchi     d_list->head = d_entry;
475eef4f27bSRobert Mustacchi 
476eef4f27bSRobert Mustacchi     d_list->cnt++;
477eef4f27bSRobert Mustacchi }
478eef4f27bSRobert Mustacchi 
479eef4f27bSRobert Mustacchi 
480eef4f27bSRobert Mustacchi __inline
481eef4f27bSRobert Mustacchi d_list_entry_t *
d_list_pop_head(d_list_t * d_list)482eef4f27bSRobert Mustacchi d_list_pop_head(
483eef4f27bSRobert Mustacchi     d_list_t *d_list)
484eef4f27bSRobert Mustacchi {
485eef4f27bSRobert Mustacchi     d_list_entry_t *d_entry;
486eef4f27bSRobert Mustacchi 
487eef4f27bSRobert Mustacchi     d_entry = d_list->head;
488eef4f27bSRobert Mustacchi     if(d_list->head)
489eef4f27bSRobert Mustacchi     {
490eef4f27bSRobert Mustacchi         d_list->head = d_list->head->next;
491eef4f27bSRobert Mustacchi         if(d_list->head)
492eef4f27bSRobert Mustacchi         {
493eef4f27bSRobert Mustacchi             d_list->head->prev = (d_list_entry_t *) 0;
494eef4f27bSRobert Mustacchi         }
495eef4f27bSRobert Mustacchi         else
496eef4f27bSRobert Mustacchi         {
497eef4f27bSRobert Mustacchi             d_list->tail = (d_list_entry_t *) 0;
498eef4f27bSRobert Mustacchi         }
499eef4f27bSRobert Mustacchi 
500eef4f27bSRobert Mustacchi         d_list->cnt--;
501eef4f27bSRobert Mustacchi     }
502eef4f27bSRobert Mustacchi 
503eef4f27bSRobert Mustacchi     return d_entry;
504eef4f27bSRobert Mustacchi }
505eef4f27bSRobert Mustacchi 
506eef4f27bSRobert Mustacchi 
507eef4f27bSRobert Mustacchi __inline
508eef4f27bSRobert Mustacchi void
d_list_push_tail(d_list_t * d_list,d_list_entry_t * d_entry)509eef4f27bSRobert Mustacchi d_list_push_tail(
510eef4f27bSRobert Mustacchi     d_list_t *d_list,
511eef4f27bSRobert Mustacchi     d_list_entry_t *d_entry)
512eef4f27bSRobert Mustacchi {
513eef4f27bSRobert Mustacchi     d_entry->next = (d_list_entry_t *) 0;
514eef4f27bSRobert Mustacchi     d_entry->prev = d_list->tail;
515eef4f27bSRobert Mustacchi 
516eef4f27bSRobert Mustacchi     if(d_list->tail)
517eef4f27bSRobert Mustacchi     {
518eef4f27bSRobert Mustacchi         d_list->tail->next = d_entry;
519eef4f27bSRobert Mustacchi     }
520eef4f27bSRobert Mustacchi     else
521eef4f27bSRobert Mustacchi     {
522eef4f27bSRobert Mustacchi         d_list->head = d_entry;
523eef4f27bSRobert Mustacchi     }
524eef4f27bSRobert Mustacchi     d_list->tail = d_entry;
525eef4f27bSRobert Mustacchi 
526eef4f27bSRobert Mustacchi     d_list->cnt++;
527eef4f27bSRobert Mustacchi }
528eef4f27bSRobert Mustacchi 
529eef4f27bSRobert Mustacchi 
530eef4f27bSRobert Mustacchi __inline
531eef4f27bSRobert Mustacchi d_list_entry_t *
d_list_pop_tail(d_list_t * d_list)532eef4f27bSRobert Mustacchi d_list_pop_tail(
533eef4f27bSRobert Mustacchi     d_list_t *d_list)
534eef4f27bSRobert Mustacchi {
535eef4f27bSRobert Mustacchi     d_list_entry_t *d_entry;
536eef4f27bSRobert Mustacchi 
537eef4f27bSRobert Mustacchi     d_entry = d_list->tail;
538eef4f27bSRobert Mustacchi 
539eef4f27bSRobert Mustacchi     if(d_list->tail)
540eef4f27bSRobert Mustacchi     {
541eef4f27bSRobert Mustacchi         d_list->tail = d_list->tail->prev;
542eef4f27bSRobert Mustacchi         if(d_list->tail)
543eef4f27bSRobert Mustacchi         {
544eef4f27bSRobert Mustacchi             d_list->tail->next = (d_list_entry_t *) 0;
545eef4f27bSRobert Mustacchi         }
546eef4f27bSRobert Mustacchi         else
547eef4f27bSRobert Mustacchi         {
548eef4f27bSRobert Mustacchi             d_list->head = (d_list_entry_t *) 0;
549eef4f27bSRobert Mustacchi         }
550eef4f27bSRobert Mustacchi 
551eef4f27bSRobert Mustacchi         d_list->cnt--;
552eef4f27bSRobert Mustacchi     }
553eef4f27bSRobert Mustacchi 
554eef4f27bSRobert Mustacchi     return d_entry;
555eef4f27bSRobert Mustacchi }
556eef4f27bSRobert Mustacchi 
557eef4f27bSRobert Mustacchi 
558eef4f27bSRobert Mustacchi __inline
559eef4f27bSRobert Mustacchi d_list_entry_t *
d_list_peek_head(d_list_t * d_list)560eef4f27bSRobert Mustacchi d_list_peek_head(
561eef4f27bSRobert Mustacchi     d_list_t *d_list)
562eef4f27bSRobert Mustacchi {
563eef4f27bSRobert Mustacchi     return d_list->head;
564eef4f27bSRobert Mustacchi }
565eef4f27bSRobert Mustacchi 
566eef4f27bSRobert Mustacchi 
567eef4f27bSRobert Mustacchi __inline
568eef4f27bSRobert Mustacchi d_list_entry_t *
d_list_peek_tail(d_list_t * d_list)569eef4f27bSRobert Mustacchi d_list_peek_tail(
570eef4f27bSRobert Mustacchi     d_list_t *d_list)
571eef4f27bSRobert Mustacchi {
572eef4f27bSRobert Mustacchi     return d_list->tail;
573eef4f27bSRobert Mustacchi }
574eef4f27bSRobert Mustacchi 
575eef4f27bSRobert Mustacchi 
576eef4f27bSRobert Mustacchi __inline
577eef4f27bSRobert Mustacchi d_list_entry_t *
d_list_next_entry(d_list_entry_t * d_entry)578eef4f27bSRobert Mustacchi d_list_next_entry(
579eef4f27bSRobert Mustacchi     d_list_entry_t *d_entry)
580eef4f27bSRobert Mustacchi {
581eef4f27bSRobert Mustacchi     return d_entry->next;
582eef4f27bSRobert Mustacchi }
583eef4f27bSRobert Mustacchi 
584eef4f27bSRobert Mustacchi 
585eef4f27bSRobert Mustacchi __inline
586eef4f27bSRobert Mustacchi void
d_list_remove_entry(d_list_t * d_list,d_list_entry_t * d_entry)587eef4f27bSRobert Mustacchi d_list_remove_entry(
588eef4f27bSRobert Mustacchi     d_list_t *d_list,
589eef4f27bSRobert Mustacchi     d_list_entry_t *d_entry)
590eef4f27bSRobert Mustacchi {
591eef4f27bSRobert Mustacchi     if(d_list->head == d_entry)
592eef4f27bSRobert Mustacchi     {
593eef4f27bSRobert Mustacchi         d_list_pop_head(d_list);
594eef4f27bSRobert Mustacchi     }
595eef4f27bSRobert Mustacchi     else if(d_list->tail == d_entry)
596eef4f27bSRobert Mustacchi     {
597eef4f27bSRobert Mustacchi         d_list_pop_tail(d_list);
598eef4f27bSRobert Mustacchi     }
599eef4f27bSRobert Mustacchi     else
600eef4f27bSRobert Mustacchi     {
601eef4f27bSRobert Mustacchi         d_entry->prev->next = d_entry->next;
602eef4f27bSRobert Mustacchi         d_entry->next->prev = d_entry->prev;
603eef4f27bSRobert Mustacchi         d_list->cnt--;
604eef4f27bSRobert Mustacchi     }
605eef4f27bSRobert Mustacchi }
606eef4f27bSRobert Mustacchi 
607eef4f27bSRobert Mustacchi __inline
608eef4f27bSRobert Mustacchi void
d_list_insert_entry(d_list_t * d_list,d_list_entry_t * d_entry_prev,d_list_entry_t * d_entry_next,d_list_entry_t * d_entry)609eef4f27bSRobert Mustacchi d_list_insert_entry(
610eef4f27bSRobert Mustacchi     d_list_t *d_list,
611eef4f27bSRobert Mustacchi     d_list_entry_t *d_entry_prev,
612eef4f27bSRobert Mustacchi     d_list_entry_t *d_entry_next,
613eef4f27bSRobert Mustacchi     d_list_entry_t *d_entry)
614eef4f27bSRobert Mustacchi {
615eef4f27bSRobert Mustacchi     if (d_entry_prev  == NULL)
616eef4f27bSRobert Mustacchi     {
617eef4f27bSRobert Mustacchi         d_list_push_head(d_list, d_entry);
618eef4f27bSRobert Mustacchi     }
619eef4f27bSRobert Mustacchi     else if (d_entry_next == NULL)
620eef4f27bSRobert Mustacchi     {
621eef4f27bSRobert Mustacchi         d_list_push_tail(d_list, d_entry);
622eef4f27bSRobert Mustacchi     }
623eef4f27bSRobert Mustacchi     else
624eef4f27bSRobert Mustacchi     {
625eef4f27bSRobert Mustacchi         d_entry->next = d_entry_next;
626eef4f27bSRobert Mustacchi         d_entry->prev = d_entry_prev;
627eef4f27bSRobert Mustacchi         d_entry_prev->next = d_entry;
628eef4f27bSRobert Mustacchi         d_entry_next->prev = d_entry;
629eef4f27bSRobert Mustacchi         d_list->cnt++;
630eef4f27bSRobert Mustacchi     }
631eef4f27bSRobert Mustacchi }
632eef4f27bSRobert Mustacchi 
633eef4f27bSRobert Mustacchi 
634eef4f27bSRobert Mustacchi __inline
635eef4f27bSRobert Mustacchi d_list_entry_t *
d_list_prev_entry(d_list_entry_t * d_entry)636eef4f27bSRobert Mustacchi d_list_prev_entry(
637eef4f27bSRobert Mustacchi     d_list_entry_t *d_entry)
638eef4f27bSRobert Mustacchi {
639eef4f27bSRobert Mustacchi     return d_entry->prev;
640eef4f27bSRobert Mustacchi }
641eef4f27bSRobert Mustacchi 
642eef4f27bSRobert Mustacchi 
643eef4f27bSRobert Mustacchi __inline
644eef4f27bSRobert Mustacchi unsigned long
d_list_entry_cnt(d_list_t * d_list)645eef4f27bSRobert Mustacchi d_list_entry_cnt(
646eef4f27bSRobert Mustacchi     d_list_t *d_list)
647eef4f27bSRobert Mustacchi {
648eef4f27bSRobert Mustacchi     return d_list->cnt;
649eef4f27bSRobert Mustacchi }
650eef4f27bSRobert Mustacchi 
651eef4f27bSRobert Mustacchi 
652eef4f27bSRobert Mustacchi __inline
653eef4f27bSRobert Mustacchi char
d_list_is_empty(d_list_t * d_list)654eef4f27bSRobert Mustacchi d_list_is_empty(
655eef4f27bSRobert Mustacchi     d_list_t *d_list)
656eef4f27bSRobert Mustacchi {
657eef4f27bSRobert Mustacchi     return d_list->cnt == 0;
658eef4f27bSRobert Mustacchi }
659eef4f27bSRobert Mustacchi 
660eef4f27bSRobert Mustacchi 
661eef4f27bSRobert Mustacchi __inline
662eef4f27bSRobert Mustacchi void
d_list_add_head(d_list_t * d_list,d_list_t * d_list_head)663eef4f27bSRobert Mustacchi d_list_add_head(
664eef4f27bSRobert Mustacchi     d_list_t *d_list,
665eef4f27bSRobert Mustacchi     d_list_t *d_list_head)
666eef4f27bSRobert Mustacchi {
667eef4f27bSRobert Mustacchi     d_list_head->tail->next = d_list->head;
668eef4f27bSRobert Mustacchi 
669eef4f27bSRobert Mustacchi     if(d_list->head)
670eef4f27bSRobert Mustacchi     {
671eef4f27bSRobert Mustacchi         d_list->head->prev = d_list_head->tail;
672eef4f27bSRobert Mustacchi     }
673eef4f27bSRobert Mustacchi     else
674eef4f27bSRobert Mustacchi     {
675eef4f27bSRobert Mustacchi         d_list->tail = d_list_head->tail;
676eef4f27bSRobert Mustacchi     }
677eef4f27bSRobert Mustacchi     d_list->head = d_list_head->head;
678eef4f27bSRobert Mustacchi 
679eef4f27bSRobert Mustacchi     d_list->cnt += d_list_head->cnt;
680eef4f27bSRobert Mustacchi }
681eef4f27bSRobert Mustacchi 
682eef4f27bSRobert Mustacchi 
683eef4f27bSRobert Mustacchi __inline
684eef4f27bSRobert Mustacchi void
d_list_add_tail(d_list_t * d_list,d_list_t * d_list_tail)685eef4f27bSRobert Mustacchi d_list_add_tail(
686eef4f27bSRobert Mustacchi     d_list_t *d_list,
687eef4f27bSRobert Mustacchi     d_list_t *d_list_tail)
688eef4f27bSRobert Mustacchi {
689eef4f27bSRobert Mustacchi     d_list_tail->head->prev = d_list->tail;
690eef4f27bSRobert Mustacchi 
691eef4f27bSRobert Mustacchi     if(d_list->tail)
692eef4f27bSRobert Mustacchi     {
693eef4f27bSRobert Mustacchi         d_list->tail->next = d_list_tail->head;
694eef4f27bSRobert Mustacchi     }
695eef4f27bSRobert Mustacchi     else
696eef4f27bSRobert Mustacchi     {
697eef4f27bSRobert Mustacchi         d_list->head = d_list_tail->head;
698eef4f27bSRobert Mustacchi     }
699eef4f27bSRobert Mustacchi     d_list->tail = d_list_tail->tail;
700eef4f27bSRobert Mustacchi 
701eef4f27bSRobert Mustacchi     d_list->cnt += d_list_tail->cnt;
702eef4f27bSRobert Mustacchi }
703eef4f27bSRobert Mustacchi 
704eef4f27bSRobert Mustacchi 
705eef4f27bSRobert Mustacchi #else
706eef4f27bSRobert Mustacchi 
707eef4f27bSRobert Mustacchi 
708eef4f27bSRobert Mustacchi #define d_list_init(_d_list, _head_entry, _tail_entry, _entry_cnt) \
709eef4f27bSRobert Mustacchi     (_d_list)->head = (_head_entry); \
710eef4f27bSRobert Mustacchi     (_d_list)->tail = (_tail_entry); \
711eef4f27bSRobert Mustacchi     (_d_list)->cnt = (_entry_cnt)
712eef4f27bSRobert Mustacchi 
713eef4f27bSRobert Mustacchi 
714eef4f27bSRobert Mustacchi #define d_list_clear(_d_list) \
715eef4f27bSRobert Mustacchi     (_d_list)->head = (d_list_entry_t *) 0; \
716eef4f27bSRobert Mustacchi     (_d_list)->tail = (d_list_entry_t *) 0; \
717eef4f27bSRobert Mustacchi     (_d_list)->cnt = 0
718eef4f27bSRobert Mustacchi 
719eef4f27bSRobert Mustacchi 
720eef4f27bSRobert Mustacchi #define d_list_push_head(_d_list, _d_entry) \
721eef4f27bSRobert Mustacchi     (_d_entry)->prev = (d_list_entry_t *) 0; \
722eef4f27bSRobert Mustacchi     (_d_entry)->next = (_d_list)->head; \
723eef4f27bSRobert Mustacchi     if((_d_list)->tail == (d_list_entry_t *) 0) \
724eef4f27bSRobert Mustacchi     { \
725eef4f27bSRobert Mustacchi         (_d_list)->tail = (_d_entry); \
726eef4f27bSRobert Mustacchi     } \
727eef4f27bSRobert Mustacchi     else \
728eef4f27bSRobert Mustacchi     { \
729eef4f27bSRobert Mustacchi         (_d_list)->head->prev = (_d_entry); \
730eef4f27bSRobert Mustacchi     } \
731eef4f27bSRobert Mustacchi     (_d_list)->head = (_d_entry); \
732*55fea89dSDan Cross     (_d_list)->cnt++
733eef4f27bSRobert Mustacchi 
734eef4f27bSRobert Mustacchi 
735eef4f27bSRobert Mustacchi #define d_list_pop_head(_d_list) \
736eef4f27bSRobert Mustacchi     (_d_list)->head; \
737eef4f27bSRobert Mustacchi     if((_d_list)->head) \
738eef4f27bSRobert Mustacchi     { \
739eef4f27bSRobert Mustacchi         (_d_list)->head = (_d_list)->head->next; \
740eef4f27bSRobert Mustacchi         if((_d_list)->head) \
741eef4f27bSRobert Mustacchi         { \
742eef4f27bSRobert Mustacchi             (_d_list)->head->prev = (d_list_entry_t *) 0; \
743eef4f27bSRobert Mustacchi         } \
744eef4f27bSRobert Mustacchi         else \
745eef4f27bSRobert Mustacchi         { \
746eef4f27bSRobert Mustacchi             (_d_list)->tail = (d_list_entry_t *) 0; \
747eef4f27bSRobert Mustacchi         } \
748eef4f27bSRobert Mustacchi         (_d_list)->cnt--; \
749eef4f27bSRobert Mustacchi     }
750eef4f27bSRobert Mustacchi 
751eef4f27bSRobert Mustacchi 
752eef4f27bSRobert Mustacchi #define d_list_push_tail(_d_list, _d_entry) \
753eef4f27bSRobert Mustacchi     (_d_entry)->next = (d_list_entry_t *) 0; \
754eef4f27bSRobert Mustacchi     (_d_entry)->prev = (_d_list)->tail; \
755eef4f27bSRobert Mustacchi     if((_d_list)->tail) \
756eef4f27bSRobert Mustacchi     { \
757eef4f27bSRobert Mustacchi         (_d_list)->tail->next = (_d_entry); \
758eef4f27bSRobert Mustacchi     } \
759eef4f27bSRobert Mustacchi     else \
760eef4f27bSRobert Mustacchi     { \
761eef4f27bSRobert Mustacchi         (_d_list)->head = (_d_entry); \
762eef4f27bSRobert Mustacchi     } \
763eef4f27bSRobert Mustacchi     (_d_list)->tail = (_d_entry); \
764eef4f27bSRobert Mustacchi     (_d_list)->cnt++
765eef4f27bSRobert Mustacchi 
766eef4f27bSRobert Mustacchi 
767eef4f27bSRobert Mustacchi #define d_list_pop_tail(_d_list) \
768eef4f27bSRobert Mustacchi     (_d_list)->tail; \
769eef4f27bSRobert Mustacchi     if((_d_list)->tail) \
770eef4f27bSRobert Mustacchi     { \
771eef4f27bSRobert Mustacchi         (_d_list)->tail = (_d_list)->tail->prev; \
772eef4f27bSRobert Mustacchi         if((_d_list)->tail) \
773eef4f27bSRobert Mustacchi         { \
774eef4f27bSRobert Mustacchi             (_d_list)->tail->next = (d_list_entry_t *) 0; \
775eef4f27bSRobert Mustacchi         } \
776eef4f27bSRobert Mustacchi         else \
777eef4f27bSRobert Mustacchi         { \
778eef4f27bSRobert Mustacchi             (_d_list)->head = (d_list_entry_t *) 0; \
779eef4f27bSRobert Mustacchi         } \
780eef4f27bSRobert Mustacchi         (_d_list)->cnt--; \
781eef4f27bSRobert Mustacchi     }
782eef4f27bSRobert Mustacchi 
783eef4f27bSRobert Mustacchi 
784eef4f27bSRobert Mustacchi #define d_list_peek_head(_d_list)       ((_d_list)->head)
785eef4f27bSRobert Mustacchi 
786eef4f27bSRobert Mustacchi 
787eef4f27bSRobert Mustacchi #define d_list_peek_tail(_d_list)       ((_d_list)->tail)
788eef4f27bSRobert Mustacchi 
789eef4f27bSRobert Mustacchi 
790eef4f27bSRobert Mustacchi #define d_list_next_entry(_d_entry)     ((_d_entry)->next)
791eef4f27bSRobert Mustacchi 
792eef4f27bSRobert Mustacchi #define d_list_insert_entry(_d_list, _d_entry_prev, _d_entry_next, _d_entry) \
793eef4f27bSRobert Mustacchi     if (_d_entry_prev  == NULL ) \
794eef4f27bSRobert Mustacchi     { \
795eef4f27bSRobert Mustacchi         (_d_entry)->prev = (d_list_entry_t *) 0; \
796eef4f27bSRobert Mustacchi         (_d_entry)->next = (_d_list)->head; \
797eef4f27bSRobert Mustacchi         if((_d_list)->tail == (d_list_entry_t *) 0) \
798eef4f27bSRobert Mustacchi         { \
799eef4f27bSRobert Mustacchi             (_d_list)->tail = (_d_entry); \
800eef4f27bSRobert Mustacchi         } \
801eef4f27bSRobert Mustacchi         (_d_list)->head = (_d_entry); \
802eef4f27bSRobert Mustacchi         (_d_list)->cnt++; \
803eef4f27bSRobert Mustacchi     } \
804eef4f27bSRobert Mustacchi     else if (_d_entry_next == NULL ) \
805eef4f27bSRobert Mustacchi     { \
806eef4f27bSRobert Mustacchi         (_d_entry)->next = (d_list_entry_t *) 0; \
807eef4f27bSRobert Mustacchi         (_d_entry)->prev = (_d_list)->tail; \
808eef4f27bSRobert Mustacchi         if((_d_list)->tail) \
809eef4f27bSRobert Mustacchi         { \
810eef4f27bSRobert Mustacchi             (_d_list)->tail->next = (_d_entry); \
811eef4f27bSRobert Mustacchi         } \
812eef4f27bSRobert Mustacchi         else \
813eef4f27bSRobert Mustacchi         { \
814eef4f27bSRobert Mustacchi             (_d_list)->head = (_d_entry); \
815eef4f27bSRobert Mustacchi         } \
816eef4f27bSRobert Mustacchi         (_d_list)->tail = (_d_entry); \
817eef4f27bSRobert Mustacchi         (_d_list)->cnt++; \
818eef4f27bSRobert Mustacchi     } \
819eef4f27bSRobert Mustacchi     else \
820eef4f27bSRobert Mustacchi     { \
821eef4f27bSRobert Mustacchi         (_d_entry)->next = (_d_entry_next); \
822eef4f27bSRobert Mustacchi         (_d_entry)->prev = (_d_entry_prev); \
823eef4f27bSRobert Mustacchi         (_d_entry_prev)->next = (_d_entry); \
824eef4f27bSRobert Mustacchi         (_d_entry_next)->prev = (_d_entry); \
825eef4f27bSRobert Mustacchi         (_d_list)->cnt++; \
826eef4f27bSRobert Mustacchi     }
827eef4f27bSRobert Mustacchi 
828eef4f27bSRobert Mustacchi #define d_list_remove_entry(_d_list, _d_entry) \
829eef4f27bSRobert Mustacchi     if((_d_list)->head == (_d_entry)) \
830eef4f27bSRobert Mustacchi     { \
831eef4f27bSRobert Mustacchi         if((_d_list)->head) \
832eef4f27bSRobert Mustacchi         { \
833eef4f27bSRobert Mustacchi             (_d_list)->head = (_d_list)->head->next; \
834eef4f27bSRobert Mustacchi             if((_d_list)->head) \
835eef4f27bSRobert Mustacchi             { \
836eef4f27bSRobert Mustacchi                 (_d_list)->head->prev = (d_list_entry_t *) 0; \
837eef4f27bSRobert Mustacchi             } \
838eef4f27bSRobert Mustacchi             else \
839eef4f27bSRobert Mustacchi             { \
840eef4f27bSRobert Mustacchi                 (_d_list)->tail = (d_list_entry_t *) 0; \
841eef4f27bSRobert Mustacchi             } \
842eef4f27bSRobert Mustacchi             (_d_list)->cnt--; \
843eef4f27bSRobert Mustacchi         } \
844eef4f27bSRobert Mustacchi     } \
845eef4f27bSRobert Mustacchi     else if((_d_list)->tail == (_d_entry)) \
846eef4f27bSRobert Mustacchi     { \
847eef4f27bSRobert Mustacchi         if((_d_list)->tail) \
848eef4f27bSRobert Mustacchi         { \
849eef4f27bSRobert Mustacchi             (_d_list)->tail = (_d_list)->tail->prev; \
850eef4f27bSRobert Mustacchi             if((_d_list)->tail) \
851eef4f27bSRobert Mustacchi             { \
852eef4f27bSRobert Mustacchi                 (_d_list)->tail->next = (d_list_entry_t *) 0; \
853eef4f27bSRobert Mustacchi             } \
854eef4f27bSRobert Mustacchi             else \
855eef4f27bSRobert Mustacchi             { \
856eef4f27bSRobert Mustacchi                 (_d_list)->head = (d_list_entry_t *) 0; \
857eef4f27bSRobert Mustacchi             } \
858eef4f27bSRobert Mustacchi             (_d_list)->cnt--; \
859eef4f27bSRobert Mustacchi         } \
860eef4f27bSRobert Mustacchi     } \
861eef4f27bSRobert Mustacchi     else \
862eef4f27bSRobert Mustacchi     { \
863eef4f27bSRobert Mustacchi         (_d_entry)->prev->next = (_d_entry)->next; \
864eef4f27bSRobert Mustacchi         (_d_entry)->next->prev = (_d_entry)->prev; \
865eef4f27bSRobert Mustacchi         (_d_list)->cnt--; \
866eef4f27bSRobert Mustacchi     }
867eef4f27bSRobert Mustacchi 
868eef4f27bSRobert Mustacchi 
869eef4f27bSRobert Mustacchi #define d_list_prev_entry(_d_entry)     ((_d_entry)->prev)
870eef4f27bSRobert Mustacchi 
871eef4f27bSRobert Mustacchi 
872eef4f27bSRobert Mustacchi #define d_list_entry_cnt(_d_list)       ((_d_list)->cnt)
873eef4f27bSRobert Mustacchi 
874eef4f27bSRobert Mustacchi 
875eef4f27bSRobert Mustacchi #define d_list_is_empty(_d_list)        ((_d_list)->cnt == 0)
876eef4f27bSRobert Mustacchi 
877eef4f27bSRobert Mustacchi 
878eef4f27bSRobert Mustacchi #define d_list_add_head(_d_list, _d_list_head) \
879eef4f27bSRobert Mustacchi     (_d_list_head)->tail->next = (_d_list)->head; \
880eef4f27bSRobert Mustacchi     if((_d_list)->head) \
881eef4f27bSRobert Mustacchi     { \
882eef4f27bSRobert Mustacchi         (_d_list)->head->prev = (_d_list_head)->tail; \
883eef4f27bSRobert Mustacchi     } \
884eef4f27bSRobert Mustacchi     else \
885eef4f27bSRobert Mustacchi     { \
886eef4f27bSRobert Mustacchi         (_d_list)->tail = (_d_list_head)->tail; \
887eef4f27bSRobert Mustacchi     } \
888eef4f27bSRobert Mustacchi     (_d_list)->head = (_d_list_head)->head; \
889eef4f27bSRobert Mustacchi     (_d_list)->cnt += (_d_list_head)->cnt
890eef4f27bSRobert Mustacchi 
891eef4f27bSRobert Mustacchi 
892eef4f27bSRobert Mustacchi #define d_list_add_tail(_d_list, _d_list_tail) \
893eef4f27bSRobert Mustacchi     (_d_list_tail)->head->prev = (_d_list)->tail; \
894eef4f27bSRobert Mustacchi     if((_d_list)->tail) \
895eef4f27bSRobert Mustacchi     { \
896eef4f27bSRobert Mustacchi         (_d_list)->tail->next = (_d_list_tail)->head; \
897eef4f27bSRobert Mustacchi     } \
898eef4f27bSRobert Mustacchi     else \
899eef4f27bSRobert Mustacchi     { \
900eef4f27bSRobert Mustacchi         (_d_list)->head = (_d_list_tail)->head; \
901eef4f27bSRobert Mustacchi     } \
902eef4f27bSRobert Mustacchi     (_d_list)->tail = (_d_list_tail)->tail; \
903eef4f27bSRobert Mustacchi     (_d_list)->cnt += (_d_list_tail)->cnt
904eef4f27bSRobert Mustacchi 
905eef4f27bSRobert Mustacchi 
906eef4f27bSRobert Mustacchi #endif
907eef4f27bSRobert Mustacchi 
908eef4f27bSRobert Mustacchi 
909eef4f27bSRobert Mustacchi 
910eef4f27bSRobert Mustacchi /*******************************************************************************
911eef4f27bSRobert Mustacchi  * Array list.
912eef4f27bSRobert Mustacchi  ******************************************************************************/
913eef4f27bSRobert Mustacchi 
914eef4f27bSRobert Mustacchi typedef void *q_list_entry_t;
915eef4f27bSRobert Mustacchi 
916eef4f27bSRobert Mustacchi typedef struct _q_list_t
917eef4f27bSRobert Mustacchi {
918eef4f27bSRobert Mustacchi     q_list_entry_t *head;
919eef4f27bSRobert Mustacchi     q_list_entry_t *tail;
920eef4f27bSRobert Mustacchi     unsigned long cnt;
921eef4f27bSRobert Mustacchi 
922eef4f27bSRobert Mustacchi     unsigned long max_cnt;
923eef4f27bSRobert Mustacchi     q_list_entry_t *first_entry_addr;
924eef4f27bSRobert Mustacchi     q_list_entry_t *last_entry_addr;
925eef4f27bSRobert Mustacchi } q_list_t;
926eef4f27bSRobert Mustacchi 
927eef4f27bSRobert Mustacchi 
928eef4f27bSRobert Mustacchi 
929eef4f27bSRobert Mustacchi #ifdef _INLINE_LISTQ_CALLS
930eef4f27bSRobert Mustacchi 
931eef4f27bSRobert Mustacchi 
932eef4f27bSRobert Mustacchi __inline
933*55fea89dSDan Cross void
q_list_init(q_list_t * q_list,q_list_entry_t q_list_arr[],unsigned long max_cnt)934eef4f27bSRobert Mustacchi q_list_init(
935eef4f27bSRobert Mustacchi     q_list_t *q_list,
936eef4f27bSRobert Mustacchi     q_list_entry_t q_list_arr[],
937eef4f27bSRobert Mustacchi     unsigned long max_cnt)
938eef4f27bSRobert Mustacchi {
939eef4f27bSRobert Mustacchi     q_list->max_cnt = max_cnt;
940eef4f27bSRobert Mustacchi     q_list->first_entry_addr = q_list_arr;
941eef4f27bSRobert Mustacchi     q_list->last_entry_addr = q_list_arr + (max_cnt-1);
942eef4f27bSRobert Mustacchi 
943eef4f27bSRobert Mustacchi     q_list->head = q_list->first_entry_addr;
944eef4f27bSRobert Mustacchi     q_list->tail = q_list->first_entry_addr;
945eef4f27bSRobert Mustacchi     q_list->cnt = 0;
946eef4f27bSRobert Mustacchi }
947eef4f27bSRobert Mustacchi 
948eef4f27bSRobert Mustacchi 
949eef4f27bSRobert Mustacchi __inline
950eef4f27bSRobert Mustacchi void
q_list_clear(q_list_t * q_list)951eef4f27bSRobert Mustacchi q_list_clear(
952eef4f27bSRobert Mustacchi     q_list_t *q_list)
953eef4f27bSRobert Mustacchi {
954eef4f27bSRobert Mustacchi     q_list->head = q_list->first_entry_addr;
955eef4f27bSRobert Mustacchi     q_list->tail = q_list->first_entry_addr;
956eef4f27bSRobert Mustacchi     q_list->cnt = 0;
957eef4f27bSRobert Mustacchi }
958eef4f27bSRobert Mustacchi 
959eef4f27bSRobert Mustacchi 
960eef4f27bSRobert Mustacchi __inline
961eef4f27bSRobert Mustacchi void
q_list_push_head(q_list_t * q_list,q_list_entry_t q_entry)962eef4f27bSRobert Mustacchi q_list_push_head(
963eef4f27bSRobert Mustacchi     q_list_t *q_list,
964eef4f27bSRobert Mustacchi     q_list_entry_t q_entry)
965eef4f27bSRobert Mustacchi {
966eef4f27bSRobert Mustacchi     if(q_list->cnt < q_list->max_cnt)
967eef4f27bSRobert Mustacchi     {
968eef4f27bSRobert Mustacchi         if(q_list->head == q_list->first_entry_addr)
969eef4f27bSRobert Mustacchi         {
970eef4f27bSRobert Mustacchi             q_list->head = q_list->last_entry_addr;
971eef4f27bSRobert Mustacchi         }
972eef4f27bSRobert Mustacchi         else
973eef4f27bSRobert Mustacchi         {
974eef4f27bSRobert Mustacchi             q_list->head--;
975eef4f27bSRobert Mustacchi         }
976eef4f27bSRobert Mustacchi 
977eef4f27bSRobert Mustacchi         *(q_list->head) = q_entry;
978eef4f27bSRobert Mustacchi         q_list->cnt++;
979eef4f27bSRobert Mustacchi     }
980eef4f27bSRobert Mustacchi }
981eef4f27bSRobert Mustacchi 
982eef4f27bSRobert Mustacchi 
983eef4f27bSRobert Mustacchi __inline
984eef4f27bSRobert Mustacchi q_list_entry_t
q_list_pop_head(q_list_t * q_list)985eef4f27bSRobert Mustacchi q_list_pop_head(
986eef4f27bSRobert Mustacchi     q_list_t *q_list)
987eef4f27bSRobert Mustacchi {
988eef4f27bSRobert Mustacchi     q_list_entry_t q_entry;
989eef4f27bSRobert Mustacchi 
990eef4f27bSRobert Mustacchi     q_entry = q_list->cnt ? *q_list->head : (q_list_entry_t *) 0;
991eef4f27bSRobert Mustacchi     if(q_list->cnt)
992eef4f27bSRobert Mustacchi     {
993eef4f27bSRobert Mustacchi         if(q_list->head == q_list->last_entry_addr)
994eef4f27bSRobert Mustacchi         {
995eef4f27bSRobert Mustacchi             q_list->head = q_list->first_entry_addr;
996eef4f27bSRobert Mustacchi         }
997eef4f27bSRobert Mustacchi         else
998eef4f27bSRobert Mustacchi         {
999eef4f27bSRobert Mustacchi             q_list->head++;
1000eef4f27bSRobert Mustacchi         }
1001eef4f27bSRobert Mustacchi 
1002eef4f27bSRobert Mustacchi         q_list->cnt--;
1003eef4f27bSRobert Mustacchi     }
1004eef4f27bSRobert Mustacchi 
1005eef4f27bSRobert Mustacchi     return q_entry;
1006eef4f27bSRobert Mustacchi }
1007eef4f27bSRobert Mustacchi 
1008eef4f27bSRobert Mustacchi 
1009eef4f27bSRobert Mustacchi __inline
1010eef4f27bSRobert Mustacchi void
q_list_push_tail(q_list_t * q_list,q_list_entry_t q_entry)1011eef4f27bSRobert Mustacchi q_list_push_tail(
1012eef4f27bSRobert Mustacchi     q_list_t *q_list,
1013eef4f27bSRobert Mustacchi     q_list_entry_t q_entry)
1014eef4f27bSRobert Mustacchi {
1015eef4f27bSRobert Mustacchi     if(q_list->cnt < q_list->max_cnt)
1016eef4f27bSRobert Mustacchi     {
1017eef4f27bSRobert Mustacchi         *q_list->tail = q_entry;
1018eef4f27bSRobert Mustacchi         if(q_list->tail == q_list->last_entry_addr)
1019eef4f27bSRobert Mustacchi         {
1020eef4f27bSRobert Mustacchi             q_list->tail = q_list->first_entry_addr;
1021eef4f27bSRobert Mustacchi         }
1022eef4f27bSRobert Mustacchi         else
1023eef4f27bSRobert Mustacchi         {
1024eef4f27bSRobert Mustacchi             q_list->tail++;
1025eef4f27bSRobert Mustacchi         }
1026eef4f27bSRobert Mustacchi 
1027eef4f27bSRobert Mustacchi         q_list->cnt++;
1028eef4f27bSRobert Mustacchi     }
1029eef4f27bSRobert Mustacchi }
1030eef4f27bSRobert Mustacchi 
1031eef4f27bSRobert Mustacchi 
1032eef4f27bSRobert Mustacchi __inline
1033eef4f27bSRobert Mustacchi q_list_entry_t
q_list_pop_tail(q_list_t * q_list)1034eef4f27bSRobert Mustacchi q_list_pop_tail(
1035eef4f27bSRobert Mustacchi     q_list_t *q_list)
1036eef4f27bSRobert Mustacchi {
1037eef4f27bSRobert Mustacchi     q_list_entry_t q_entry;
1038eef4f27bSRobert Mustacchi 
1039eef4f27bSRobert Mustacchi     q_entry = q_list->cnt ?
1040eef4f27bSRobert Mustacchi         (q_list->tail == q_list->first_entry_addr ?
1041eef4f27bSRobert Mustacchi             *q_list->last_entry_addr : *(q_list->tail-1)) :
1042eef4f27bSRobert Mustacchi         (q_list_entry_t *) 0;
1043eef4f27bSRobert Mustacchi 
1044eef4f27bSRobert Mustacchi     if(q_list->cnt)
1045eef4f27bSRobert Mustacchi     {
1046eef4f27bSRobert Mustacchi         if(q_list->tail == q_list->first_entry_addr)
1047eef4f27bSRobert Mustacchi         {
1048eef4f27bSRobert Mustacchi             q_list->tail = q_list->last_entry_addr;
1049eef4f27bSRobert Mustacchi         }
1050eef4f27bSRobert Mustacchi         else
1051eef4f27bSRobert Mustacchi         {
1052eef4f27bSRobert Mustacchi             q_list->tail--;
1053eef4f27bSRobert Mustacchi         }
1054eef4f27bSRobert Mustacchi 
1055eef4f27bSRobert Mustacchi         q_list->cnt--;
1056eef4f27bSRobert Mustacchi     }
1057eef4f27bSRobert Mustacchi 
1058eef4f27bSRobert Mustacchi     return q_entry;
1059eef4f27bSRobert Mustacchi }
1060eef4f27bSRobert Mustacchi 
1061eef4f27bSRobert Mustacchi 
1062eef4f27bSRobert Mustacchi __inline
1063eef4f27bSRobert Mustacchi q_list_entry_t
q_list_peek_head(q_list_t * q_list)1064eef4f27bSRobert Mustacchi q_list_peek_head(
1065eef4f27bSRobert Mustacchi     q_list_t *q_list)
1066eef4f27bSRobert Mustacchi {
1067eef4f27bSRobert Mustacchi     q_list_entry_t q_entry;
1068eef4f27bSRobert Mustacchi 
1069eef4f27bSRobert Mustacchi     q_entry = q_list->cnt ? *q_list->head : (q_list_entry_t *) 0;
1070eef4f27bSRobert Mustacchi 
1071eef4f27bSRobert Mustacchi     return q_entry;
1072eef4f27bSRobert Mustacchi }
1073eef4f27bSRobert Mustacchi 
1074eef4f27bSRobert Mustacchi 
1075eef4f27bSRobert Mustacchi __inline
1076eef4f27bSRobert Mustacchi q_list_entry_t
q_list_peek_tail(q_list_t * q_list)1077eef4f27bSRobert Mustacchi q_list_peek_tail(
1078eef4f27bSRobert Mustacchi     q_list_t *q_list)
1079eef4f27bSRobert Mustacchi {
1080eef4f27bSRobert Mustacchi     q_list_entry_t q_entry;
1081eef4f27bSRobert Mustacchi 
1082eef4f27bSRobert Mustacchi     q_entry = q_list->cnt ?
1083eef4f27bSRobert Mustacchi         (q_list->tail == q_list->first_entry_addr ?
1084eef4f27bSRobert Mustacchi             *q_list->last_entry_addr : *(q_list->tail - 1)) :
1085eef4f27bSRobert Mustacchi         (q_list_entry_t *) 0;
1086eef4f27bSRobert Mustacchi 
1087eef4f27bSRobert Mustacchi     return q_entry;
1088eef4f27bSRobert Mustacchi }
1089eef4f27bSRobert Mustacchi 
1090eef4f27bSRobert Mustacchi 
1091eef4f27bSRobert Mustacchi __inline
1092eef4f27bSRobert Mustacchi unsigned long
q_list_entry_cnt(q_list_t * q_list)1093eef4f27bSRobert Mustacchi q_list_entry_cnt(
1094eef4f27bSRobert Mustacchi     q_list_t *q_list)
1095eef4f27bSRobert Mustacchi {
1096eef4f27bSRobert Mustacchi     return q_list->cnt;
1097eef4f27bSRobert Mustacchi }
1098eef4f27bSRobert Mustacchi 
1099eef4f27bSRobert Mustacchi 
1100eef4f27bSRobert Mustacchi __inline
1101eef4f27bSRobert Mustacchi char
q_list_is_empty(q_list_t * q_list)1102eef4f27bSRobert Mustacchi q_list_is_empty(
1103eef4f27bSRobert Mustacchi     q_list_t *q_list)
1104eef4f27bSRobert Mustacchi {
1105eef4f27bSRobert Mustacchi     return q_list->cnt == 0;
1106eef4f27bSRobert Mustacchi }
1107eef4f27bSRobert Mustacchi 
1108eef4f27bSRobert Mustacchi 
1109eef4f27bSRobert Mustacchi __inline
1110eef4f27bSRobert Mustacchi char
q_list_is_full(q_list_t * q_list)1111eef4f27bSRobert Mustacchi q_list_is_full(
1112eef4f27bSRobert Mustacchi     q_list_t *q_list)
1113eef4f27bSRobert Mustacchi {
1114eef4f27bSRobert Mustacchi     return q_list->cnt == q_list->max_cnt;
1115eef4f27bSRobert Mustacchi }
1116eef4f27bSRobert Mustacchi 
1117eef4f27bSRobert Mustacchi 
1118eef4f27bSRobert Mustacchi #else
1119eef4f27bSRobert Mustacchi 
1120eef4f27bSRobert Mustacchi 
1121eef4f27bSRobert Mustacchi #define q_list_init(_q_list, _q_list_arr, _max_cnt) \
1122eef4f27bSRobert Mustacchi     (_q_list)->max_cnt = (_max_cnt); \
1123eef4f27bSRobert Mustacchi     (_q_list)->first_entry_addr = (_q_list_arr); \
1124eef4f27bSRobert Mustacchi     (_q_list)->last_entry_addr = (_q_list_arr) + ((_max_cnt) - 1); \
1125eef4f27bSRobert Mustacchi     (_q_list)->head = (_q_list)->first_entry_addr; \
1126eef4f27bSRobert Mustacchi     (_q_list)->tail = (_q_list)->first_entry_addr; \
1127eef4f27bSRobert Mustacchi     (_q_list)->cnt = 0
1128eef4f27bSRobert Mustacchi 
1129eef4f27bSRobert Mustacchi 
1130eef4f27bSRobert Mustacchi #define q_list_clear(_q_list) \
1131eef4f27bSRobert Mustacchi     (_q_list)->head = (_q_list)->first_entry_addr; \
1132eef4f27bSRobert Mustacchi     (_q_list)->tail = (_q_list)->first_entry_addr; \
1133eef4f27bSRobert Mustacchi     (_q_list)->cnt = 0
1134eef4f27bSRobert Mustacchi 
1135eef4f27bSRobert Mustacchi 
1136eef4f27bSRobert Mustacchi #define q_list_push_head(_q_list, _q_entry) \
1137eef4f27bSRobert Mustacchi     if((_q_list)->cnt < (_q_list)->max_cnt) \
1138eef4f27bSRobert Mustacchi     { \
1139eef4f27bSRobert Mustacchi         if((_q_list)->head == (_q_list)->first_entry_addr) \
1140eef4f27bSRobert Mustacchi         { \
1141eef4f27bSRobert Mustacchi             (_q_list)->head = (_q_list)->last_entry_addr; \
1142eef4f27bSRobert Mustacchi         } \
1143eef4f27bSRobert Mustacchi         else \
1144eef4f27bSRobert Mustacchi         { \
1145eef4f27bSRobert Mustacchi             (_q_list)->head--; \
1146eef4f27bSRobert Mustacchi         } \
1147eef4f27bSRobert Mustacchi         *((_q_list)->head) = (_q_entry); \
1148eef4f27bSRobert Mustacchi         (_q_list)->cnt++; \
1149eef4f27bSRobert Mustacchi     }
1150eef4f27bSRobert Mustacchi 
1151eef4f27bSRobert Mustacchi 
1152eef4f27bSRobert Mustacchi #define q_list_pop_head(_q_list) \
1153eef4f27bSRobert Mustacchi     (_q_list)->cnt ? *(_q_list)->head : (q_list_entry_t *) 0; \
1154eef4f27bSRobert Mustacchi     if((_q_list)->cnt) \
1155eef4f27bSRobert Mustacchi     { \
1156eef4f27bSRobert Mustacchi         if((_q_list)->head == (_q_list)->last_entry_addr) \
1157eef4f27bSRobert Mustacchi         { \
1158eef4f27bSRobert Mustacchi             (_q_list)->head = (_q_list)->first_entry_addr; \
1159eef4f27bSRobert Mustacchi         } \
1160eef4f27bSRobert Mustacchi         else \
1161eef4f27bSRobert Mustacchi         { \
1162eef4f27bSRobert Mustacchi             (_q_list)->head++; \
1163eef4f27bSRobert Mustacchi         } \
1164eef4f27bSRobert Mustacchi         (_q_list)->cnt--; \
1165eef4f27bSRobert Mustacchi     }
1166eef4f27bSRobert Mustacchi 
1167eef4f27bSRobert Mustacchi 
1168eef4f27bSRobert Mustacchi #define q_list_push_tail(_q_list, _q_entry) \
1169eef4f27bSRobert Mustacchi     if((_q_list)->cnt < (_q_list)->max_cnt) \
1170eef4f27bSRobert Mustacchi     { \
1171eef4f27bSRobert Mustacchi         *(_q_list)->tail = (_q_entry); \
1172eef4f27bSRobert Mustacchi         if((_q_list)->tail == (_q_list)->last_entry_addr) \
1173eef4f27bSRobert Mustacchi         { \
1174eef4f27bSRobert Mustacchi             (_q_list)->tail = (_q_list)->first_entry_addr; \
1175eef4f27bSRobert Mustacchi         } \
1176eef4f27bSRobert Mustacchi         else \
1177eef4f27bSRobert Mustacchi         { \
1178eef4f27bSRobert Mustacchi             (_q_list)->tail++; \
1179eef4f27bSRobert Mustacchi         } \
1180eef4f27bSRobert Mustacchi         (_q_list)->cnt++; \
1181eef4f27bSRobert Mustacchi     }
1182eef4f27bSRobert Mustacchi 
1183eef4f27bSRobert Mustacchi 
1184eef4f27bSRobert Mustacchi #define q_list_pop_tail(_q_list) \
1185eef4f27bSRobert Mustacchi     (_q_list)->cnt ? ((_q_list)->tail == (_q_list)->first_entry_addr ? \
1186eef4f27bSRobert Mustacchi         *(_q_list)->last_entry_addr : *((_q_list)->tail-1)) : \
1187eef4f27bSRobert Mustacchi         (q_list_entry_t *) 0; \
1188eef4f27bSRobert Mustacchi     if((_q_list)->cnt) \
1189eef4f27bSRobert Mustacchi     { \
1190eef4f27bSRobert Mustacchi         if((_q_list)->tail == (_q_list)->first_entry_addr) \
1191eef4f27bSRobert Mustacchi         { \
1192eef4f27bSRobert Mustacchi             (_q_list)->tail = (_q_list)->last_entry_addr; \
1193eef4f27bSRobert Mustacchi         } \
1194eef4f27bSRobert Mustacchi         else \
1195eef4f27bSRobert Mustacchi         { \
1196eef4f27bSRobert Mustacchi             (_q_list)->tail--; \
1197eef4f27bSRobert Mustacchi         } \
1198eef4f27bSRobert Mustacchi         (_q_list)->cnt--; \
1199eef4f27bSRobert Mustacchi     } \
1200eef4f27bSRobert Mustacchi 
1201eef4f27bSRobert Mustacchi 
1202eef4f27bSRobert Mustacchi #define q_list_peek_head(_q_list) \
1203eef4f27bSRobert Mustacchi     ((_q_list)->cnt ? *(_q_list)->head : (q_list_entry_t *) 0)
1204eef4f27bSRobert Mustacchi 
1205eef4f27bSRobert Mustacchi 
1206eef4f27bSRobert Mustacchi #define q_list_peek_tail(_q_list) \
1207eef4f27bSRobert Mustacchi     ((_q_list)->cnt ? ((_q_list)->tail == (_q_list)->first_entry_addr ? \
1208eef4f27bSRobert Mustacchi         *(_q_list)->last_entry_addr : *((_q_list)->tail - 1)) : \
1209eef4f27bSRobert Mustacchi         (q_list_entry_t *) 0)
1210eef4f27bSRobert Mustacchi 
1211eef4f27bSRobert Mustacchi 
1212eef4f27bSRobert Mustacchi #define q_list_entry_cnt(_q_list)   ((_q_list)->cnt)
1213eef4f27bSRobert Mustacchi 
1214eef4f27bSRobert Mustacchi 
1215eef4f27bSRobert Mustacchi #define q_list_is_empty(_q_list)    ((_q_list)->cnt == 0)
1216eef4f27bSRobert Mustacchi 
1217eef4f27bSRobert Mustacchi 
1218eef4f27bSRobert Mustacchi #define q_list_is_full(_q_list)     ((_q_list)->cnt == (_q_list)->max_cnt)
1219eef4f27bSRobert Mustacchi 
1220eef4f27bSRobert Mustacchi 
1221eef4f27bSRobert Mustacchi #endif
1222eef4f27bSRobert Mustacchi 
1223eef4f27bSRobert Mustacchi 
1224eef4f27bSRobert Mustacchi 
1225eef4f27bSRobert Mustacchi 
1226eef4f27bSRobert Mustacchi #endif /* _listq_h_ */
1227eef4f27bSRobert Mustacchi 
1228