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>