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
35 .\" 2007-12-08, mtk, Converted from mdoc to man macros
37 .\" Japanese Version Copyright (c) 2004 Yuichi SATO
38 .\" all rights reserved.
39 .\" Translated Thu Sep 2 04:41:11 JST 2004
40 .\" by Yuichi SATO <ysato444@yahoo.co.jp>
42 .\"WORD: circular queue 循環キュー
44 .TH QUEUE 3 2007-12-28 "Linux" "Linux Programmer's Manual"
46 LIST_ENTRY, LIST_HEAD, LIST_INIT, LIST_INSERT_AFTER, \
47 LIST_INSERT_HEAD, LIST_REMOVE, TAILQ_ENTRY, TAILQ_HEAD, \
48 TAILQ_INIT, TAILQ_INSERT_AFTER, TAILQ_INSERT_HEAD, TAILQ_INSERT_TAIL, \
49 TAILQ_REMOVE, CIRCLEQ_ENTRY, CIRCLEQ_HEAD, CIRCLEQ_INIT, \
50 CIRCLEQ_INSERT_AFTER, CIRCLEQ_INSERT_BEFORE, \
51 CIRCLEQ_INSERT_HEAD, CIRCLEQ_INSERT_TAIL, \
52 CIRCLEQ_REMOVE \- リスト・テール (tail) キュー・循環キューの実装
55 .B #include <sys/queue.h>
57 .BI "LIST_ENTRY(" TYPE );
58 .BI "LIST_HEAD(" HEADNAME ", " TYPE );
59 .BI "LIST_INIT(LIST_HEAD *" head );
60 .BI "LIST_INSERT_AFTER(LIST_ENTRY *" listelm ", "
61 .BI " TYPE *" elm ", LIST_ENTRY " NAME );
62 .BI "LIST_INSERT_HEAD(LIST_HEAD *" head ", "
63 .BI " TYPE *" elm ", LIST_ENTRY " NAME );
64 .BI "LIST_REMOVE(TYPE *" elm ", LIST_ENTRY " NAME );
66 .BI "TAILQ_ENTRY(" TYPE );
67 .BI "TAILQ_HEAD("HEADNAME ", " TYPE );
68 .BI "TAILQ_INIT(TAILQ_HEAD *" head );
69 .BI "TAILQ_INSERT_AFTER(TAILQ_HEAD *" head ", TYPE *" listelm ", "
70 .BI " TYPE *" elm ", TAILQ_ENTRY " NAME );
71 .BI "TAILQ_INSERT_HEAD(TAILQ_HEAD *" head ", "
72 .BI " TYPE *" elm ", TAILQ_ENTRY " NAME );
73 .BI "TAILQ_INSERT_TAIL(TAILQ_HEAD *" head ", "
74 .BI " TYPE *" elm ", TAILQ_ENTRY " NAME );
75 .BI "TAILQ_REMOVE(TAILQ_HEAD *" head ", TYPE *" elm ", TAILQ_ENTRY " NAME );
77 .BI CIRCLEQ_ENTRY( TYPE );
78 .BI "CIRCLEQ_HEAD(" HEADNAME ", " TYPE );
79 .BI "CIRCLEQ_INIT(CIRCLEQ_HEAD *" head );
80 .BI "CIRCLEQ_INSERT_AFTER(CIRCLEQ_HEAD *" head ", TYPE *" listelm ", "
81 .BI " TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
82 .BI "CIRCLEQ_INSERT_BEFORE(CIRCLEQ_HEAD *" head ", TYPE *" listelm ", "
83 .BI " TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
84 .BI "CIRCLEQ_INSERT_HEAD(CIRCLEQ_HEAD *" head ", "
85 .BI " TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
86 .BI "CIRCLEQ_INSERT_TAIL(CIRCLEQ_HEAD *" head ", "
87 .BI " TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
88 .BI "CIRCLEQ_REMOVE(CIRCLEQ_HEAD *" head ", "
89 .BI " TYPE *" elm ", CIRCLEQ_ENTRY " NAME );
92 これらのマクロは、次の 3 つのデータ構造を定義して操作する:
94 3 つのデータ構造すべてにおいて以下の機能がサポートされている:
101 新たなエントリをリストのどの要素よりも後に挿入する。
109 リストは 3 つのデータ構造の中で最も単純であり、
123 全てのリスト挿入と削除において、リストの先頭を指定しなければならない。
125 各先頭エントリは 1 つではなく 2 つのポインタを必要とする。
127 リストと比べて、コードサイズは 15% 大きくなり、操作は 20% 遅くなる。
149 全てのリスト挿入と削除において、リストの先頭を指定しなければならない。
151 各先頭エントリは 1 つではなく 2 つのポインタを必要とする。
155 リストと比べて、コードサイズは 40% 大きくなり、操作は 45% 遅くなる。
177 これらのマクロがどのように使われるかについての更なる説明は、
183 この構造体はリストの最初の要素へのポインタを 1 つ含む。
186 新しい要素は既存の要素の後またはリストの先頭に追加できる。
192 LIST_HEAD(HEADNAME, TYPE) head;
201 リストの先頭へのポインタは、その後で次のように宣言される:
205 struct HEADNAME *headp;
217 はリストの要素を接続する構造体を宣言する。
247 LIST_HEAD(listhead, entry) head;
248 struct listhead *headp; /* リストの先頭。*/
251 LIST_ENTRY(entry) entries; /* リスト。 */
255 LIST_INIT(&head); /* リストを初期化する。*/
257 n1 = malloc(sizeof(struct entry)); /* 先頭に挿入する。*/
258 LIST_INSERT_HEAD(&head, n1, entries);
260 n2 = malloc(sizeof(struct entry)); /* 後ろに挿入する。*/
261 LIST_INSERT_AFTER(n1, n2, entries);
263 for (np = head.lh_first; np != NULL; np = np\->entries.le_next)
266 while (head.lh_first != NULL) /* 削除する。*/
267 LIST_REMOVE(head.lh_first, entries);
273 この構造体は 1 組のポインタを含んでいる。
274 1 つはテールキューの最初の要素へのポインタであり、
275 もう 1 つはテールキューの最後の要素へのポインタである。
277 任意の要素はテールキューを辿らずに削除できる。
278 新しい要素は既存の要素の後またはテールキューの先頭または末尾に追加できる。
284 TAILQ_HEAD(HEADNAME, TYPE) head;
292 はテールキュー内でリンクされる要素の型である。
293 テールキューの先頭へのポインタは、その後で次のように宣言される:
297 struct HEADNAME *headp;
309 はテールキューの要素を接続する構造体を宣言する。
330 .B TAILQ_INSERT_AFTER
345 TAILQ_HEAD(tailhead, entry) head;
346 struct tailhead *headp; /* テールキューの先頭。*/
349 TAILQ_ENTRY(entry) entries; /* テールキュー。*/
353 TAILQ_INIT(&head); /* キューを初期化する。*/
355 n1 = malloc(sizeof(struct entry)); /* 先頭に挿入する。*/
356 TAILQ_INSERT_HEAD(&head, n1, entries);
358 n1 = malloc(sizeof(struct entry)); /* 末尾に挿入する。*/
359 TAILQ_INSERT_TAIL(&head, n1, entries);
361 n2 = malloc(sizeof(struct entry)); /* 後ろに挿入する。*/
362 TAILQ_INSERT_AFTER(&head, n1, n2, entries);
364 for (np = head.tqh_first; np != NULL; np = np\->entries.tqe_next)
367 while (head.tqh_first != NULL)
368 TAILQ_REMOVE(&head, head.tqh_first, entries);
374 この構造体は 1 組のポインタを含んでいる。
375 1 つは循環キューの最初の要素へのポインタであり、
376 もう 1 つは循環キューの最後の要素へのポインタである。
379 新しい要素は、既存の要素の後または前、またはキューの先頭または末尾に追加できる。
386 CIRCLEQ_HEAD(HEADNAME, TYPE) head;
394 は循環キュー内でリンクされる要素の型である。
395 循環キューの先頭へのポインタは、その後で次のように宣言される:
399 struct HEADNAME *headp;
411 は循環キューの要素を接続する構造体を宣言する。
420 .B CIRCLEQ_INSERT_HEAD
426 .B CIRCLEQ_INSERT_TAIL
432 .B CIRCLEQ_INSERT_AFTER
440 .B CIRCLEQ_INSERT_AFTER
455 CIRCLEQ_HEAD(circleq, entry) head;
456 struct circleq *headp; /* 循環キューの先頭。*/
459 CIRCLEQ_ENTRY(entry) entries; /* 循環キュー。*/
463 CIRCLEQ_INIT(&head); /* 循環キューを初期化する。*/
465 n1 = malloc(sizeof(struct entry)); /* 先頭に挿入する。*/
466 CIRCLEQ_INSERT_HEAD(&head, n1, entries);
468 n1 = malloc(sizeof(struct entry)); /* 末尾に挿入する。*/
469 CIRCLEQ_INSERT_TAIL(&head, n1, entries);
471 n2 = malloc(sizeof(struct entry)); /* 後ろに挿入する。*/
472 CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries);
474 n2 = malloc(sizeof(struct entry)); /* 前に挿入する。*/
475 CIRCLEQ_INSERT_BEFORE(&head, n1, n2, entries);
477 for (np = head.cqh_first; np != (void *)&head; np = np\->entries.cqe_next)
480 for (np = head.cqh_last; np != (void *)&head; np = np\->entries.cqe_prev)
483 while (head.cqh_first != (void *)&head)
484 CIRCLEQ_REMOVE(&head, head.cqh_first, entries);
489 queue 関数は 4.4BSD で初めて登場した。