2 .\" The Regents of the University of California. All rights reserved.
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\" notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\" notice, this list of conditions and the following disclaimer in the
11 .\" documentation and/or other materials provided with the distribution.
12 .\" 3. All advertising materials mentioning features or use of this software
13 .\" must display the following acknowledgement:
14 .\" This product includes software developed by the University of
15 .\" California, Berkeley and its contributors.
16 .\" 4. Neither the name of the University nor the names of its contributors
17 .\" may be used to endorse or promote products derived from this software
18 .\" without specific prior written permission.
20 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 .\" @(#)queue.3 8.2 (Berkeley) 1/24/94
43 .Nm SLIST_FOREACH_SAFE ,
45 .Nm SLIST_HEAD_INITIALIZER ,
47 .Nm SLIST_INSERT_AFTER ,
48 .Nm SLIST_INSERT_HEAD ,
50 .Nm SLIST_REMOVE_HEAD ,
57 .Nm STAILQ_FOREACH_SAFE ,
59 .Nm STAILQ_HEAD_INITIALIZER ,
61 .Nm STAILQ_INSERT_AFTER ,
62 .Nm STAILQ_INSERT_HEAD ,
63 .Nm STAILQ_INSERT_TAIL ,
66 .Nm STAILQ_REMOVE_HEAD ,
72 .Nm LIST_FOREACH_SAFE ,
74 .Nm LIST_HEAD_INITIALIZER ,
76 .Nm LIST_INSERT_AFTER ,
77 .Nm LIST_INSERT_BEFORE ,
78 .Nm LIST_INSERT_HEAD ,
86 .Nm TAILQ_FOREACH_SAFE ,
87 .Nm TAILQ_FOREACH_REVERSE ,
88 .Nm TAILQ_FOREACH_REVERSE_SAFE ,
90 .Nm TAILQ_HEAD_INITIALIZER ,
92 .Nm TAILQ_INSERT_AFTER ,
93 .Nm TAILQ_INSERT_BEFORE ,
94 .Nm TAILQ_INSERT_HEAD ,
95 .Nm TAILQ_INSERT_TAIL ,
100 .Nd implementations of singly-linked lists, singly-linked tail queues,
101 lists and tail queues
105 .Fn SLIST_EMPTY "SLIST_HEAD *head"
106 .Fn SLIST_ENTRY "TYPE"
107 .Fn SLIST_FIRST "SLIST_HEAD *head"
108 .Fn SLIST_FOREACH "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME"
109 .Fn SLIST_FOREACH_SAFE "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME" "TYPE *temp_var"
110 .Fn SLIST_HEAD "HEADNAME" "TYPE"
111 .Fn SLIST_HEAD_INITIALIZER "SLIST_HEAD head"
112 .Fn SLIST_INIT "SLIST_HEAD *head"
113 .Fn SLIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "SLIST_ENTRY NAME"
114 .Fn SLIST_INSERT_HEAD "SLIST_HEAD *head" "TYPE *elm" "SLIST_ENTRY NAME"
115 .Fn SLIST_NEXT "TYPE *elm" "SLIST_ENTRY NAME"
116 .Fn SLIST_REMOVE_HEAD "SLIST_HEAD *head" "SLIST_ENTRY NAME"
117 .Fn SLIST_REMOVE "SLIST_HEAD *head" "TYPE *elm" "TYPE" "SLIST_ENTRY NAME"
119 .Fn STAILQ_CONCAT "STAILQ_HEAD *head1" "STAILQ_HEAD *head2"
120 .Fn STAILQ_EMPTY "STAILQ_HEAD *head"
121 .Fn STAILQ_ENTRY "TYPE"
122 .Fn STAILQ_FIRST "STAILQ_HEAD *head"
123 .Fn STAILQ_FOREACH "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
124 .Fn STAILQ_FOREACH_SAFE "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME" "TYPE *temp_var"
125 .Fn STAILQ_HEAD "HEADNAME" "TYPE"
126 .Fn STAILQ_HEAD_INITIALIZER "STAILQ_HEAD head"
127 .Fn STAILQ_INIT "STAILQ_HEAD *head"
128 .Fn STAILQ_INSERT_AFTER "STAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "STAILQ_ENTRY NAME"
129 .Fn STAILQ_INSERT_HEAD "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
130 .Fn STAILQ_INSERT_TAIL "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
131 .Fn STAILQ_LAST "STAILQ_HEAD *head" "TYPE" "STAILQ_ENTRY NAME"
132 .Fn STAILQ_NEXT "TYPE *elm" "STAILQ_ENTRY NAME"
133 .Fn STAILQ_REMOVE_HEAD "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
134 .Fn STAILQ_REMOVE "STAILQ_HEAD *head" "TYPE *elm" "TYPE" "STAILQ_ENTRY NAME"
136 .Fn LIST_EMPTY "LIST_HEAD *head"
137 .Fn LIST_ENTRY "TYPE"
138 .Fn LIST_FIRST "LIST_HEAD *head"
139 .Fn LIST_FOREACH "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME"
140 .Fn LIST_FOREACH_SAFE "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME" "TYPE *temp_var"
141 .Fn LIST_HEAD "HEADNAME" "TYPE"
142 .Fn LIST_HEAD_INITIALIZER "LIST_HEAD head"
143 .Fn LIST_INIT "LIST_HEAD *head"
144 .Fn LIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
145 .Fn LIST_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
146 .Fn LIST_INSERT_HEAD "LIST_HEAD *head" "TYPE *elm" "LIST_ENTRY NAME"
147 .Fn LIST_NEXT "TYPE *elm" "LIST_ENTRY NAME"
148 .Fn LIST_REMOVE "TYPE *elm" "LIST_ENTRY NAME"
150 .Fn TAILQ_CONCAT "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TAILQ_ENTRY NAME"
151 .Fn TAILQ_EMPTY "TAILQ_HEAD *head"
152 .Fn TAILQ_ENTRY "TYPE"
153 .Fn TAILQ_FIRST "TAILQ_HEAD *head"
154 .Fn TAILQ_FOREACH "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME"
155 .Fn TAILQ_FOREACH_SAFE "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME" "TYPE *temp_var"
156 .Fn TAILQ_FOREACH_REVERSE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME" "TAILQ_ENTRY NAME"
157 .Fn TAILQ_FOREACH_REVERSE_SAFE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME" "TAILQ_ENTRY NAME" "TYPE *temp_var"
158 .Fn TAILQ_HEAD "HEADNAME" "TYPE"
159 .Fn TAILQ_HEAD_INITIALIZER "TAILQ_HEAD head"
160 .Fn TAILQ_INIT "TAILQ_HEAD *head"
161 .Fn TAILQ_INSERT_AFTER "TAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
162 .Fn TAILQ_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
163 .Fn TAILQ_INSERT_HEAD "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
164 .Fn TAILQ_INSERT_TAIL "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
165 .Fn TAILQ_LAST "TAILQ_HEAD *head" "HEADNAME"
166 .Fn TAILQ_NEXT "TYPE *elm" "TAILQ_ENTRY NAME"
167 .Fn TAILQ_PREV "TYPE *elm" "HEADNAME" "TAILQ_ENTRY NAME"
168 .Fn TAILQ_REMOVE "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
171 These macros define and operate on four types of data structures:
172 singly-linked lists, singly-linked tail queues, lists, and tail queues.
173 All four structures support the following functionality:
174 .Bl -enum -compact -offset indent
176 Insertion of a new entry at the head of the list.
178 Insertion of a new entry after any element in the list.
180 O(1) removal of an entry from the head of the list.
182 O(n) removal of any entry in the list.
184 Forward traversal through the list.
187 Singly-linked lists are the simplest of the four data structures
188 and support only the above functionality.
189 Singly-linked lists are ideal for applications with large datasets
190 and few or no removals,
191 or for implementing a LIFO queue.
193 Singly-linked tail queues add the following functionality:
194 .Bl -enum -compact -offset indent
196 Entries can be added at the end of a list.
198 They may be concatenated.
201 .Bl -enum -compact -offset indent
203 All list insertions must specify the head of the list.
205 Each head entry requires two pointers rather than one.
207 Code size is about 15% greater and operations run about 20% slower
208 than singly-linked lists.
211 Singly-linked tailqs are ideal for applications with large datasets and
213 or for implementing a FIFO queue.
215 All doubly linked types of data structures (lists and tail queues)
217 .Bl -enum -compact -offset indent
219 Insertion of a new entry before any element in the list.
221 O(1) removal of any entry in the list.
224 .Bl -enum -compact -offset indent
226 Each elements requires two pointers rather than one.
228 Code size and execution time of operations (except for removal) is about
229 twice that of the singly-linked data-structures.
232 Linked lists are the simplest of the doubly linked data structures and support
233 only the above functionality over singly-linked lists.
235 Tail queues add the following functionality:
236 .Bl -enum -compact -offset indent
238 Entries can be added at the end of a list.
240 They may be traversed backwards, from tail to head.
242 They may be concatenated.
245 .Bl -enum -compact -offset indent
247 All list insertions and removals must specify the head of the list.
249 Each head entry requires two pointers rather than one.
251 Code size is about 15% greater and operations run about 20% slower
252 than singly-linked lists.
255 In the macro definitions,
257 is the name of a user defined structure,
258 that must contain a field of type
268 is the name of a user defined structure that must be declared
275 See the examples below for further explanation of how these
277 .Sh SINGLY-LINKED LISTS
278 A singly-linked list is headed by a structure defined by the
281 This structure contains a single pointer to the first element
283 The elements are singly linked for minimum space and pointer manipulation
284 overhead at the expense of O(n) removal for arbitrary elements.
285 New elements can be added to the list after an existing element or
286 at the head of the list.
289 structure is declared as follows:
290 .Bd -literal -offset indent
291 SLIST_HEAD(HEADNAME, TYPE) head;
296 is the name of the structure to be defined, and
298 is the type of the elements to be linked into the list.
299 A pointer to the head of the list can later be declared as:
300 .Bd -literal -offset indent
301 struct HEADNAME *headp;
308 are user selectable.)
311 .Nm SLIST_HEAD_INITIALIZER
312 evaluates to an initializer for the list
317 evaluates to true if there are no elements in the list.
321 declares a structure that connects the elements in
326 returns the first element in the list or NULL if the list is empty.
330 traverses the list referenced by
332 in the forward direction, assigning each element in
337 .Nm SLIST_FOREACH_SAFE
338 traverses the list referenced by
340 in the forward direction, assigning each element in
345 here it is permitted to both remove
347 as well as free it from within the loop safely without interfering with the
352 initializes the list referenced by
356 .Nm SLIST_INSERT_HEAD
357 inserts the new element
359 at the head of the list.
362 .Nm SLIST_INSERT_AFTER
363 inserts the new element
370 returns the next element in the list.
373 .Nm SLIST_REMOVE_HEAD
376 from the head of the list.
377 For optimum efficiency,
378 elements being removed from the head of the list should explicitly use
379 this macro instead of the generic
388 .Sh SINGLY-LINKED LIST EXAMPLE
390 SLIST_HEAD(slisthead, entry) head =
391 SLIST_HEAD_INITIALIZER(head);
392 struct slisthead *headp; /* Singly-linked List head. */
395 SLIST_ENTRY(entry) entries; /* Singly-linked List. */
397 } *n1, *n2, *n3, *np;
399 SLIST_INIT(&head); /* Initialize the list. */
401 n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
402 SLIST_INSERT_HEAD(&head, n1, entries);
404 n2 = malloc(sizeof(struct entry)); /* Insert after. */
405 SLIST_INSERT_AFTER(n1, n2, entries);
407 SLIST_REMOVE(&head, n2, entry, entries);/* Deletion. */
410 n3 = SLIST_FIRST(&head);
411 SLIST_REMOVE_HEAD(&head, entries); /* Deletion from the head. */
413 /* Forward traversal. */
414 SLIST_FOREACH(np, &head, entries)
416 /* Safe forward traversal. */
417 SLIST_FOREACH_SAFE(np, &head, entries, np_temp) {
420 SLIST_REMOVE(&head, np, entry, entries);
424 while (!SLIST_EMPTY(&head)) { /* List Deletion. */
425 n1 = SLIST_FIRST(&head);
426 SLIST_REMOVE_HEAD(&head, entries);
430 .Sh SINGLY-LINKED TAIL QUEUES
431 A singly-linked tail queue is headed by a structure defined by the
434 This structure contains a pair of pointers,
435 one to the first element in the tail queue and the other to
436 the last element in the tail queue.
437 The elements are singly linked for minimum space and pointer
438 manipulation overhead at the expense of O(n) removal for arbitrary
440 New elements can be added to the tail queue after an existing element,
441 at the head of the tail queue, or at the end of the tail queue.
444 structure is declared as follows:
445 .Bd -literal -offset indent
446 STAILQ_HEAD(HEADNAME, TYPE) head;
451 is the name of the structure to be defined, and
453 is the type of the elements to be linked into the tail queue.
454 A pointer to the head of the tail queue can later be declared as:
455 .Bd -literal -offset indent
456 struct HEADNAME *headp;
463 are user selectable.)
466 .Nm STAILQ_HEAD_INITIALIZER
467 evaluates to an initializer for the tail queue
472 concatenates the tail queue headed by
474 onto the end of the one headed by
476 removing all entries from the former.
480 evaluates to true if there are no items on the tail queue.
484 declares a structure that connects the elements in
489 returns the first item on the tail queue or NULL if the tail queue
494 traverses the tail queue referenced by
496 in the forward direction, assigning each element
501 .Nm STAILQ_FOREACH_SAFE
502 traverses the tail queue referenced by
504 in the forward direction, assigning each element
509 here it is permitted to both remove
511 as well as free it from within the loop safely without interfering with the
516 initializes the tail queue referenced by
520 .Nm STAILQ_INSERT_HEAD
521 inserts the new element
523 at the head of the tail queue.
526 .Nm STAILQ_INSERT_TAIL
527 inserts the new element
529 at the end of the tail queue.
532 .Nm STAILQ_INSERT_AFTER
533 inserts the new element
540 returns the last item on the tail queue.
541 If the tail queue is empty the return value is
546 returns the next item on the tail queue, or NULL this item is the last.
549 .Nm STAILQ_REMOVE_HEAD
550 removes the element at the head of the tail queue.
551 For optimum efficiency,
552 elements being removed from the head of the tail queue should
553 use this macro explicitly rather than the generic
562 .Sh SINGLY-LINKED TAIL QUEUE EXAMPLE
564 STAILQ_HEAD(stailhead, entry) head =
565 STAILQ_HEAD_INITIALIZER(head);
566 struct stailhead *headp; /* Singly-linked tail queue head. */
569 STAILQ_ENTRY(entry) entries; /* Tail queue. */
571 } *n1, *n2, *n3, *np;
573 STAILQ_INIT(&head); /* Initialize the queue. */
575 n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
576 STAILQ_INSERT_HEAD(&head, n1, entries);
578 n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */
579 STAILQ_INSERT_TAIL(&head, n1, entries);
581 n2 = malloc(sizeof(struct entry)); /* Insert after. */
582 STAILQ_INSERT_AFTER(&head, n1, n2, entries);
584 STAILQ_REMOVE(&head, n2, entry, entries);
586 /* Deletion from the head. */
587 n3 = STAILQ_FIRST(&head);
588 STAILQ_REMOVE_HEAD(&head, entries);
590 /* Forward traversal. */
591 STAILQ_FOREACH(np, &head, entries)
593 /* Safe forward traversal. */
594 STAILQ_FOREACH_SAFE(np, &head, entries, np_temp) {
597 STAILQ_REMOVE(&head, np, entry, entries);
600 /* TailQ Deletion. */
601 while (!STAILQ_EMPTY(&head)) {
602 n1 = STAILQ_FIRST(&head);
603 STAILQ_REMOVE_HEAD(&head, entries);
606 /* Faster TailQ Deletion. */
607 n1 = STAILQ_FIRST(&head);
609 n2 = STAILQ_NEXT(n1, entries);
616 A list is headed by a structure defined by the
619 This structure contains a single pointer to the first element
621 The elements are doubly linked so that an arbitrary element can be
622 removed without traversing the list.
623 New elements can be added to the list after an existing element,
624 before an existing element, or at the head of the list.
627 structure is declared as follows:
628 .Bd -literal -offset indent
629 LIST_HEAD(HEADNAME, TYPE) head;
634 is the name of the structure to be defined, and
636 is the type of the elements to be linked into the list.
637 A pointer to the head of the list can later be declared as:
638 .Bd -literal -offset indent
639 struct HEADNAME *headp;
646 are user selectable.)
649 .Nm LIST_HEAD_INITIALIZER
650 evaluates to an initializer for the list
655 evaluates to true if there are no elements in the list.
659 declares a structure that connects the elements in
664 returns the first element in the list or NULL if the list
669 traverses the list referenced by
671 in the forward direction, assigning each element in turn to
675 .Nm LIST_FOREACH_SAFE
676 traverses the list referenced by
678 in the forward direction, assigning each element in turn to
682 here it is permitted to both remove
684 as well as free it from within the loop safely without interfering with the
689 initializes the list referenced by
694 inserts the new element
696 at the head of the list.
699 .Nm LIST_INSERT_AFTER
700 inserts the new element
706 .Nm LIST_INSERT_BEFORE
707 inserts the new element
714 returns the next element in the list, or NULL if this is the last.
723 LIST_HEAD(listhead, entry) head =
724 LIST_HEAD_INITIALIZER(head);
725 struct listhead *headp; /* List head. */
728 LIST_ENTRY(entry) entries; /* List. */
730 } *n1, *n2, *n3, *np, *np_temp;
732 LIST_INIT(&head); /* Initialize the list. */
734 n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
735 LIST_INSERT_HEAD(&head, n1, entries);
737 n2 = malloc(sizeof(struct entry)); /* Insert after. */
738 LIST_INSERT_AFTER(n1, n2, entries);
740 n3 = malloc(sizeof(struct entry)); /* Insert before. */
741 LIST_INSERT_BEFORE(n2, n3, entries);
743 LIST_REMOVE(n2, entries); /* Deletion. */
745 /* Forward traversal. */
746 LIST_FOREACH(np, &head, entries)
749 /* Safe forward traversal. */
750 LIST_FOREACH_SAFE(np, &head, entries, np_temp) {
753 LIST_REMOVE(np, entries);
757 while (!LIST_EMPTY(&head)) { /* List Deletion. */
758 n1 = LIST_FIRST(&head);
759 LIST_REMOVE(n1, entries);
763 n1 = LIST_FIRST(&head); /* Faster List Deletion. */
765 n2 = LIST_NEXT(n1, entries);
772 A tail queue is headed by a structure defined by the
775 This structure contains a pair of pointers,
776 one to the first element in the tail queue and the other to
777 the last element in the tail queue.
778 The elements are doubly linked so that an arbitrary element can be
779 removed without traversing the tail queue.
780 New elements can be added to the tail queue after an existing element,
781 before an existing element, at the head of the tail queue,
782 or at the end of the tail queue.
785 structure is declared as follows:
786 .Bd -literal -offset indent
787 TAILQ_HEAD(HEADNAME, TYPE) head;
792 is the name of the structure to be defined, and
794 is the type of the elements to be linked into the tail queue.
795 A pointer to the head of the tail queue can later be declared as:
796 .Bd -literal -offset indent
797 struct HEADNAME *headp;
804 are user selectable.)
807 .Nm TAILQ_HEAD_INITIALIZER
808 evaluates to an initializer for the tail queue
813 concatenates the tail queue headed by
815 onto the end of the one headed by
817 removing all entries from the former.
821 evaluates to true if there are no items on the tail queue.
825 declares a structure that connects the elements in
830 returns the first item on the tail queue or NULL if the tail queue
835 traverses the tail queue referenced by
837 in the forward direction, assigning each element in turn to
842 if the loop completes normally, or if there were no elements.
845 .Nm TAILQ_FOREACH_REVERSE
846 traverses the tail queue referenced by
848 in the reverse direction, assigning each element in turn to
852 .Nm TAILQ_FOREACH_SAFE
854 .Nm TAILQ_FOREACH_REVERSE_SAFE
855 traverse the list referenced by
857 in the forward or reverse direction respectively,
858 assigning each element in turn to
860 However, unlike their unsafe counterparts,
863 .Nm TAILQ_FOREACH_REVERSE
864 permit to both remove
866 as well as free it from within the loop safely without interfering with the
871 initializes the tail queue referenced by
875 .Nm TAILQ_INSERT_HEAD
876 inserts the new element
878 at the head of the tail queue.
881 .Nm TAILQ_INSERT_TAIL
882 inserts the new element
884 at the end of the tail queue.
887 .Nm TAILQ_INSERT_AFTER
888 inserts the new element
894 .Nm TAILQ_INSERT_BEFORE
895 inserts the new element
902 returns the last item on the tail queue.
903 If the tail queue is empty the return value is
908 returns the next item on the tail queue, or NULL if this item is the last.
912 returns the previous item on the tail queue, or NULL if this item
920 .Sh TAIL QUEUE EXAMPLE
922 TAILQ_HEAD(tailhead, entry) head =
923 TAILQ_HEAD_INITIALIZER(head);
924 struct tailhead *headp; /* Tail queue head. */
927 TAILQ_ENTRY(entry) entries; /* Tail queue. */
929 } *n1, *n2, *n3, *np;
931 TAILQ_INIT(&head); /* Initialize the queue. */
933 n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
934 TAILQ_INSERT_HEAD(&head, n1, entries);
936 n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */
937 TAILQ_INSERT_TAIL(&head, n1, entries);
939 n2 = malloc(sizeof(struct entry)); /* Insert after. */
940 TAILQ_INSERT_AFTER(&head, n1, n2, entries);
942 n3 = malloc(sizeof(struct entry)); /* Insert before. */
943 TAILQ_INSERT_BEFORE(n2, n3, entries);
945 TAILQ_REMOVE(&head, n2, entries); /* Deletion. */
947 /* Forward traversal. */
948 TAILQ_FOREACH(np, &head, entries)
950 /* Safe forward traversal. */
951 TAILQ_FOREACH_SAFE(np, &head, entries, np_temp) {
954 TAILQ_REMOVE(&head, np, entries);
957 /* Reverse traversal. */
958 TAILQ_FOREACH_REVERSE(np, &head, tailhead, entries)
960 /* TailQ Deletion. */
961 while (!TAILQ_EMPTY(&head)) {
962 n1 = TAILQ_FIRST(&head);
963 TAILQ_REMOVE(&head, n1, entries);
966 /* Faster TailQ Deletion. */
967 n1 = TAILQ_FIRST(&head);
969 n2 = TAILQ_NEXT(n1, entries);
978 functions first appeared in