305 if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) \
306 == NULL) \
307 (head)->stqh_last = &(head)->stqh_first; \
308 _NOTE(CONSTCOND) \
309 } while (0)
310
311 #define STAILQ_REMOVE(head, elm, type, field) do { \
312 if ((head)->stqh_first == (elm)) { \
313 STAILQ_REMOVE_HEAD((head), field); \
314 } else { \
315 struct type *curelm = (head)->stqh_first; \
316 while (curelm->field.stqe_next != (elm)) \
317 curelm = curelm->field.stqe_next; \
318 if ((curelm->field.stqe_next = \
319 curelm->field.stqe_next->field.stqe_next) == NULL) \
320 (head)->stqh_last = &(curelm)->field.stqe_next; \
321 } \
322 _NOTE(CONSTCOND) \
323 } while (0)
324
325 #define STAILQ_FOREACH(var, head, field) \
326 for ((var) = ((head)->stqh_first); \
327 (var); \
328 (var) = ((var)->field.stqe_next))
329
330 /*
331 * Singly-linked Tail queue access methods.
332 */
333 #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL)
334 #define STAILQ_FIRST(head) ((head)->stqh_first)
335 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
336
337
338 /*
339 * Simple queue definitions.
340 */
341 #define SIMPLEQ_HEAD(name, type) \
342 struct name { \
343 struct type *sqh_first; /* first element */ \
344 struct type **sqh_last; /* addr of last next element */ \
345 }
346
347 #define SIMPLEQ_HEAD_INITIALIZER(head) \
348 { NULL, &(head).sqh_first }
349
350 #define SIMPLEQ_ENTRY(type) \
351 struct { \
352 struct type *sqe_next; /* next element */ \
353 }
354
355 /*
356 * Simple queue functions.
357 */
|
305 if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) \
306 == NULL) \
307 (head)->stqh_last = &(head)->stqh_first; \
308 _NOTE(CONSTCOND) \
309 } while (0)
310
311 #define STAILQ_REMOVE(head, elm, type, field) do { \
312 if ((head)->stqh_first == (elm)) { \
313 STAILQ_REMOVE_HEAD((head), field); \
314 } else { \
315 struct type *curelm = (head)->stqh_first; \
316 while (curelm->field.stqe_next != (elm)) \
317 curelm = curelm->field.stqe_next; \
318 if ((curelm->field.stqe_next = \
319 curelm->field.stqe_next->field.stqe_next) == NULL) \
320 (head)->stqh_last = &(curelm)->field.stqe_next; \
321 } \
322 _NOTE(CONSTCOND) \
323 } while (0)
324
325 /*
326 * Singly-linked Tail queue access methods.
327 */
328 #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL)
329 #define STAILQ_FIRST(head) ((head)->stqh_first)
330 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
331
332 #define STAILQ_FOREACH(var, head, field) \
333 for ((var) = ((head)->stqh_first); \
334 (var); \
335 (var) = ((var)->field.stqe_next))
336
337 #define STAILQ_FOREACH_SAFE(var, head, field, tvar) \
338 for ((var) = STAILQ_FIRST((head)); \
339 (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \
340 (var) = (tvar))
341
342
343 /*
344 * Simple queue definitions.
345 */
346 #define SIMPLEQ_HEAD(name, type) \
347 struct name { \
348 struct type *sqh_first; /* first element */ \
349 struct type **sqh_last; /* addr of last next element */ \
350 }
351
352 #define SIMPLEQ_HEAD_INITIALIZER(head) \
353 { NULL, &(head).sqh_first }
354
355 #define SIMPLEQ_ENTRY(type) \
356 struct { \
357 struct type *sqe_next; /* next element */ \
358 }
359
360 /*
361 * Simple queue functions.
362 */
|