00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef _SYS_QUEUE_H_
00039 #define _SYS_QUEUE_H_
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 #define QUEUE_MACRO_DEBUG 0
00105 #if QUEUE_MACRO_DEBUG
00106
00107 struct qm_trace {
00108 char * lastfile;
00109 int lastline;
00110 char * prevfile;
00111 int prevline;
00112 };
00113
00114 #define TRACEBUF struct qm_trace trace;
00115 #define TRASHIT(x) do {(x) = (void *)-1;} while (0)
00116
00117 #define QMD_TRACE_HEAD(head) do { \
00118 (head)->trace.prevline = (head)->trace.lastline; \
00119 (head)->trace.prevfile = (head)->trace.lastfile; \
00120 (head)->trace.lastline = __LINE__; \
00121 (head)->trace.lastfile = __FILE__; \
00122 } while (0)
00123
00124 #define QMD_TRACE_ELEM(elem) do { \
00125 (elem)->trace.prevline = (elem)->trace.lastline; \
00126 (elem)->trace.prevfile = (elem)->trace.lastfile; \
00127 (elem)->trace.lastline = __LINE__; \
00128 (elem)->trace.lastfile = __FILE__; \
00129 } while (0)
00130
00131 #else
00132 #define QMD_TRACE_ELEM(elem)
00133 #define QMD_TRACE_HEAD(head)
00134 #define TRACEBUF
00135 #define TRASHIT(x)
00136 #endif
00137
00138
00139
00140
00141 #define SLIST_HEAD(name, type) \
00142 struct name { \
00143 struct type *slh_first; \
00144 }
00145
00146 #define SLIST_HEAD_INITIALIZER(head) \
00147 { NULL }
00148
00149 #define SLIST_ENTRY(type) \
00150 struct { \
00151 struct type *sle_next; \
00152 }
00153
00154
00155
00156
00157 #define SLIST_EMPTY(head) ((head)->slh_first == NULL)
00158
00159 #define SLIST_FIRST(head) ((head)->slh_first)
00160
00161 #define SLIST_FOREACH(var, head, field) \
00162 for ((var) = SLIST_FIRST((head)); \
00163 (var); \
00164 (var) = SLIST_NEXT((var), field))
00165
00166 #define SLIST_FOREACH_PREVPTR(var, varp, head, field) \
00167 for ((varp) = &SLIST_FIRST((head)); \
00168 ((var) = *(varp)) != NULL; \
00169 (varp) = &SLIST_NEXT((var), field))
00170
00171 #define SLIST_INIT(head) do { \
00172 SLIST_FIRST((head)) = NULL; \
00173 } while (0)
00174
00175 #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
00176 SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \
00177 SLIST_NEXT((slistelm), field) = (elm); \
00178 } while (0)
00179
00180 #define SLIST_INSERT_HEAD(head, elm, field) do { \
00181 SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \
00182 SLIST_FIRST((head)) = (elm); \
00183 } while (0)
00184
00185 #define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
00186
00187 #define SLIST_REMOVE(head, elm, type, field) do { \
00188 if (SLIST_FIRST((head)) == (elm)) { \
00189 SLIST_REMOVE_HEAD((head), field); \
00190 } \
00191 else { \
00192 struct type *curelm = SLIST_FIRST((head)); \
00193 while (SLIST_NEXT(curelm, field) != (elm)) \
00194 curelm = SLIST_NEXT(curelm, field); \
00195 SLIST_NEXT(curelm, field) = \
00196 SLIST_NEXT(SLIST_NEXT(curelm, field), field); \
00197 } \
00198 } while (0)
00199
00200 #define SLIST_REMOVE_HEAD(head, field) do { \
00201 SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \
00202 } while (0)
00203
00204
00205
00206
00207 #define STAILQ_HEAD(name, type) \
00208 struct name { \
00209 struct type *stqh_first; \
00210 struct type **stqh_last; \
00211 }
00212
00213 #define STAILQ_HEAD_INITIALIZER(head) \
00214 { NULL, &(head).stqh_first }
00215
00216 #define STAILQ_ENTRY(type) \
00217 struct { \
00218 struct type *stqe_next; \
00219 }
00220
00221
00222
00223
00224 #define STAILQ_CONCAT(head1, head2) do { \
00225 if (!STAILQ_EMPTY((head2))) { \
00226 *(head1)->stqh_last = (head2)->stqh_first; \
00227 (head1)->stqh_last = (head2)->stqh_last; \
00228 STAILQ_INIT((head2)); \
00229 } \
00230 } while (0)
00231
00232 #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL)
00233
00234 #define STAILQ_FIRST(head) ((head)->stqh_first)
00235
00236 #define STAILQ_FOREACH(var, head, field) \
00237 for((var) = STAILQ_FIRST((head)); \
00238 (var); \
00239 (var) = STAILQ_NEXT((var), field))
00240
00241 #define STAILQ_INIT(head) do { \
00242 STAILQ_FIRST((head)) = NULL; \
00243 (head)->stqh_last = &STAILQ_FIRST((head)); \
00244 } while (0)
00245
00246 #define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \
00247 if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
00248 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
00249 STAILQ_NEXT((tqelm), field) = (elm); \
00250 } while (0)
00251
00252 #define STAILQ_INSERT_HEAD(head, elm, field) do { \
00253 if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \
00254 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
00255 STAILQ_FIRST((head)) = (elm); \
00256 } while (0)
00257
00258 #define STAILQ_INSERT_TAIL(head, elm, field) do { \
00259 STAILQ_NEXT((elm), field) = NULL; \
00260 *(head)->stqh_last = (elm); \
00261 (head)->stqh_last = &STAILQ_NEXT((elm), field); \
00262 } while (0)
00263
00264 #define STAILQ_LAST(head, type, field) \
00265 (STAILQ_EMPTY((head)) ? \
00266 NULL : \
00267 ((struct type *) \
00268 ((char *)((head)->stqh_last) - __offsetof(struct type, field))))
00269
00270 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
00271
00272 #define STAILQ_REMOVE(head, elm, type, field) do { \
00273 if (STAILQ_FIRST((head)) == (elm)) { \
00274 STAILQ_REMOVE_HEAD((head), field); \
00275 } \
00276 else { \
00277 struct type *curelm = STAILQ_FIRST((head)); \
00278 while (STAILQ_NEXT(curelm, field) != (elm)) \
00279 curelm = STAILQ_NEXT(curelm, field); \
00280 if ((STAILQ_NEXT(curelm, field) = \
00281 STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\
00282 (head)->stqh_last = &STAILQ_NEXT((curelm), field);\
00283 } \
00284 } while (0)
00285
00286 #define STAILQ_REMOVE_HEAD(head, field) do { \
00287 if ((STAILQ_FIRST((head)) = \
00288 STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \
00289 (head)->stqh_last = &STAILQ_FIRST((head)); \
00290 } while (0)
00291
00292 #define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \
00293 if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \
00294 (head)->stqh_last = &STAILQ_FIRST((head)); \
00295 } while (0)
00296
00297
00298
00299
00300 #define ATH_LIST_HEAD(name, type) \
00301 struct name { \
00302 struct type *lh_first; \
00303 }
00304
00305 #define LIST_HEAD_INITIALIZER(head) \
00306 { NULL }
00307
00308 #define LIST_ENTRY(type) \
00309 struct { \
00310 struct type *le_next; \
00311 struct type **le_prev; \
00312 }
00313
00314
00315
00316
00317
00318 #define LIST_EMPTY(head) ((head)->lh_first == NULL)
00319
00320 #define LIST_FIRST(head) ((head)->lh_first)
00321
00322 #define LIST_FOREACH(var, head, field) \
00323 for ((var) = LIST_FIRST((head)); \
00324 (var); \
00325 (var) = LIST_NEXT((var), field))
00326
00327 #define LIST_INIT(head) do { \
00328 LIST_FIRST((head)) = NULL; \
00329 } while (0)
00330
00331 #define LIST_INSERT_AFTER(listelm, elm, field) do { \
00332 if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\
00333 LIST_NEXT((listelm), field)->field.le_prev = \
00334 &LIST_NEXT((elm), field); \
00335 LIST_NEXT((listelm), field) = (elm); \
00336 (elm)->field.le_prev = &LIST_NEXT((listelm), field); \
00337 } while (0)
00338
00339 #define LIST_INSERT_BEFORE(listelm, elm, field) do { \
00340 (elm)->field.le_prev = (listelm)->field.le_prev; \
00341 LIST_NEXT((elm), field) = (listelm); \
00342 *(listelm)->field.le_prev = (elm); \
00343 (listelm)->field.le_prev = &LIST_NEXT((elm), field); \
00344 } while (0)
00345
00346 #define LIST_INSERT_HEAD(head, elm, field) do { \
00347 if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \
00348 LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\
00349 LIST_FIRST((head)) = (elm); \
00350 (elm)->field.le_prev = &LIST_FIRST((head)); \
00351 } while (0)
00352
00353 #define LIST_NEXT(elm, field) ((elm)->field.le_next)
00354
00355 #define LIST_REMOVE(elm, field) do { \
00356 if (LIST_NEXT((elm), field) != NULL) \
00357 LIST_NEXT((elm), field)->field.le_prev = \
00358 (elm)->field.le_prev; \
00359 *(elm)->field.le_prev = LIST_NEXT((elm), field); \
00360 } while (0)
00361
00362
00363
00364
00365 #define TAILQ_HEAD(name, type) \
00366 struct name { \
00367 struct type *tqh_first; \
00368 struct type **tqh_last; \
00369 TRACEBUF \
00370 }
00371
00372 #define TAILQ_HEAD_INITIALIZER(head) \
00373 { NULL, &(head).tqh_first }
00374
00375 #define TAILQ_ENTRY(type) \
00376 struct { \
00377 struct type *tqe_next; \
00378 struct type **tqe_prev; \
00379 TRACEBUF \
00380 }
00381
00382
00383
00384
00385 #define TAILQ_CONCAT(head1, head2, field) do { \
00386 if (!TAILQ_EMPTY(head2)) { \
00387 *(head1)->tqh_last = (head2)->tqh_first; \
00388 (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
00389 (head1)->tqh_last = (head2)->tqh_last; \
00390 TAILQ_INIT((head2)); \
00391 QMD_TRACE_HEAD(head); \
00392 QMD_TRACE_HEAD(head2); \
00393 } \
00394 } while (0)
00395
00396 #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL)
00397
00398 #define TAILQ_FIRST(head) ((head)->tqh_first)
00399
00400 #define TAILQ_FOREACH(var, head, field) \
00401 for ((var) = TAILQ_FIRST((head)); \
00402 (var); \
00403 (var) = TAILQ_NEXT((var), field))
00404
00405 #define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
00406 for ((var) = TAILQ_FIRST((head)); \
00407 (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
00408 (var) = (tvar))
00409
00410 #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \
00411 for ((var) = TAILQ_LAST((head), headname); \
00412 (var); \
00413 (var) = TAILQ_PREV((var), headname, field))
00414
00415 #define TAILQ_INIT(head) do { \
00416 TAILQ_FIRST((head)) = NULL; \
00417 (head)->tqh_last = &TAILQ_FIRST((head)); \
00418 QMD_TRACE_HEAD(head); \
00419 } while (0)
00420
00421 #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
00422 if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\
00423 TAILQ_NEXT((elm), field)->field.tqe_prev = \
00424 &TAILQ_NEXT((elm), field); \
00425 else { \
00426 (head)->tqh_last = &TAILQ_NEXT((elm), field); \
00427 QMD_TRACE_HEAD(head); \
00428 } \
00429 TAILQ_NEXT((listelm), field) = (elm); \
00430 (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \
00431 QMD_TRACE_ELEM(&(elm)->field); \
00432 QMD_TRACE_ELEM(&listelm->field); \
00433 } while (0)
00434
00435 #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \
00436 (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
00437 TAILQ_NEXT((elm), field) = (listelm); \
00438 *(listelm)->field.tqe_prev = (elm); \
00439 (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \
00440 QMD_TRACE_ELEM(&(elm)->field); \
00441 QMD_TRACE_ELEM(&listelm->field); \
00442 } while (0)
00443
00444 #define TAILQ_INSERT_HEAD(head, elm, field) do { \
00445 if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \
00446 TAILQ_FIRST((head))->field.tqe_prev = \
00447 &TAILQ_NEXT((elm), field); \
00448 else \
00449 (head)->tqh_last = &TAILQ_NEXT((elm), field); \
00450 TAILQ_FIRST((head)) = (elm); \
00451 (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \
00452 QMD_TRACE_HEAD(head); \
00453 QMD_TRACE_ELEM(&(elm)->field); \
00454 } while (0)
00455
00456 #define TAILQ_INSERT_TAIL(head, elm, field) do { \
00457 TAILQ_NEXT((elm), field) = NULL; \
00458 (elm)->field.tqe_prev = (head)->tqh_last; \
00459 *(head)->tqh_last = (elm); \
00460 (head)->tqh_last = &TAILQ_NEXT((elm), field); \
00461 QMD_TRACE_HEAD(head); \
00462 QMD_TRACE_ELEM(&(elm)->field); \
00463 } while (0)
00464
00465 #define TAILQ_LAST(head, headname) \
00466 (*(((struct headname *)((head)->tqh_last))->tqh_last))
00467
00468 #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
00469
00470 #define TAILQ_PREV(elm, headname, field) \
00471 (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
00472
00473 #define TAILQ_REMOVE(head, elm, field) do { \
00474 if ((TAILQ_NEXT((elm), field)) != NULL) \
00475 TAILQ_NEXT((elm), field)->field.tqe_prev = \
00476 (elm)->field.tqe_prev; \
00477 else { \
00478 (head)->tqh_last = (elm)->field.tqe_prev; \
00479 QMD_TRACE_HEAD(head); \
00480 } \
00481 *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \
00482 TRASHIT((elm)->field.tqe_next); \
00483 TRASHIT((elm)->field.tqe_prev); \
00484 QMD_TRACE_ELEM(&(elm)->field); \
00485 } while (0)
00486
00487
00488 #ifdef _KERNEL
00489
00490
00491
00492
00493
00494
00495 struct quehead {
00496 struct quehead *qh_link;
00497 struct quehead *qh_rlink;
00498 };
00499
00500 #ifdef __GNUC__
00501
00502 static __inline void
00503 insque(void *a, void *b)
00504 {
00505 struct quehead *element = (struct quehead *)a,
00506 *head = (struct quehead *)b;
00507
00508 element->qh_link = head->qh_link;
00509 element->qh_rlink = head;
00510 head->qh_link = element;
00511 element->qh_link->qh_rlink = element;
00512 }
00513
00514 static __inline void
00515 remque(void *a)
00516 {
00517 struct quehead *element = (struct quehead *)a;
00518
00519 element->qh_link->qh_rlink = element->qh_rlink;
00520 element->qh_rlink->qh_link = element->qh_link;
00521 element->qh_rlink = 0;
00522 }
00523
00524 #else
00525
00526 void insque(void *a, void *b);
00527 void remque(void *a);
00528
00529 #endif
00530
00531 #endif
00532
00533 #endif