Do not begin a line with single quote character. Submitted by: Kazuo Horikawa <k-horik@yk.rim.or.jp>
848 lines
21 KiB
Groff
848 lines
21 KiB
Groff
.\" Copyright (c) 1993
|
||
.\" The Regents of the University of California. All rights reserved.
|
||
.\"
|
||
.\" Redistribution and use in source and binary forms, with or without
|
||
.\" modification, are permitted provided that the following conditions
|
||
.\" are met:
|
||
.\" 1. Redistributions of source code must retain the above copyright
|
||
.\" notice, this list of conditions and the following disclaimer.
|
||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||
.\" notice, this list of conditions and the following disclaimer in the
|
||
.\" documentation and/or other materials provided with the distribution.
|
||
.\" 3. All advertising materials mentioning features or use of this software
|
||
.\" must display the following acknowledgement:
|
||
.\" This product includes software developed by the University of
|
||
.\" California, Berkeley and its contributors.
|
||
.\" 4. Neither the name of the University nor the names of its contributors
|
||
.\" may be used to endorse or promote products derived from this software
|
||
.\" without specific prior written permission.
|
||
.\"
|
||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
.\" SUCH DAMAGE.
|
||
.\"
|
||
.\" @(#)queue.3 8.2 (Berkeley) 1/24/94
|
||
.\" %Id: queue.3,v 1.13 1998/06/06 05:50:50 jkoshy Exp %
|
||
.\"
|
||
.Dd January 24, 1994
|
||
.Dt QUEUE 3
|
||
.Os BSD 4
|
||
.Sh ̾¾Î
|
||
.Nm SLIST_EMPTY ,
|
||
.Nm SLIST_ENTRY ,
|
||
.Nm SLIST_FIRST ,
|
||
.Nm SLIST_HEAD ,
|
||
.Nm SLIST_INIT ,
|
||
.Nm SLIST_INSERT_AFTER ,
|
||
.Nm SLIST_INSERT_HEAD ,
|
||
.Nm SLIST_NEXT ,
|
||
.Nm SLIST_REMOVE_HEAD ,
|
||
.Nm SLIST_REMOVE ,
|
||
.Nm STAILQ_ENTRY ,
|
||
.Nm STAILQ_HEAD ,
|
||
.Nm STAILQ_INIT ,
|
||
.Nm STAILQ_INSERT_AFTER ,
|
||
.Nm STAILQ_INSERT_HEAD ,
|
||
.Nm STAILQ_INSERT_TAIL ,
|
||
.Nm STAILQ_REMOVE_HEAD ,
|
||
.Nm STAILQ_REMOVE ,
|
||
.Nm LIST_ENTRY ,
|
||
.Nm LIST_HEAD ,
|
||
.Nm LIST_INIT ,
|
||
.Nm LIST_INSERT_AFTER ,
|
||
.Nm LIST_INSERT_BEFORE ,
|
||
.Nm LIST_INSERT_HEAD ,
|
||
.Nm LIST_REMOVE ,
|
||
.Nm TAILQ_EMPTY ,
|
||
.Nm TAILQ_ENTRY ,
|
||
.Nm TAILQ_FIRST ,
|
||
.Nm TAILQ_HEAD ,
|
||
.Nm TAILQ_INIT ,
|
||
.Nm TAILQ_INSERT_AFTER ,
|
||
.Nm TAILQ_INSERT_BEFORE ,
|
||
.Nm TAILQ_INSERT_HEAD ,
|
||
.Nm TAILQ_INSERT_TAIL ,
|
||
.Nm TAILQ_LAST ,
|
||
.Nm TAILQ_NEXT ,
|
||
.Nm TAILQ_REMOVE ,
|
||
.Nm CIRCLEQ_ENTRY ,
|
||
.Nm CIRCLEQ_HEAD ,
|
||
.Nm CIRCLEQ_INIT ,
|
||
.Nm CIRCLEQ_INSERT_AFTER ,
|
||
.Nm CIRCLEQ_INSERT_BEFORE ,
|
||
.Nm CIRCLEQ_INSERT_HEAD ,
|
||
.Nm CIRCLEQ_INSERT_TAIL ,
|
||
.Nm CIRCLEQ_REMOVE
|
||
.Nd ñ°ì¥ê¥ó¥¯¥ê¥¹¥È¡¢Ã±°ì¥ê¥ó¥¯¥Æ¡¼¥ë¥¥å¡¼¡¢¥ê¥¹¥È¡¢¥Æ¡¼¥ë¥¥å¡¼¡¢½Û
|
||
´Ä¥¥å¡¼¤Î¥·¥¹¥Æ¥à
|
||
.Sh ½ñ¼°
|
||
.Fd #include <sys/queue.h>
|
||
.\"
|
||
.Fn SLIST_EMPTY "SLIST_HEAD *head"
|
||
.Fn SLIST_ENTRY "TYPE"
|
||
.Fn SLIST_FIRST "SLIST_HEAD *head"
|
||
.Fn SLIST_HEAD "HEADNAME" "TYPE"
|
||
.Fn SLIST_INIT "SLIST_HEAD *head"
|
||
.Fn SLIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "SLIST_ENTRY NAME"
|
||
.Fn SLIST_INSERT_HEAD "SLIST_HEAD *head" "TYPE *elm" "SLIST_ENTRY NAME"
|
||
.Fn SLIST_NEXT "TYPE *elm" "SLIST_ENTRY NAME"
|
||
.Fn SLIST_REMOVE_HEAD "SLIST_HEAD *head" "SLIST_ENTRY NAME"
|
||
.Fn SLIST_REMOVE "SLIST_HEAD *head" "TYPE *elm" "TYPE" "SLIST_ENTRY NAME"
|
||
.\"
|
||
.Fn STAILQ_ENTRY "TYPE"
|
||
.Fn STAILQ_HEAD "HEADNAME" "TYPE"
|
||
.Fn STAILQ_INIT "STAILQ_HEAD *head"
|
||
.Fn STAILQ_INSERT_AFTER "STAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "STAILQ_ENTRY NAME"
|
||
.Fn STAILQ_INSERT_HEAD "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
|
||
.Fn STAILQ_INSERT_TAIL "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
|
||
.Fn STAILQ_REMOVE_HEAD "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
|
||
.Fn STAILQ_REMOVE "STAILQ_HEAD *head" "TYPE *elm" "TYPE" "STAILQ_ENTRY NAME"
|
||
.\"
|
||
.Fn LIST_ENTRY "TYPE"
|
||
.Fn LIST_HEAD "HEADNAME" "TYPE"
|
||
.Fn LIST_INIT "LIST_HEAD *head"
|
||
.Fn LIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
|
||
.Fn LIST_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
|
||
.Fn LIST_INSERT_HEAD "LIST_HEAD *head" "TYPE *elm" "LIST_ENTRY NAME"
|
||
.Fn LIST_REMOVE "TYPE *elm" "LIST_ENTRY NAME"
|
||
.\"
|
||
.Fn TAILQ_EMPTY "TAILQ_HEAD *head"
|
||
.Fn TAILQ_ENTRY "TYPE"
|
||
.Fn TAILQ_FIRST "TAILQ_HEAD *head"
|
||
.Fn TAILQ_HEAD "HEADNAME" "TYPE"
|
||
.Fn TAILQ_INIT "TAILQ_HEAD *head"
|
||
.Fn TAILQ_INSERT_AFTER "TAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
|
||
.Fn TAILQ_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
|
||
.Fn TAILQ_INSERT_HEAD "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
|
||
.Fn TAILQ_INSERT_TAIL "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
|
||
.Fn TAILQ_LAST "TAILQ_HEAD *head"
|
||
.Fn TAILQ_NEXT "TYPE *elm" "TAILQ_ENTRY NAME"
|
||
.Fn TAILQ_REMOVE "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
|
||
.\"
|
||
.Fn CIRCLEQ_ENTRY "TYPE"
|
||
.Fn CIRCLEQ_HEAD "HEADNAME" "TYPE"
|
||
.Fn CIRCLEQ_INIT "CIRCLEQ_HEAD *head"
|
||
.Fn CIRCLEQ_INSERT_AFTER "CIRCLEQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "CIRCLEQ_ENTRY NAME"
|
||
.Fn CIRCLEQ_INSERT_BEFORE "CIRCLEQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "CIRCLEQ_ENTRY NAME"
|
||
.Fn CIRCLEQ_INSERT_HEAD "CIRCLEQ_HEAD *head" "TYPE *elm" "CIRCLEQ_ENTRY NAME"
|
||
.Fn CIRCLEQ_INSERT_TAIL "CIRCLEQ_HEAD *head" "TYPE *elm" "CIRCLEQ_ENTRY NAME"
|
||
.Fn CIRCLEQ_REMOVE "CIRCLEQ_HEAD *head" "TYPE *elm" "CIRCLEQ_ENTRY NAME"
|
||
.Sh ²òÀâ
|
||
¤³¤Î¥Þ¥¯¥í¤Ï¡¢Ã±°ì¥ê¥ó¥¯¥ê¥¹¥È¡¢Ã±°ì¥ê¥ó¥¯¥Æ¡¼¥ë¥¥å¡¼¡¢¥ê¥¹¥È¡¢¥Æ¡¼¥ë
|
||
¥¥å¡¼¡¢½Û´Ä¥¥å¡¼¤È¤¤¤¦¡¢5 ¼ïÎà¤Î¥Ç¡¼¥¿¹½Â¤¤òÄêµÁ¤·¤Æ¤½¤³¤Çưºî¤·¤Þ¤¹¡£
|
||
¤³¤Î¤¹¤Ù¤Æ¤Î¥Ç¡¼¥¿¹½Â¤¤Ç¤Ï¡¢°Ê²¼¤Îµ¡Ç½¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
|
||
.Bl -enum -compact -offset indent
|
||
.It
|
||
¥ê¥¹¥È¤ÎºÇ½é¤Ë¿·¤·¤¤¥¨¥ó¥È¥ê¤òÁÞÆþ¤¹¤ë¡£
|
||
.It
|
||
¥ê¥¹¥È¤Ë¸ºß¤¹¤ëǤ°Õ¤Î¥¨¥ì¥á¥ó¥È¤Î¸å¤í¤Ë¿·¤·¤¤¥¨¥ó¥È¥ê¤òÁÞÆþ¤¹¤ë¡£
|
||
.It
|
||
¥ê¥¹¥È¤ÎºÇ½é¤«¤é¥¨¥ó¥È¥ê¤ò O(1) ºï½ü¤¹¤ë¡£
|
||
.It
|
||
¥ê¥¹¥È¤ÎǤ°Õ¤Î¥¨¥ó¥È¥ê¤ò O(n) ºï½ü¤¹¤ë¡£
|
||
.It
|
||
¥ê¥¹¥È¤Ç¥È¥é¥Ð¡¼¥¹¤òžÁ÷¤¹¤ë¡£
|
||
.El
|
||
.Pp
|
||
ñ°ì¥ê¥ó¥¯¥ê¥¹¥È¤Ï¡¢5 ¤Ä¤Î¥Ç¡¼¥¿¹½Â¤¤ÎÃæ¤ÇºÇ¤âñ½ã¤Ç¡¢¾å¤Î 5¤Ä¤Îµ¡Ç½¤·
|
||
¤«¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó¡£¥Ç¡¼¥¿¥»¥Ã¥È¤¬Â礤¯¡¢ºï½ü¤¬¤Û¤È¤ó¤É¤Ê¤¤¥¢¥×¥ê¥±¡¼
|
||
¥·¥ç¥ó¡¢¤Þ¤¿¤Ï LIFO ¥¥å¡¼¤Î¼Â¸½¤ËºÇŬ¤Ç¤¹¡£
|
||
.Pp
|
||
ñ°ì¥ê¥ó¥¯¥Æ¡¼¥ë¥¥å¡¼¤Ë¤Ï°Ê²¼¤Îµ¡Ç½¤â¤¢¤ê¤Þ¤¹¡£
|
||
.Bl -enum -compact -offset indent
|
||
.It
|
||
¥ê¥¹¥È¤ÎºÇ¸å¤Ë¥¨¥ó¥È¥ê¤òÄɲ乤롣
|
||
.El
|
||
¤·¤«¤·°Ê²¼¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
|
||
.Bl -enum -compact -offset indent
|
||
.It
|
||
¥ê¥¹¥È¤ÎÁÞÆþ¤Ç¤Ï¡¢¥ê¥¹¥È¤Î¥Ø¥Ã¥É¤òɬ¤º»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¡£
|
||
.It
|
||
³Æ¥Ø¥Ã¥É¥¨¥ó¥È¥ê¤Ç¤Ï¡¢1¤Ä¤Ç¤Ï¤Ê¤¯ 2¤Ä¤Î¥Ý¥¤¥ó¥¿¤¬É¬Íס£
|
||
.It
|
||
ñ°ì¥ê¥ó¥¯¥ê¥¹¥È¤è¤ê¡¢¥³¡¼¥É¥µ¥¤¥º¤ÏÌó 15% Â礤¯¡¢½èÍý»þ´Ö¤ÏÌó 20% Ĺ
|
||
¤¤¡£
|
||
.El
|
||
.Pp
|
||
ñ°ì¥ê¥ó¥¯¥Æ¡¼¥ë¥¥å¡¼¤Ï¡¢¥Ç¡¼¥¿¥»¥Ã¥È¤¬Â礤¯¡¢ºï½ü¤¬¤Û¤È¤ó¤É¤Ê¤¤
|
||
¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¢¤Þ¤¿¤Ï FIFO ¥¥å¡¼¤Î¼Â¸½¤ËºÇŬ¤Ç¤¹¡£
|
||
.Pp
|
||
Æó½Å¥ê¥ó¥¯¥¿¥¤¥×¤Î¤¹¤Ù¤Æ¤Î¥Ç¡¼¥¿¹½Â¤(¥ê¥¹¥È¡¢¥Æ¡¼¥ë¥¥å¡¼¡¢½Û´Ä¥¥å¡¼)
|
||
¤Ë¤Ï°Ê²¼¤Îµ¡Ç½¤â¤¢¤ê¤Þ¤¹¡£
|
||
.Bl -enum -compact -offset indent
|
||
.It
|
||
¥ê¥¹¥È¤Ë¸ºß¤¹¤ëǤ°Õ¤Î¥¨¥ì¥á¥ó¥È¤ÎÁ°¤Ë¿·¤·¤¤¥¨¥ó¥È¥ê¤òÁÞÆþ¤¹¤ë¡£
|
||
.It
|
||
¥ê¥¹¥È¤ÎǤ°Õ¤Î¥¨¥ó¥È¥ê¤ò O(1) ºï½ü¤¹¤ë¡£
|
||
.El
|
||
¤·¤«¤·°Ê²¼¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
|
||
.Bl -enum -compact -offset indent
|
||
.It
|
||
³Æ¥¨¥ì¥á¥ó¥È¤Ë¤Ï¡¢1¤Ä¤Ç¤Ï¤Ê¤¯ 2¤Ä¤Î¥Ý¥¤¥ó¥¿¤¬É¬Íס£
|
||
.It
|
||
ñ°ì¥ê¥ó¥¯¥Ç¡¼¥¿¹½Â¤¤è¤ê¡¢¥³¡¼¥É¥µ¥¤¥º¤È¼Â¹Ô»þ´Ö(ºï½ü¤Ï½ü¤¯)¤¬Ìó 2ÇܤË
|
||
¤Ê¤ë¡£
|
||
.El
|
||
.Pp
|
||
¥ê¥ó¥¯¥ê¥¹¥È¤Ï¡¢Æó½Å¥ê¥ó¥¯¥Ç¡¼¥¿¹½Â¤¤ÎÃæ¤ÇºÇ¤âñ½ã¤Ç¡¢Ã±°ì¥ê¥ó¥¯¥ê¥¹¥È
|
||
¤Îµ¡Ç½¤Ë²Ã¤¨¤Æ¾å¤Îµ¡Ç½¤·¤«¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó¡£
|
||
.Pp
|
||
¥Æ¡¼¥ë¥¥å¡¼¤Ë¤Ï°Ê²¼¤Îµ¡Ç½¤â¤¢¤ê¤Þ¤¹¡£
|
||
.Bl -enum -compact -offset indent
|
||
.It
|
||
¥ê¥¹¥È¤ÎºÇ¸å¤Ë¥¨¥ó¥È¥ê¤òÄɲ乤롣
|
||
.El
|
||
¤·¤«¤·°Ê²¼¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
|
||
.Bl -enum -compact -offset indent
|
||
.It
|
||
¥ê¥¹¥È¤ÎÁÞÆþ¤Èºï½ü¤Ç¤Ï¡¢¥ê¥¹¥È¤Î¥Ø¥Ã¥É¤òɬ¤º»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¡£
|
||
.It
|
||
³Æ¥Ø¥Ã¥É¥¨¥ó¥È¥ê¤Ç¤Ï¡¢1¤Ä¤Ç¤Ï¤Ê¤¯ 2¤Ä¤Î¥Ý¥¤¥ó¥¿¤¬É¬Íס£
|
||
.It
|
||
ñ°ì¥ê¥ó¥¯¥ê¥¹¥È¤è¤ê¡¢¥³¡¼¥É¥µ¥¤¥º¤ÏÌó 15%Â礤¯¡¢½èÍý»þ´Ö¤ÏÌó 20%Ť¤¡£
|
||
.El
|
||
.Pp
|
||
½Û´Ä¥¥å¡¼¤Ë¤Ï°Ê²¼¤Îµ¡Ç½¤â¤¢¤ê¤Þ¤¹¡£
|
||
.Bl -enum -compact -offset indent
|
||
.It
|
||
¥ê¥¹¥È¤ÎºÇ¸å¤Ë¥¨¥ó¥È¥ê¤òÄɲ乤롣
|
||
.It
|
||
¥Æ¡¼¥ë¤«¤é¥Ø¥Ã¥É¤ØµÕ½ç¤Ç²£ÃǤ¹¤ë¡£
|
||
.El
|
||
¤·¤«¤·°Ê²¼¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
|
||
.Bl -enum -compact -offset indent
|
||
.It
|
||
¥ê¥¹¥È¤ÎÁÞÆþ¤Èºï½ü¤Ç¤Ï¡¢¥ê¥¹¥È¤Î¥Ø¥Ã¥É¤òɬ¤º»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¡£
|
||
.It
|
||
³Æ¥Ø¥Ã¥É¥¨¥ó¥È¥ê¤Ç¤Ï¡¢1¤Ä¤Ç¤Ï¤Ê¤¯ 2¤Ä¤Î¥Ý¥¤¥ó¥¿¤¬É¬Íס£
|
||
.It
|
||
¥È¥é¥Ð¡¼¥¹¤Î½ªÎ»¾ò·ï¤¬Ê£»¨¡£
|
||
.It
|
||
¥ê¥¹¥È¤è¤ê¡¢¥³¡¼¥É¥µ¥¤¥º¤ÏÌó 40%Â礤¯¡¢½èÍý»þ´Ö¤ÏÌó 45%Ť¤¡£
|
||
.El
|
||
.Pp
|
||
¥Þ¥¯¥íÄêµÁ¤Ç¤Ï¡¢
|
||
.Fa TYPE
|
||
¤Ï¥æ¡¼¥¶¤¬ÄêµÁ¤·¤¿¹½Â¤ÂΤÎ̾Á°¤Ç¤¹¡£¤³¤Î¹½Â¤ÂΤˤϡ¢
|
||
.Fa NAME
|
||
¤È¤¤¤¦Ì¾Á°¤¬ÉÕ¤¤¤¿¡¢
|
||
.Li SLIST_ENTRY
|
||
¤«
|
||
.Li STAILQ_ENTRY ,
|
||
.Li LIST_ENTRY ,
|
||
.Li TAILQ_ENTRY ,
|
||
.Li CIRCLEQ_ENTRY
|
||
¤È¤¤¤¦¥¿¥¤¥×¤Î¥Õ¥£¡¼¥ë¥É¤ò´Þ¤á¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£°ú¿ô
|
||
.Fa HEADNAME
|
||
¤Ï¡¢
|
||
.Li SLIST_HEAD
|
||
¥Þ¥¯¥í¤«
|
||
.Li STAILQ_HEAD
|
||
¥Þ¥¯¥í¡¢
|
||
.Li LIST_HEAD
|
||
¥Þ¥¯¥í¡¢
|
||
.Li TAILQ_HEAD
|
||
¥Þ¥¯¥í¡¢
|
||
.Li CIRCLEQ_HEAD
|
||
¥Þ¥¯¥í¤ÇÀë¸À¤¹¤ëɬÍפ¬¤¢¤ë¡¢¥æ¡¼¥¶¤¬ÄêµÁ¤·¤¿¹½Â¤ÂΤÎ̾Á°¤Ç¤¹¡£¤³¤Î¥Þ¥¯
|
||
¥í¤Î»ÈÍÑË¡¤Ë¤Ä¤¤¤Æ¤Ï¡¢°Ê²¼¤Î»ÈÍÑÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
|
||
.Sh ñ°ì¥ê¥ó¥¯¥ê¥¹¥È
|
||
ñ°ì¥ê¥ó¥¯¥ê¥¹¥È¤ÎºÇ½é¤Ë¤Ï¡¢
|
||
.Nm SLIST_HEAD
|
||
¥Þ¥¯¥í¤¬ÄêµÁ¤¹¤ë¹½Â¤ÂΤ¬ÉÕ¤¤Þ¤¹¡£¤³¤Î¹½Â¤ÂΤˤϡ¢¥ê¥¹¥È¤ÎºÇ½é¤Î¥¨¥ì¥á
|
||
¥ó¥È¤ò»Ø¤¹1 ¤Ä¤Î¥Ý¥¤¥ó¥¿¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¥¨¥ì¥á¥ó¥È¤Ï¡¢Ç¤°Õ¤Î¥¨¥ì¥á¥ó¥È¤Î
|
||
O(n) ºï½ü¤òµ¾À·¤Ë¤·¤Æ¡¢ºÇÄ㥹¥Ú¡¼¥¹¤È¥Ý¥¤¥ó¥¿Áàºî¥ª¡¼¥Ð¥Ø¥Ã¥É¤Ëñ°ì¥ê
|
||
¥ó¥¯¤µ¤ì¤Þ¤¹¡£¿·¤·¤¤¥¨¥ì¥á¥ó¥È¤Ï¡¢´û¸¥¨¥ì¥á¥ó¥È¤Î¸å¤í¤«¥ê¥¹¥È¤ÎºÇ½é¤Ç
|
||
¥ê¥¹¥È¤ËÄɲäǤ¤Þ¤¹¡£
|
||
.Fa SLIST_HEAD
|
||
¹½Â¤ÂΤϡ¢°Ê²¼¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹¡£
|
||
.Bd -literal -offset indent
|
||
SLIST_HEAD(HEADNAME, TYPE) head;
|
||
.Ed
|
||
.Pp
|
||
.Li HEADNAME
|
||
¤ÏÄêµÁ¤¹¤ë¹½Â¤ÂΤÎ̾Á°¤Ç¡¢
|
||
.Li TYPE
|
||
¤Ï¥ê¥¹¥È¤Ë¥ê¥ó¥¯¤¹¤ë¥¨¥ì¥á¥ó¥È¤Î¥¿¥¤¥×¤Ç¤¹¡£¥ê¥¹¥È¤Î¥Ø¥Ã¥É¤Î¥Ý¥¤¥ó¥¿¤Ï¡¢
|
||
¸å¤Ç°Ê²¼¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹¡£
|
||
.Bd -literal -offset indent
|
||
struct HEADNAME *headp;
|
||
.Ed
|
||
.Pp
|
||
(¥æ¡¼¥¶¤Ï¡¢Ì¾Á°
|
||
.Li head
|
||
¤È
|
||
.Li headp
|
||
¤òÁªÂò¤Ç¤¤Þ¤¹¡£)
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm SLIST_ENTRY
|
||
¤Ï¡¢¥ê¥¹¥È¤Î¥¨¥ì¥á¥ó¥È¤òÀܳ¤¹¤ë¹½Â¤ÂΤòÀë¸À¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm SLIST_INIT
|
||
¤Ï¡¢
|
||
.Fa head
|
||
¤¬»²¾È¤¹¤ë¥ê¥¹¥È¤ò½é´ü²½¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm SLIST_INSERT_HEAD
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥ê¥¹¥È¤ÎºÇ½é¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm SLIST_INSERT_AFTER
|
||
¤Ï¡¢¥¨¥ì¥á¥ó¥È
|
||
.Fa listelm
|
||
¤Î¸å¤Ë¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤òÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm SLIST_REMOVE_HEAD
|
||
¤Ï¡¢¥ê¥¹¥È¤ÎºÇ½é¤«¤é¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤òºï½ü¤·¤Þ¤¹¡£Ç½Î¨¤ò¾å¤²¤ë¤Ë¤Ï¡¢¥ê¥¹¥È¤ÎºÇ½é¤«¤éºï½ü¤¹¤ë¥¨¥ì¥á¥ó¥È¤Ç¡¢
|
||
°ìÈÌŪ¤Ê
|
||
.Fa SLIST_REMOVE
|
||
¥Þ¥¯¥í¤ÎÂå¤ï¤ê¤Ë¤³¤Î¥Þ¥¯¥í¤òÌÀ¼¨Åª¤Ë»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Fa SLIST_REMOVE
|
||
¤Ï¡¢¥ê¥¹¥È¤«¤é¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤òºï½ü¤·¤Þ¤¹¡£
|
||
.Sh ñ°ì¥ê¥ó¥¯¥ê¥¹¥È¤Î»ÈÍÑÎã
|
||
.Bd -literal
|
||
SLIST_HEAD(slisthead, entry) head;
|
||
struct slisthead *headp; /* Singly-linked List head. */
|
||
struct entry {
|
||
...
|
||
SLIST_ENTRY(entry) entries; /* Singly-linked List. */
|
||
...
|
||
} *n1, *n2, *n3, *np;
|
||
|
||
SLIST_INIT(&head); /* Initialize the list. */
|
||
|
||
n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
|
||
SLIST_INSERT_HEAD(&head, n1, entries);
|
||
|
||
n2 = malloc(sizeof(struct entry)); /* Insert after. */
|
||
SLIST_INSERT_AFTER(n1, n2, entries);
|
||
|
||
SLIST_REMOVE(&head, n2, entry, entries);/* Deletion. */
|
||
free(n2);
|
||
|
||
n3 = head.slh_first;
|
||
SLIST_REMOVE_HEAD(&head, entries); /* Deletion. */
|
||
free(n3);
|
||
|
||
/* Forward traversal. */
|
||
for (np = head.slh_first; np != NULL; np = np->entries.sle_next)
|
||
np-> ...
|
||
|
||
while (head.slh_first != NULL) { /* List Deletion. */
|
||
n1 = head.slh_first;
|
||
SLIST_REMOVE_HEAD(&head, entries);
|
||
free(n1);
|
||
}
|
||
.Ed
|
||
.Sh ñ°ì¥ê¥ó¥¯¥Æ¡¼¥ë¥¥å¡¼
|
||
ñ°ì¥ê¥ó¥¯¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤Ë¤Ï¡¢
|
||
.Nm STAILQ_HEAD
|
||
¥Þ¥¯¥í¤¬ÄêµÁ¤¹¤ë¹½Â¤ÂΤ¬ÉÕ¤¤Þ¤¹¡£¤³¤Î¹½Â¤ÂΤˤϡ¢¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤Î
|
||
¥¨¥ì¥á¥ó¥È¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤È¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ¸å¤Î¥¨¥ì¥á¥ó¥È¤ò»Ø¤¹¥Ý¥¤¥ó¥¿
|
||
¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¥¨¥ì¥á¥ó¥È¤Ï¡¢Ç¤°Õ¤Î¥¨¥ì¥á¥ó¥È¤Î O(n) ºï½ü¤òµ¾À·¤Ë¤·¤Æ¡¢
|
||
ºÇÄ㥹¥Ú¡¼¥¹¤È¥Ý¥¤¥ó¥¿Áàºî¥ª¡¼¥Ð¥Ø¥Ã¥É¤Ëñ°ì¥ê¥ó¥¯¤µ¤ì¤Þ¤¹¡£¿·¤·¤¤¥¨¥ì
|
||
¥á¥ó¥È¤Ï¡¢´û¸¥¨¥ì¥á¥ó¥È¤Î¸å¤í¡¢¤Þ¤¿¤Ï¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤«ºÇ¸å¤ËÄɲäÇ
|
||
¤¤Þ¤¹¡£
|
||
.Fa STAILQ_HEAD
|
||
¹½Â¤¤Ï¡¢°Ê²¼¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹¡£
|
||
.Bd -literal -offset indent
|
||
STAILQ_HEAD(HEADNAME, TYPE) head;
|
||
.Ed
|
||
.Pp
|
||
.Li HEADNAME
|
||
¤ÏÄêµÁ¤¹¤ë¹½Â¤ÂΤÎ̾Á°¤Ç¡¢
|
||
.Li TYPE
|
||
¤Ï¥Æ¡¼¥ë¥¥å¡¼¤Ë¥ê¥ó¥¯¤¹¤ë¥¨¥ì¥á¥ó¥È¤Î¥¿¥¤¥×¤Ç¤¹¡£¥Æ¡¼¥ë¥¥å¡¼¤Î¥Ø¥Ã¥É
|
||
¤Î¥Ý¥¤¥ó¥¿¤Ï¡¢¸å¤Ç°Ê²¼¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹¡£
|
||
.Bd -literal -offset indent
|
||
struct HEADNAME *headp;
|
||
.Ed
|
||
.Pp
|
||
(¥æ¡¼¥¶¤Ï¡¢Ì¾Á°
|
||
.Li head
|
||
¤È
|
||
.Li headp
|
||
¤òÁªÂò¤Ç¤¤Þ¤¹¡£)
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm STAILQ_ENTRY
|
||
¤Ï¡¢¥Æ¡¼¥ë¥¥å¡¼¤Î¥¨¥ì¥á¥ó¥È¤òÀܳ¤¹¤ë¹½Â¤ÂΤòÀë¸À¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm STAILQ_INIT
|
||
¤Ï¡¢
|
||
.Fa head
|
||
¤¬»²¾È¤¹¤ë¥Æ¡¼¥ë¥¥å¡¼¤ò½é´ü²½¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm STAILQ_INSERT_HEAD
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm STAILQ_INSERT_TAIL
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ¸å¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm STAILQ_INSERT_AFTER
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥¨¥ì¥á¥ó¥È
|
||
.Fa listelm
|
||
¤Î¸å¤í¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm STAILQ_REMOVE_HEAD
|
||
¤Ï¡¢¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤«¤é¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤òºï½ü¤·¤Þ¤¹¡£Ç½Î¨¤ò¾å¤²¤ë¤Ë¤Ï¡¢¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤«¤éºï½ü¤¹¤ë¥¨¥ì¥á¥ó
|
||
¥È¤Ç¡¢°ìÈÌŪ¤Ê
|
||
.Fa STAILQ_REMOVE
|
||
¥Þ¥¯¥í¤ÎÂå¤ï¤ê¤Ë¤³¤Î¥Þ¥¯¥í¤òÌÀ¼¨Åª¤Ë»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Fa STAILQ_REMOVE
|
||
¤Ï¡¢¥Æ¡¼¥ë¥¥å¡¼¤«¤é¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤òºï½ü¤·¤Þ¤¹¡£
|
||
.Sh ñ°ì¥ê¥ó¥¯¥Æ¡¼¥ë¥¥å¡¼¤Î»ÈÍÑÎã
|
||
.Bd -literal
|
||
STAILQ_HEAD(stailhead, entry) head;
|
||
struct stailhead *headp; /* Singly-linked tail queue head. */
|
||
struct entry {
|
||
...
|
||
STAILQ_ENTRY(entry) entries; /* Tail queue. */
|
||
...
|
||
} *n1, *n2, *n3, *np;
|
||
|
||
STAILQ_INIT(&head); /* Initialize the queue. */
|
||
|
||
n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
|
||
STAILQ_INSERT_HEAD(&head, n1, entries);
|
||
|
||
n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */
|
||
STAILQ_INSERT_TAIL(&head, n1, entries);
|
||
|
||
n2 = malloc(sizeof(struct entry)); /* Insert after. */
|
||
STAILQ_INSERT_AFTER(&head, n1, n2, entries);
|
||
|
||
/* Deletion. */
|
||
STAILQ_REMOVE(&head, n2, entry, entries);
|
||
free(n2);
|
||
|
||
/* Deletion from the head */
|
||
n3 = head.stqh_first;
|
||
STAILQ_REMOVE_HEAD(&head, entries);
|
||
free(n3);
|
||
|
||
/* Forward traversal. */
|
||
for (np = head.stqh_first; np != NULL; np = np->entries.stqe_next)
|
||
np-> ...
|
||
/* TailQ Deletion. */
|
||
while (head.stqh_first != NULL) {
|
||
n1 = head.stqh_first;
|
||
TAILQ_REMOVE_HEAD(&head, entries);
|
||
free(n1);
|
||
}
|
||
/* Faster TailQ Deletion. */
|
||
n1 = head.stqh_first;
|
||
while (n1 != NULL) {
|
||
n2 = n1->entries.stqe_next;
|
||
free(n1);
|
||
n1 = n2;
|
||
}
|
||
STAILQ_INIT(&head);
|
||
.Ed
|
||
.Sh ¥ê¥¹¥È
|
||
¥ê¥¹¥È¤ÎºÇ½é¤Ë¤Ï¡¢
|
||
.Nm LIST_HEAD
|
||
¥Þ¥¯¥í¤¬ÄêµÁ¤¹¤ë¹½Â¤ÂΤ¬ÉÕ¤¤Þ¤¹¡£¤³¤Î¹½Â¤ÂΤˤϡ¢¥ê¥¹¥È¤ÎºÇ½é¤Î¥¨¥ì¥á
|
||
¥ó¥È¤ò»Ø¤¹ 1¤Ä¤Î¥Ý¥¤¥ó¥¿¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¥¨¥ì¥á¥ó¥È¤ÏÆó½Å¤Ë¥ê¥ó¥¯¤µ¤ì¤Æ¤¤
|
||
¤ë¤Î¤Ç¡¢¥ê¥¹¥È¤ò²£ÃǤ»¤º¤ËǤ°Õ¤Î¥¨¥ì¥á¥ó¥È¤òºï½ü¤Ç¤¤Þ¤¹¡£¿·¤·¤¤¥¨¥ì¥á
|
||
¥ó¥È¤Ï¡¢´û¸¥¨¥ì¥á¥ó¥È¤ÎÁ°¸å¤«¥ê¥¹¥È¤ÎºÇ½é¤Ç¥ê¥¹¥È¤ËÄɲäǤ¤Þ¤¹¡£
|
||
.Fa LIST_HEAD
|
||
¹½Â¤ÂΤϡ¢°Ê²¼¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹¡£
|
||
.Bd -literal -offset indent
|
||
LIST_HEAD(HEADNAME, TYPE) head;
|
||
.Ed
|
||
.Pp
|
||
.Fa HEADNAME
|
||
¤ÏÄêµÁ¤¹¤ë¹½Â¤ÂΤÎ̾Á°¤Ç¡¢
|
||
.Fa TYPE
|
||
¤Ï¥ê¥¹¥È¤Ë¥ê¥ó¥¯¤¹¤ë¥¨¥ì¥á¥ó¥È¤Î¥¿¥¤¥×¤Ç¤¹¡£¥ê¥¹¥È¤Î¥Ø¥Ã¥É¤Î¥Ý¥¤¥ó¥¿¤Ï¡¢
|
||
¸å¤Ç°Ê²¼¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹¡£
|
||
.Bd -literal -offset indent
|
||
struct HEADNAME *headp;
|
||
.Ed
|
||
.Pp
|
||
(¥æ¡¼¥¶¤Ï¡¢Ì¾Á°
|
||
.Li head
|
||
¤È
|
||
.Li headp
|
||
¤òÁªÂò¤Ç¤¤Þ¤¹¡£)
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm LIST_ENTRY
|
||
¤Ï¡¢¥ê¥¹¥È¤Î¥¨¥ì¥á¥ó¥È¤òÀܳ¤¹¤ë¹½Â¤ÂΤòÀë¸À¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm LIST_INIT
|
||
¤Ï¡¢
|
||
.Fa head
|
||
¤¬»²¾È¤¹¤ë¥ê¥¹¥È¤ò½é´ü²½¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm LIST_INSERT_HEAD
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥ê¥¹¥È¤ÎºÇ½é¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm LIST_INSERT_AFTER
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥¨¥ì¥á¥ó¥È
|
||
.Fa listelm
|
||
¤Î¸å¤í¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm LIST_INSERT_BEFORE
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥¨¥ì¥á¥ó¥È
|
||
.Fa listelm
|
||
¤ÎÁ°¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm LIST_REMOVE
|
||
¤Ï¡¢¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥ê¥¹¥È¤«¤éºï½ü¤·¤Þ¤¹¡£
|
||
.Sh ¥ê¥¹¥È¤Î»ÈÍÑÎã
|
||
.Bd -literal
|
||
LIST_HEAD(listhead, entry) head;
|
||
struct listhead *headp; /* List head. */
|
||
struct entry {
|
||
...
|
||
LIST_ENTRY(entry) entries; /* List. */
|
||
...
|
||
} *n1, *n2, *n3, *np;
|
||
|
||
LIST_INIT(&head); /* Initialize the list. */
|
||
|
||
n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
|
||
LIST_INSERT_HEAD(&head, n1, entries);
|
||
|
||
n2 = malloc(sizeof(struct entry)); /* Insert after. */
|
||
LIST_INSERT_AFTER(n1, n2, entries);
|
||
|
||
n3 = malloc(sizeof(struct entry)); /* Insert before. */
|
||
LIST_INSERT_BEFORE(n2, n3, entries);
|
||
|
||
LIST_REMOVE(n2, entries); /* Deletion. */
|
||
free(n2);
|
||
|
||
/* Forward traversal. */
|
||
for (np = head.lh_first; np != NULL; np = np->entries.le_next)
|
||
np-> ...
|
||
|
||
while (head.lh_first != NULL) { /* List Deletion. */
|
||
n1 = head.lh_first;
|
||
LIST_REMOVE(n1, entries);
|
||
free(n1);
|
||
}
|
||
|
||
n1 = head.lh_first; /* Faster List Delete. */
|
||
while (n1 != NULL) {
|
||
n2 = n1->entries.le_next;
|
||
free(n1);
|
||
n1 = n2;
|
||
}
|
||
LIST_INIT(&head);
|
||
|
||
.Ed
|
||
.Sh ¥Æ¡¼¥ë¥¥å¡¼
|
||
¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤Ë¤Ï¡¢
|
||
.Nm TAILQ_HEAD
|
||
¥Þ¥¯¥í¤¬ÄêµÁ¤¹¤ë¹½Â¤ÂΤ¬ÉÕ¤¤Þ¤¹¡£¤³¤Î¹½Â¤ÂΤˤϡ¢¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤Î
|
||
¥¨¥ì¥á¥ó¥È¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤È¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ¸å¤Î¥¨¥ì¥á¥ó¥È¤ò»Ø¤¹¥Ý¥¤¥ó¥¿
|
||
¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¥¨¥ì¥á¥ó¥È¤ÏÆó½Å¤Ë¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥Æ¡¼¥ë¥¥å¡¼¤ò²£
|
||
ÃǤ»¤º¤ËǤ°Õ¤Î¥¨¥ì¥á¥ó¥È¤òºï½ü¤Ç¤¤Þ¤¹¡£¿·¤·¤¤¥¨¥ì¥á¥ó¥È¤Ï¡¢´û¸¥¨¥ì¥á
|
||
¥ó¥È¤ÎÁ°¸å¡¢¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤ÈºÇ¸å¤Ç¥Æ¡¼¥ë¥¥å¡¼¤ËÄɲäǤ¤Þ¤¹¡£
|
||
.Fa TAILQ_HEAD
|
||
¹½Â¤ÂΤϡ¢°Ê²¼¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹¡£
|
||
.Bd -literal -offset indent
|
||
TAILQ_HEAD(HEADNAME, TYPE) head;
|
||
.Ed
|
||
.Pp
|
||
.Li HEADNAME
|
||
¤ÏÄêµÁ¤¹¤ë¹½Â¤ÂΤÎ̾Á°¤Ç¡¢
|
||
.Li TYPE
|
||
¤Ï¥Æ¡¼¥ë¥¥å¡¼¤Ë¥ê¥ó¥¯¤¹¤ë¥¨¥ì¥á¥ó¥È¤Î¥¿¥¤¥×¤Ç¤¹¡£¥Æ¡¼¥ë¥¥å¡¼¤Î¥Ø¥Ã¥É
|
||
¤Î¥Ý¥¤¥ó¥¿¤Ï¡¢¸å¤Ç°Ê²¼¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹¡£
|
||
.Bd -literal -offset indent
|
||
struct HEADNAME *headp;
|
||
.Ed
|
||
.Pp
|
||
(¥æ¡¼¥¶¤Ï¡¢Ì¾Á°
|
||
.Li head
|
||
¤È
|
||
.Li headp
|
||
¤òÁªÂò¤Ç¤¤Þ¤¹¡£)
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_EMPTY
|
||
¤Ï¡¢¥Æ¡¼¥ë¥¥å¡¼¤Ë¥¢¥¤¥Æ¥à¤¬¤Ê¤¤¾ì¹ç¤Ë¿¿¤òÌᤷ¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_ENTRY
|
||
¤Ï¡¢¥Æ¡¼¥ë¥¥å¡¼¤Î¥¨¥ì¥á¥ó¥È¤òÀܳ¤¹¤ë¹½Â¤ÂΤòÀë¸À¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_FIRST
|
||
¤Ï¡¢¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤Î¥¢¥¤¥Æ¥à¤òÌᤷ¤Þ¤¹¡£¥Æ¡¼¥ë¥¥å¡¼¤Ë¥¢¥¤¥Æ¥à¤¬¤Ê
|
||
¤¤¾ì¹ç¤Ï NULL ¤òÌᤷ¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_INIT
|
||
¤Ï¡¢
|
||
.Fa head
|
||
¤¬»²¾È¤¹¤ë¥Æ¡¼¥ë¥¥å¡¼¤ò½é´ü²½¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_INSERT_HEAD
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ½é¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_INSERT_TAIL
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ¸å¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_INSERT_AFTER
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥¨¥ì¥á¥ó¥È
|
||
.Fa listelm
|
||
¤Î¸å¤í¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_INSERT_BEFORE
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥¨¥ì¥á¥ó¥È
|
||
.Fa listelm
|
||
¤ÎÁ°¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_LAST
|
||
¤Ï¡¢¥Æ¡¼¥ë¥¥å¡¼¤ÎºÇ¸å¤Î¥¢¥¤¥Æ¥à¤òÌᤷ¤Þ¤¹¡£¥Æ¡¼¥ë¥¥å¡¼¤Ë¥¢¥¤¥Æ¥à¤¬¤Ê
|
||
¤¤¾ì¹ç¤ÎÌá¤êÃͤÏÉÔÄê¤Ç¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_NEXT
|
||
¤Ï¡¢¥Æ¡¼¥ë¥¥å¡¼¤Î¼¡¤Î¥¢¥¤¥Æ¥à¤òÌᤷ¤Þ¤¹¡£¤½¤Î¥¢¥¤¥Æ¥à¤¬ºÇ¸å¤Î¾ì¹ç¤Ï
|
||
NULL ¤òÌᤷ¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm TAILQ_REMOVE
|
||
¤Ï¡¢¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥Æ¡¼¥ë¥¥å¡¼¤«¤éºï½ü¤·¤Þ¤¹¡£
|
||
.Sh ¥Æ¡¼¥ë¥¥å¡¼¤Î»ÈÍÑÎã
|
||
.Bd -literal
|
||
TAILQ_HEAD(tailhead, entry) head;
|
||
struct tailhead *headp; /* Tail queue head. */
|
||
struct entry {
|
||
...
|
||
TAILQ_ENTRY(entry) entries; /* Tail queue. */
|
||
...
|
||
} *n1, *n2, *n3, *np;
|
||
|
||
TAILQ_INIT(&head); /* Initialize the queue. */
|
||
|
||
n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
|
||
TAILQ_INSERT_HEAD(&head, n1, entries);
|
||
|
||
n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */
|
||
TAILQ_INSERT_TAIL(&head, n1, entries);
|
||
|
||
n2 = malloc(sizeof(struct entry)); /* Insert after. */
|
||
TAILQ_INSERT_AFTER(&head, n1, n2, entries);
|
||
|
||
n3 = malloc(sizeof(struct entry)); /* Insert before. */
|
||
TAILQ_INSERT_BEFORE(n2, n3, entries);
|
||
|
||
TAILQ_REMOVE(&head, n2, entries); /* Deletion. */
|
||
free(n2);
|
||
/* Forward traversal. */
|
||
for (np = TAILQ_FIRST(&head); np != NULL; np = TAILQ_NEXT(np, entries))
|
||
np-> ...
|
||
/* TailQ Deletion. */
|
||
while (!TAILQ_EMPTY(head)) {
|
||
n1 = TAILQ_FIRST(&head);
|
||
TAILQ_REMOVE(&head, head.tqh_first, entries);
|
||
free(n1);
|
||
}
|
||
/* Faster TailQ Deletion. */
|
||
|
||
n1 = TAILQ_FIRST(&head);
|
||
while (n1 != NULL) {
|
||
n2 = TAILQ_NEXT(n1, entries);
|
||
free(n1);
|
||
n1 = n2;
|
||
}
|
||
TAILQ_INIT(&head);
|
||
.Ed
|
||
.Sh ½Û´Ä¥¥å¡¼
|
||
½Û´Ä¥¥å¡¼¤ÎºÇ½é¤Ë¤Ï¡¢
|
||
.Nm CIRCLEQ_HEAD
|
||
¥Þ¥¯¥í¤¬ÄêµÁ¤¹¤ë¹½Â¤ÂΤ¬ÉÕ¤¤Þ¤¹¡£¤³¤Î¹½Â¤ÂΤˤϡ¢½Û´Ä¥¥å¡¼¤ÎºÇ½é¤Î¥¨
|
||
¥ì¥á¥ó¥È¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤È½Û´Ä¥¥å¡¼¤ÎºÇ¸å¤Î¥¨¥ì¥á¥ó¥È¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤¬´Þ
|
||
¤Þ¤ì¤Þ¤¹¡£¥¨¥ì¥á¥ó¥È¤ÏÆó½Å¤Ë¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥¥å¡¼¤ò²£ÃǤ»¤º¤ËǤ
|
||
°Õ¤Î¥¨¥ì¥á¥ó¥È¤òºï½ü¤Ç¤¤Þ¤¹¡£¿·¤·¤¤¥¨¥ì¥á¥ó¥È¤Ï¡¢´û¸¥¨¥ì¥á¥ó¥È¤ÎÁ°¸å¡¢
|
||
¤Þ¤¿¤Ï¥¥å¡¼¤ÎºÇ½é¤ÈºÇ¸å¤Ç¥¥å¡¼¤ËÄɲäǤ¤Þ¤¹¡£
|
||
.Fa CIRCLEQ_HEAD
|
||
¹½Â¤¤Ï¡¢°Ê²¼¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹¡£
|
||
.Bd -literal -offset indent
|
||
CIRCLEQ_HEAD(HEADNAME, TYPE) head;
|
||
.Ed
|
||
.Pp
|
||
.Li HEADNAME
|
||
¤ÏÄêµÁ¤¹¤ë¹½Â¤ÂΤÎ̾Á°¤Ç¡¢
|
||
.Li TYPE
|
||
¤Ï½Û´Ä¥¥å¡¼¤Ë¥ê¥ó¥¯¤¹¤ë¥¨¥ì¥á¥ó¥È¤Î¥¿¥¤¥×¤Ç¤¹¡£½Û´Ä¥¥å¡¼¤Î¥Ø¥Ã¥É¤Î¥Ý
|
||
¥¤¥ó¥¿¤Ï¡¢¸å¤Ç°Ê²¼¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹¡£
|
||
.Bd -literal -offset indent
|
||
struct HEADNAME *headp;
|
||
.Ed
|
||
.Pp
|
||
(¥æ¡¼¥¶¤Ï¡¢Ì¾Á°
|
||
.Li head
|
||
¤È
|
||
.Li headp
|
||
¤òÁªÂò¤Ç¤¤Þ¤¹¡£)
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm CIRCLEQ_ENTRY
|
||
¤Ï¡¢½Û´Ä¥¥å¡¼¤Î¥¨¥ì¥á¥ó¥È¤òÀܳ¤¹¤ë¹½Â¤ÂΤòÀë¸À¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm CIRCLEQ_INIT
|
||
¤Ï¡¢
|
||
.Fa head
|
||
¤¬»²¾È¤¹¤ë½Û´Ä¥¥å¡¼¤ò½é´ü²½¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm CIRCLEQ_INSERT_HEAD
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò½Û´Ä¥¥å¡¼¤ÎºÇ½é¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm CIRCLEQ_INSERT_TAIL
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò½Û´Ä¥¥å¡¼¤ÎºÇ¸å¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm CIRCLEQ_INSERT_AFTER
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥¨¥ì¥á¥ó¥È
|
||
.Fa listelm
|
||
¤Î¸å¤í¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm CIRCLEQ_INSERT_BEFORE
|
||
¤Ï¡¢¿·¤·¤¤¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò¥¨¥ì¥á¥ó¥È
|
||
.Fa listelm
|
||
¤ÎÁ°¤ËÁÞÆþ¤·¤Þ¤¹¡£
|
||
.Pp
|
||
¥Þ¥¯¥í
|
||
.Nm CIRCLEQ_REMOVE
|
||
¤Ï¡¢¥¨¥ì¥á¥ó¥È
|
||
.Fa elm
|
||
¤ò½Û´Ä¥¥å¡¼¤«¤éºï½ü¤·¤Þ¤¹¡£
|
||
.Sh ½Û´Ä¥¥å¡¼¤Î»ÈÍÑÎã
|
||
.Bd -literal
|
||
CIRCLEQ_HEAD(circleq, entry) head;
|
||
struct circleq *headp; /* Circular queue head. */
|
||
struct entry {
|
||
...
|
||
CIRCLEQ_ENTRY(entry) entries; /* Circular queue. */
|
||
...
|
||
} *n1, *n2, *np;
|
||
|
||
CIRCLEQ_INIT(&head); /* Initialize the circular queue. */
|
||
|
||
n1 = malloc(sizeof(struct entry)); /* Insert at the head. */
|
||
CIRCLEQ_INSERT_HEAD(&head, n1, entries);
|
||
|
||
n1 = malloc(sizeof(struct entry)); /* Insert at the tail. */
|
||
CIRCLEQ_INSERT_TAIL(&head, n1, entries);
|
||
|
||
n2 = malloc(sizeof(struct entry)); /* Insert after. */
|
||
CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries);
|
||
|
||
n2 = malloc(sizeof(struct entry)); /* Insert before. */
|
||
CIRCLEQ_INSERT_BEFORE(&head, n1, n2, entries);
|
||
|
||
CIRCLEQ_REMOVE(&head, n1, entries); /* Deletion. */
|
||
free(n1);
|
||
/* Forward traversal. */
|
||
for (np = head.cqh_first; np != (void *)&head; np = np->entries.cqe_next)
|
||
np-> ...
|
||
/* Reverse traversal. */
|
||
for (np = head.cqh_last; np != (void *)&head; np = np->entries.cqe_prev)
|
||
np-> ...
|
||
/* CircleQ Deletion. */
|
||
while (head.cqh_first != (void *)&head) {
|
||
n1 = head.cqh_first;
|
||
CIRCLEQ_REMOVE(&head, head.cqh_first, entries);
|
||
free(n1);
|
||
}
|
||
/* Faster CircleQ Deletion. */
|
||
n1 = head.cqh_first;
|
||
while (n1 != (void *)&head) {
|
||
n2 = n1->entries.cqh_next;
|
||
free(n1);
|
||
n1 = n2;
|
||
}
|
||
CIRCLEQ_INIT(&head);
|
||
.Ed
|
||
.Sh Îò»Ë
|
||
.Nm queue
|
||
´Ø¿ô¤Ï¡¢
|
||
.Bx 4.4
|
||
¤ËºÇ½é¤ËÅо줷¤Þ¤·¤¿¡£
|