1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) Nginx, Inc.
5  */
6 
7 
8 #include <ngx_config.h>
9 #include <ngx_core.h>
10 
11 
12 #ifndef _NGX_QUEUE_H_INCLUDED_
13 #define _NGX_QUEUE_H_INCLUDED_
14 
15 
16 typedef struct ngx_queue_s  ngx_queue_t;
17 
18 struct ngx_queue_s {
19     ngx_queue_t  *prev;
20     ngx_queue_t  *next;
21 };
22 
23 
24 #define ngx_queue_init(q)                                                     \
25     (q)->prev = q;                                                            \
26     (q)->next = q
27 
28 
29 #define ngx_queue_empty(h)                                                    \
30     (h == (h)->prev)
31 
32 
33 #define ngx_queue_insert_head(h, x)                                           \
34     (x)->next = (h)->next;                                                    \
35     (x)->next->prev = x;                                                      \
36     (x)->prev = h;                                                            \
37     (h)->next = x
38 
39 
40 #define ngx_queue_insert_after   ngx_queue_insert_head
41 
42 
43 #define ngx_queue_insert_tail(h, x)                                           \
44     (x)->prev = (h)->prev;                                                    \
45     (x)->prev->next = x;                                                      \
46     (x)->next = h;                                                            \
47     (h)->prev = x
48 
49 
50 #define ngx_queue_head(h)                                                     \
51     (h)->next
52 
53 
54 #define ngx_queue_last(h)                                                     \
55     (h)->prev
56 
57 
58 #define ngx_queue_sentinel(h)                                                 \
59     (h)
60 
61 
62 #define ngx_queue_next(q)                                                     \
63     (q)->next
64 
65 
66 #define ngx_queue_prev(q)                                                     \
67     (q)->prev
68 
69 
70 #if (NGX_DEBUG)
71 
72 #define ngx_queue_remove(x)                                                   \
73     (x)->next->prev = (x)->prev;                                              \
74     (x)->prev->next = (x)->next;                                              \
75     (x)->prev = NULL;                                                         \
76     (x)->next = NULL
77 
78 #else
79 
80 #define ngx_queue_remove(x)                                                   \
81     (x)->next->prev = (x)->prev;                                              \
82     (x)->prev->next = (x)->next
83 
84 #endif
85 
86 
87 #define ngx_queue_split(h, q, n)                                              \
88     (n)->prev = (h)->prev;                                                    \
89     (n)->prev->next = n;                                                      \
90     (n)->next = q;                                                            \
91     (h)->prev = (q)->prev;                                                    \
92     (h)->prev->next = h;                                                      \
93     (q)->prev = n;
94 
95 
96 #define ngx_queue_add(h, n)                                                   \
97     (h)->prev->next = (n)->next;                                              \
98     (n)->next->prev = (h)->prev;                                              \
99     (h)->prev = (n)->prev;                                                    \
100     (h)->prev->next = h;
101 
102 
103 #define ngx_queue_data(q, type, link)                                         \
104     (type *) ((u_char *) q - offsetof(type, link))
105 
106 
107 ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue);
108 void ngx_queue_sort(ngx_queue_t *queue,
109     ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *));
110 
111 
112 #endif /* _NGX_QUEUE_H_INCLUDED_ */
113