Module Name: src Committed By: mschuett Date: Mon Apr 20 09:56:08 UTC 2009
Modified Files: src/share/man/man3: queue.3 src/sys/dev/ieee1394: fw_port.h src/sys/sys: queue.h src/usr.sbin/syslogd: syslogd.h Log Message: Add queue macros SLIST_FOREACH_SAFE, STAILQ_FOREACH_SAFE, STAILQ_LAST, SIMPLEQ_CONCAT, and SIMPLEQ_LAST. Remove seperate definitions outside of queue.h. To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 src/share/man/man3/queue.3 cvs rdiff -u -r1.31 -r1.32 src/sys/dev/ieee1394/fw_port.h cvs rdiff -u -r1.51 -r1.52 src/sys/sys/queue.h cvs rdiff -u -r1.2 -r1.3 src/usr.sbin/syslogd/syslogd.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/share/man/man3/queue.3 diff -u src/share/man/man3/queue.3:1.41 src/share/man/man3/queue.3:1.42 --- src/share/man/man3/queue.3:1.41 Wed Mar 11 08:29:56 2009 +++ src/share/man/man3/queue.3 Mon Apr 20 09:56:07 2009 @@ -1,4 +1,4 @@ -.\" $NetBSD: queue.3,v 1.41 2009/03/11 08:29:56 wiz Exp $ +.\" $NetBSD: queue.3,v 1.42 2009/04/20 09:56:07 mschuett Exp $ .\" .\" Copyright (c) 2000, 2002 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -66,6 +66,7 @@ .Nm SLIST_REMOVE_HEAD , .Nm SLIST_REMOVE , .Nm SLIST_FOREACH , +.Nm SLIST_FOREACH_SAFE , .Nm SLIST_EMPTY , .Nm SLIST_FIRST , .Nm SLIST_NEXT , @@ -83,6 +84,8 @@ .Nm SIMPLEQ_EMPTY , .Nm SIMPLEQ_FIRST , .Nm SIMPLEQ_NEXT , +.Nm SIMPLEQ_LAST , +.Nm SIMPLEQ_CONCAT , .Nm STAILQ_HEAD , .Nm STAILQ_HEAD_INITIALIZER , .Nm STAILQ_ENTRY , @@ -93,9 +96,11 @@ .Nm STAILQ_REMOVE_HEAD , .Nm STAILQ_REMOVE , .Nm STAILQ_FOREACH , +.Nm STAILQ_FOREACH_SAFE , .Nm STAILQ_EMPTY , .Nm STAILQ_FIRST , .Nm STAILQ_NEXT , +.Nm STAILQ_LAST , .Nm STAILQ_CONCAT , .Nm LIST_HEAD , .Nm LIST_HEAD_INITIALIZER , @@ -159,6 +164,7 @@ .Fn SLIST_REMOVE_HEAD "SLIST_HEAD *head" "SLIST_ENTRY NAME" .Fn SLIST_REMOVE "SLIST_HEAD *head" "TYPE *elm" "TYPE" "SLIST_ENTRY NAME" .Fn SLIST_FOREACH "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME" +.Fn SLIST_FOREACH_SAFE "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME" "TYPE *tmp" .Ft int .Fn SLIST_EMPTY "SLIST_HEAD *head" .Ft TYPE * @@ -183,6 +189,9 @@ .Fn SIMPLEQ_FIRST "SIMPLEQ_HEAD *head" .Ft TYPE * .Fn SIMPLEQ_NEXT "TYPE *elm" "SIMPLEQ_ENTRY NAME" +.Ft TYPE * +.Fn SIMPLEQ_LAST "SIMPLEQ_HEAD *head" "TYPE *elm" "SIMPLEQ_ENTRY NAME" +.Fn SIMPLEQ_CONCAT "SIMPLEQ_HEAD *head1" "SIMPLEQ_HEAD *head2" .sp .Fn STAILQ_HEAD "HEADNAME" "TYPE" .Fn STAILQ_HEAD_INITIALIZER "head" @@ -194,12 +203,15 @@ .Fn STAILQ_REMOVE_HEAD "STAILQ_HEAD *head" "STAILQ_ENTRY NAME" .Fn STAILQ_REMOVE "STAILQ_HEAD *head" "TYPE *elm" "TYPE" "STAILQ_ENTRY NAME" .Fn STAILQ_FOREACH "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME" +.Fn STAILQ_FOREACH_SAFE "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME" "TYPE *tmp" .Ft int .Fn STAILQ_EMPTY "STAILQ_HEAD *head" .Ft TYPE * .Fn STAILQ_FIRST "STAILQ_HEAD *head" .Ft TYPE * .Fn STAILQ_NEXT "TYPE *elm" "STAILQ_ENTRY NAME" +.Ft TYPE * +.Fn STAILQ_LAST "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME" .Fn STAILQ_CONCAT "STAILQ_HEAD *head1" "STAILQ_HEAD *head2" .sp .Fn LIST_HEAD "HEADNAME" "TYPE" @@ -414,14 +426,14 @@ _INSERT_BEFORE:-:+:-:-:+:+ _INSERT_HEAD:+:+:+:+:+:+ _INSERT_TAIL:-:-:+:+:+:+ -_LAST:-:-:-:-:+:+ +_LAST:-:-:-:+:+:+ _LOOP_NEXT:-:-:-:-:-:+ _LOOP_PREV:-:-:-:-:-:+ _NEXT:+:+:+:+:+:+ _PREV:-:-:-:-:+:+ _REMOVE:+:+:+:+:+:+ _REMOVE_HEAD:+:-:+:+:-:- -_CONCAT:-:-:-:+:+:- +_CONCAT:-:-:+:+:+:- .TE .Sh SINGLY-LINKED LISTS A singly-linked list is headed by a structure defined by the @@ -482,6 +494,12 @@ turn to .Fa var . .Pp +The SAFE versions uses +.Fa tmp +to hold the next element, so +.Fa var +may be freed or removed from the list. +.Pp The macro .Nm SLIST_INIT initializes the list referenced by @@ -672,6 +690,20 @@ returns the element after the element .Fa elm . .Pp +The macro +.Nm SIMPLEQ_LAST +returns the last item on the tail queue. +If the tail queue is empty the return value is +.Dv NULL . +.Pp +The macro +.Nm SIMPLEQ_CONCAT +concatenates the tail queue headed by +.Fa head2 +onto the end of the one headed by +.Fa head1 +removing all entries from the former. +.Pp The macros prefixed with .Dq Nm STAILQ_ .Nm ( STAILQ_HEAD , @@ -684,10 +716,13 @@ .Nm STAILQ_REMOVE_HEAD , .Nm STAILQ_REMOVE , .Nm STAILQ_FOREACH , +.Nm STAILQ_FOREACH_SAFE , .Nm STAILQ_EMPTY , .Nm STAILQ_FIRST , +.Nm STAILQ_NEXT , +.Nm STAILQ_LAST , and -.Nm STAILQ_NEXT ) +.Nm STAILQ_CONCAT ) are functionally identical to these simple queue functions, and are provided for compatibility with .Fx . Index: src/sys/dev/ieee1394/fw_port.h diff -u src/sys/dev/ieee1394/fw_port.h:1.31 src/sys/dev/ieee1394/fw_port.h:1.32 --- src/sys/dev/ieee1394/fw_port.h:1.31 Wed Mar 18 16:00:18 2009 +++ src/sys/dev/ieee1394/fw_port.h Mon Apr 20 09:56:07 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: fw_port.h,v 1.31 2009/03/18 16:00:18 cegger Exp $ */ +/* $NetBSD: fw_port.h,v 1.32 2009/04/20 09:56:07 mschuett Exp $ */ /* * Copyright (c) 2004 KIYOHARA Takashi * All rights reserved. @@ -1313,19 +1313,6 @@ #define rounddown(x, y) ((x) / (y) * (y)) #endif - -/* - * additional queue macros for NetBSD - */ -#define STAILQ_LAST(head, type, field) \ - (STAILQ_EMPTY((head)) ? (struct type *)NULL : \ - (struct type *) \ - ((char *)(head)->stqh_last - (size_t)&((struct type *)0)->field)) -#define STAILQ_FOREACH_SAFE(var, head, field, _var) \ - (void)(_var); \ - STAILQ_FOREACH(var, head, field) - - /* * additional mbuf macros for NetBSD */ Index: src/sys/sys/queue.h diff -u src/sys/sys/queue.h:1.51 src/sys/sys/queue.h:1.52 --- src/sys/sys/queue.h:1.51 Wed Mar 11 06:51:53 2009 +++ src/sys/sys/queue.h Mon Apr 20 09:56:08 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: queue.h,v 1.51 2009/03/11 06:51:53 mrg Exp $ */ +/* $NetBSD: queue.h,v 1.52 2009/04/20 09:56:08 mschuett Exp $ */ /* * Copyright (c) 1991, 1993 @@ -232,6 +232,11 @@ #define SLIST_FOREACH(var, head, field) \ for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST((head)); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + /* * Singly-linked List access methods. */ @@ -306,6 +311,11 @@ (var); \ (var) = ((var)->field.stqe_next)) +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = STAILQ_FIRST((head)); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + #define STAILQ_CONCAT(head1, head2) do { \ if (!STAILQ_EMPTY((head2))) { \ *(head1)->stqh_last = (head2)->stqh_first; \ @@ -314,6 +324,12 @@ } \ } while (/*CONSTCOND*/0) +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY((head)) ? \ + NULL : \ + ((struct type *)(void *) \ + ((char *)((head)->stqh_last) - offsetof(struct type, field)))) + /* * Singly-linked Tail queue access methods. */ @@ -393,6 +409,20 @@ (var) && ((next = ((var)->field.sqe_next)), 1); \ (var) = (next)) +#define SIMPLEQ_CONCAT(head1, head2) do { \ + if (!SIMPLEQ_EMPTY((head2))) { \ + *(head1)->sqh_last = (head2)->sqh_first; \ + (head1)->sqh_last = (head2)->sqh_last; \ + SIMPLEQ_INIT((head2)); \ + } \ +} while (/*CONSTCOND*/0) + +#define SIMPLEQ_LAST(head, type, field) \ + (SIMPLEQ_EMPTY((head)) ? \ + NULL : \ + ((struct type *)(void *) \ + ((char *)((head)->sqh_last) - offsetof(struct type, field)))) + /* * Simple queue access methods. */ Index: src/usr.sbin/syslogd/syslogd.h diff -u src/usr.sbin/syslogd/syslogd.h:1.2 src/usr.sbin/syslogd/syslogd.h:1.3 --- src/usr.sbin/syslogd/syslogd.h:1.2 Fri Nov 7 07:36:38 2008 +++ src/usr.sbin/syslogd/syslogd.h Mon Apr 20 09:56:08 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: syslogd.h,v 1.2 2008/11/07 07:36:38 minskim Exp $ */ +/* $NetBSD: syslogd.h,v 1.3 2009/04/20 09:56:08 mschuett Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -97,46 +97,6 @@ #include <sys/stdint.h> #include <sys/resource.h> -/* additional queue macros copied from FreeBSD */ -#ifndef SLIST_FOREACH_SAFE -#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = SLIST_FIRST((head)); \ - (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ - (var) = (tvar)) -#endif /* !SLIST_FOREACH_SAFE */ -#ifndef STAILQ_FOREACH_SAFE -#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ - for ((var) = STAILQ_FIRST((head)); \ - (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ - (var) = (tvar)) -#endif /* !STAILQ_FOREACH_SAFE */ -#ifndef STAILQ_LAST -#define STAILQ_LAST(head, type, field) \ - (STAILQ_EMPTY((head)) ? \ - NULL : \ - ((struct type *) \ - ((char *)((head)->stqh_last) - offsetof(struct type, field)))) -#endif /* !STAILQ_LAST */ -#ifndef STAILQ_CONCAT -#define STAILQ_CONCAT(head1, head2) do { \ - if (!STAILQ_EMPTY((head2))) { \ - *(head1)->stqh_last = (head2)->stqh_first; \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_INIT((head2)); \ - } \ -} while (0) -#endif /* !STAILQ_CONCAT */ -#ifndef TAILQ_CONCAT -#define TAILQ_CONCAT(head1, head2, field) do { \ - if (!TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TAILQ_INIT((head2)); \ - } \ -} while (0) -#endif /* !TAILQ_CONCAT */ - #include "pathnames.h" #include <sys/syslog.h>