OSDN Git Service

c1273d18aee1300b4affa95c18ff5fa7eb23955f
[trx-305dsp/dsp.git] / trx305 / kernel / kernel / queue.h
1 /*
2  *  TOPPERS/JSP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Just Standard Profile Kernel
5  * 
6  *  Copyright (C) 2000 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  * 
9  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
10  *  によって公表されている GNU General Public License の Version 2 に記
11  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13  *  利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  * 
31  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
35  * 
36  *  @(#) $Id: queue.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
37  */
38
39 /*
40  *  キュー操作ライブラリ
41  *
42  *  このキュー操作ライブラリでは,キューヘッダを含むリング構造のダブル
43  *  リンクキューを扱う.具体的には,キューヘッダの次エントリはキューの
44  *  先頭のエントリ,前エントリはキューの末尾のエントリとする.また,キ
45  *  ューの先頭のエントリの前エントリと,キューの末尾のエントリの次エン
46  *  トリは,キューヘッダとする.空のキューは,次エントリ,前エントリと
47  *  も自分自身を指すキューヘッダであらわす.
48  */
49
50 #ifndef _QUEUE_H_
51 #define _QUEUE_H_
52
53 /*
54  *  キューのデータ構造の定義
55  */
56 typedef struct queue {
57     struct queue *next;     /* 次エントリへのポインタ */
58     struct queue *prev;     /* 前エントリへのポインタ */
59 } QUEUE;
60
61 /*
62  *  キューの初期化
63  *
64  *  queue にはキューヘッダを指定する.
65  */
66 Inline void
67 queue_initialize(QUEUE *queue)
68 {
69     queue->prev = queue->next = queue;
70 }
71
72 /*
73  *  キューの前エントリへの挿入
74  *
75  *  queue の前に entry を挿入する.queue にキューヘッダを指定した場合
76  *  には,キューの末尾に entry を挿入することになる.
77  */
78 Inline void
79 queue_insert_prev(QUEUE *queue, QUEUE *entry)
80 {
81     entry->prev = queue->prev;
82     entry->next = queue;
83     queue->prev->next = entry;
84     queue->prev = entry;
85 }
86
87 /*
88  *  エントリの削除
89  *
90  *  entry をキューから削除する.
91  */
92 Inline void
93 queue_delete(QUEUE *entry)
94 {
95     entry->prev->next = entry->next;
96     entry->next->prev = entry->prev;
97 }
98
99 /*
100  *  キューの次エントリの取出し
101  *
102  *  queue の次エントリをキューから削除し,削除したエントリを返す.queue
103  *  にキューヘッダを指定した場合には,キューの先頭のエントリを取り出す
104  *  ことになる.queue に空のキューを指定して呼び出してはならない.
105  */
106 Inline QUEUE *
107 queue_delete_next(QUEUE *queue)
108 {
109     QUEUE   *entry;
110
111     assert(queue->next != queue);
112     entry = queue->next;
113     queue->next = entry->next;
114     entry->next->prev = queue;
115     return(entry);
116 }
117
118 /*
119  *  キューが空かどうかのチェック
120  *
121  *  queue にはキューヘッダを指定する.
122  */
123 Inline BOOL
124 queue_empty(QUEUE *queue)
125 {
126     if (queue->next == queue) {
127         assert(queue->prev == queue);
128         return(TRUE);
129     }
130     return(FALSE);
131 }
132
133 #endif /* _QUEUE_H_ */