浏览该文件的文档.
4 #define QMD_SAVELINK(name, link)
10 #define SLIST_HEAD(name, type) \
12 struct type *slh_first; \
15 #define SLIST_HEAD_INITIALIZER(head) \
18 #define SLIST_ENTRY(type) \
20 struct type *sle_next; \
26 #define SLIST_EMPTY(head) ((head)->slh_first == NULL)
28 #define SLIST_FIRST(head) ((head)->slh_first)
30 #define SLIST_FOREACH(var, head, field) \
31 for ((var) = SLIST_FIRST((head)); \
33 (var) = SLIST_NEXT((var), field))
35 #define SLIST_FOREACH_SAFE(var, head, field, tvar) \
36 for ((var) = SLIST_FIRST((head)); \
37 (var) && ((tvar) = SLIST_NEXT((var), field), 1); \
40 #define SLIST_FOREACH_PREVPTR(var, varp, head, field) \
41 for ((varp) = &SLIST_FIRST((head)); \
42 ((var) = *(varp)) != NULL; \
43 (varp) = &SLIST_NEXT((var), field))
45 #define SLIST_INIT(head) do { \
46 SLIST_FIRST((head)) = NULL; \
49 #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
50 SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \
51 SLIST_NEXT((slistelm), field) = (elm); \
54 #define SLIST_INSERT_HEAD(head, elm, field) do { \
55 SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \
56 SLIST_FIRST((head)) = (elm); \
59 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
61 #define SLIST_REMOVE(head, elm, type, field) do { \
62 QMD_SAVELINK(oldnext, (elm)->field.sle_next); \
63 if (SLIST_FIRST((head)) == (elm)) { \
64 SLIST_REMOVE_HEAD((head), field); \
67 struct type *curelm = SLIST_FIRST((head)); \
68 while (SLIST_NEXT(curelm, field) != (elm)) \
69 curelm = SLIST_NEXT(curelm, field); \
70 SLIST_REMOVE_AFTER(curelm, field); \
75 #define SLIST_REMOVE_AFTER(elm, field) do { \
76 SLIST_NEXT(elm, field) = \
77 SLIST_NEXT(SLIST_NEXT(elm, field), field); \
80 #define SLIST_REMOVE_HEAD(head, field) do { \
81 SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \
87 #define STAILQ_HEAD(name, type) \
89 struct type *stqh_first; \
90 struct type **stqh_last; \
93 #define STAILQ_HEAD_INITIALIZER(head) \
94 { NULL, &(head).stqh_first }
96 #define STAILQ_ENTRY(type) \
98 struct type *stqe_next; \
104 #define STAILQ_CONCAT(head1, head2) do { \
105 if (!STAILQ_EMPTY((head2))) { \
106 *(head1)->stqh_last = (head2)->stqh_first; \
107 (head1)->stqh_last = (head2)->stqh_last; \
108 STAILQ_INIT((head2)); \
112 #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL)
114 #define STAILQ_FIRST(head) ((head)->stqh_first)
116 #define STAILQ_FOREACH(var, head, field) \
117 for((var) = STAILQ_FIRST((head)); \
119 (var) = STAILQ_NEXT((var), field))
122 #define STAILQ_FOREACH_SAFE(var, head, field, tvar) \
123 for ((var) = STAILQ_FIRST((head)); \
124 (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \
127 #define STAILQ_INIT(head) do { \
128 STAILQ_FIRST((head)) = NULL; \
129 (head)->stqh_last = &STAILQ_FIRST((head)); \
132 #define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \
133 if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
134 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
135 STAILQ_NEXT((tqelm), field) = (elm); \
138 #define STAILQ_INSERT_HEAD(head, elm, field) do { \
139 if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \
140 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
141 STAILQ_FIRST((head)) = (elm); \
144 #define STAILQ_INSERT_TAIL(head, elm, field) do { \
145 STAILQ_NEXT((elm), field) = NULL; \
146 *(head)->stqh_last = (elm); \
147 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
150 #define STAILQ_LAST(head, type, field) \
151 (STAILQ_EMPTY((head)) ? \
153 ((struct type *)(void *) \
154 ((char *)((head)->stqh_last) - __offsetof(struct type, field))))
156 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
158 #define STAILQ_REMOVE(head, elm, type, field) do { \
159 QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \
160 if (STAILQ_FIRST((head)) == (elm)) { \
161 STAILQ_REMOVE_HEAD((head), field); \
164 struct type *curelm = STAILQ_FIRST((head)); \
165 while (STAILQ_NEXT(curelm, field) != (elm)) \
166 curelm = STAILQ_NEXT(curelm, field); \
167 STAILQ_REMOVE_AFTER(head, curelm, field); \
172 #define STAILQ_REMOVE_HEAD(head, field) do { \
173 if ((STAILQ_FIRST((head)) = \
174 STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \
175 (head)->stqh_last = &STAILQ_FIRST((head)); \
178 #define STAILQ_REMOVE_AFTER(head, elm, field) do { \
179 if ((STAILQ_NEXT(elm, field) = \
180 STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \
181 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
184 #define STAILQ_SWAP(head1, head2, type) do { \
185 struct type *swap_first = STAILQ_FIRST(head1); \
186 struct type **swap_last = (head1)->stqh_last; \
187 STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \
188 (head1)->stqh_last = (head2)->stqh_last; \
189 STAILQ_FIRST(head2) = swap_first; \
190 (head2)->stqh_last = swap_last; \
191 if (STAILQ_EMPTY(head1)) \
192 (head1)->stqh_last = &STAILQ_FIRST(head1); \
193 if (STAILQ_EMPTY(head2)) \
194 (head2)->stqh_last = &STAILQ_FIRST(head2); \
197 #define STAILQ_INSERT_CHAIN_HEAD(head, elm_chead, elm_ctail, field) do { \
198 if ((STAILQ_NEXT(elm_ctail, field) = STAILQ_FIRST(head)) == NULL ) { \
199 (head)->stqh_last = &STAILQ_NEXT(elm_ctail, field); \
201 STAILQ_FIRST(head) = (elm_chead); \