XINU
Data Structures | Macros | Variables
queue.h File Reference

キュー構造体に関する宣言/定数/インライン関数を定義する。 More...

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  qentry
 プロセスエントリであり、本構造体の配列(長さNQENT)がプロセスキューテーブルとなる。 More...
 

Macros

#define EMPTY   (-1)
 次のキューインデックスもしくは前のキューインデックスがNULL値 More...
 
#define firstid(q)   (queuetab[queuehead(q)].qnext)
 リストの最初のプロセスのIDを返す。 More...
 
#define firstkey(q)   (queuetab[firstid(q)].qkey)
 リスト中の最初のプロセスのキーを返す。 More...
 
#define isbadqid(x)   (((int32)(x) < NPROC) || (int32)(x) >= NQENT - 1)
 キューIDが不正値かどうかをチェックする。 More...
 
#define isempty(q)   (firstid(q) >= NPROC)
 リストが空かどうかを返す。 More...
 
#define lastid(q)   (queuetab[queuetail(q)].qprev)
 リストの最後のプロセスのIDを返す。 More...
 
#define lastkey(q)   (queuetab[lastid(q)].qkey)
 
#define MAXKEY   0x7FFFFFFF
 キューの中に格納できるキーの最大値 More...
 
#define MINKEY   0x80000000
 キューの中に格納できるキーの最小値 More...
 
#define nonempty(q)   (firstid(q) < NPROC)
 リストに中身(プロセス)があるかどうかを返す。 More...
 
#define NQENT   (NPROC + 4 + NSEM + NSEM)
 
#define queuehead(q)   (q)
 キューの先頭を返す。 More...
 
#define queuetail(q)   ((q) + 1)
 キューの末尾を返す。 More...
 

Variables

struct qentry queuetab []
 

Detailed Description

キュー構造体に関する宣言/定数/インライン関数を定義する。

Note
プロセスキューテーブルは、リストとも呼ばれる。

Definition in file queue.h.

Macro Definition Documentation

◆ EMPTY

#define EMPTY   (-1)

次のキューインデックスもしくは前のキューインデックスがNULL値

Definition at line 23 of file queue.h.

Referenced by dequeue(), getfirst(), getlast(), newqueue(), and semreset().

◆ firstid

#define firstid (   q)    (queuetab[queuehead(q)].qnext)

リストの最初のプロセスのIDを返す。

Parameters
[in]qキューID
Returns
リストの最初のプロセスのID
Note
リストは必ず先頭と末尾を持っている。先頭のqnextには、最初のプロセスIDが入っている。

Definition at line 70 of file queue.h.

Referenced by clkhandler(), and insert().

◆ firstkey

#define firstkey (   q)    (queuetab[firstid(q)].qkey)

リスト中の最初のプロセスのキーを返す。

リスト中の最後のプロセスのキーを返す。

Parameters
[in]qキューID
Returns
リスト中の最初のプロセスのキー(最初のプロセスのqueuetabインデックス)
Parameters
[in]qキューID
Returns
リスト中の最後のプロセスのキー(最後のプロセスのqueuetabインデックス)

Referenced by resched(), and wakeup().

◆ isbadqid

#define isbadqid (   x)    (((int32)(x) < NPROC) || (int32)(x) >= NQENT - 1)

キューIDが不正値かどうかをチェックする。

Parameters
[in]xキューID

割り込みが禁止された状態である事を想定している。
キューIDの不正とは、
① キューIDがユーザプロセス総数(NPROC)より小さい ② キューIDがデフォルトキューエントリ総数以上 のいずれかである。

Returns
不正なキューIDの場合はtrue、それ以外の場合はfalseを返す。
Note
上記①に関しては、XINUオペレーティングシステムデザイン改訂2版では、
「キューIDが負の値か」という条件であった。この考え方は、配列操作の観点から正しい。
XINUとしての仕様では、0 < x <NPROCの範囲はプロセスが使用し、それ以上の範囲をキューが使用するため、
isbadqid()の仕様を変えたと思われる。

Definition at line 132 of file queue.h.

Referenced by dequeue(), enqueue(), insert(), and insertd().

◆ isempty

#define isempty (   q)    (firstid(q) >= NPROC)

リストが空かどうかを返す。

Parameters
[in]qキューID
Returns
リストが空の場合はtrue、それ以外はfalseを返す。
Note
リストは必ず先頭と末尾を持っていて、それらのインデックスはNPROC以上である。
リストの最初のノード(先頭のqnext)がNPROC以上の場合は、先頭と末尾しか無い(リストが空)とみなせる

Definition at line 89 of file queue.h.

Referenced by clkhandler(), dequeue(), getfirst(), and getlast().

◆ lastid

#define lastid (   q)    (queuetab[queuetail(q)].qprev)

リストの最後のプロセスのIDを返す。

Parameters
[in]qキューID
Returns
リストの最後のプロセスのID
Note
リストは必ず先頭と末尾を持っている。末尾のqprevには、最後のプロセスIDが入っている。

Definition at line 79 of file queue.h.

◆ lastkey

#define lastkey (   q)    (queuetab[lastid(q)].qkey)

Definition at line 115 of file queue.h.

◆ MAXKEY

#define MAXKEY   0x7FFFFFFF

キューの中に格納できるキーの最大値

Definition at line 25 of file queue.h.

Referenced by newqueue().

◆ MINKEY

#define MINKEY   0x80000000

キューの中に格納できるキーの最小値

Definition at line 27 of file queue.h.

Referenced by newqueue().

◆ nonempty

#define nonempty (   q)    (firstid(q) < NPROC)

リストに中身(プロセス)があるかどうかを返す。

Parameters
[in]qキューID
Returns
リストが空の場合はtrue、それ以外はfalseを返す。
Note
リストは必ず先頭と末尾を持っていて、それらのインデックスはNPROC以上である。
リストの最初のノード(先頭のqnext)がNPROCより小さい場合は、プロセスが挿入されている。

Definition at line 99 of file queue.h.

Referenced by wakeup().

◆ NQENT

#define NQENT   (NPROC + 4 + NSEM + NSEM)

キューテーブルのエントリ数(=NQENT)は、条件付きコンパイルによって、動的に
そのサイズを変更できる(queue.hの修正が不要となる)。 キューテーブル配列に対するデフォルトキューエントリ数。 NPROC個のプロセスに加えて、READYリスト/休眠リスト/セマフォリストの先頭と
末尾のポインタを保持するためのエントリ数を定義している。
キューエントリは、プロセスごとに1個、レディリストに2個、休眠リストに2個、
セマフォに2個を割り当てている。

Definition at line 19 of file queue.h.

Referenced by newqueue().

◆ queuehead

#define queuehead (   q)    (q)

キューの先頭を返す。

Parameters
[in]qキューID
Returns
キュー先頭のキューID(引数のキューIDそのまま)を返す。

Definition at line 53 of file queue.h.

Referenced by getfirst(), insertd(), and newqueue().

◆ queuetail

#define queuetail (   q)    ((q) + 1)

キューの末尾を返す。

Parameters
[in]qキューID
Returns
キュー末尾のキューID(引数のキューIDに1を加算した値)を返す。

Definition at line 61 of file queue.h.

Referenced by enqueue(), getlast(), insertd(), and newqueue().

Variable Documentation

◆ queuetab

struct qentry queuetab[]

プロセスキューテーブル(全てのプロセスがアクセス可能な変数)。

プロセスキューテーブル(全てのプロセスがアクセス可能な変数)。
NPROC-1より小さいインデックスは、プロセスIDに対応する。
queuetab[NPROC]〜queuetab[NQENT]の範囲は、キューIDと呼ばれ、
・リスト先頭
・リスト末尾
のポインタを保持するために使用される。
あるリストの先頭/末尾ノードは、queuetab配列のインデックスNPROC以降に配置し、
必ず連続した配置となる(例:先頭ノード→末尾ノード→先頭ノード→末尾ノード…)
XINU内では、リストは先頭ノードのインデックスで識別および操作する仕様である。

queue_table.png
Note
以下はテーブルイメージ図であるが、Doxygenドキュメント上ではコメント表記が崩れるため、
note部分のスクショ画像も併記している。 ---------------------------------------------------------------—
| KEY | PREV | NEXT |↓1行がプロセスに対応する
------------------------------------------—
0 | XXX | XXXX | XXXX |
------------------------------------------—
1 | XXX | XXXX | XXXX |
------------------------------------------—
: | : |
------------------------------------------—
NPROC-1 | XXX | XXXX | XXXX |↓ ここまでがプロセス情報 -----------------------------------------------------------—
NPROC | : |↑ここから下はリスト先頭/末尾の組み合わせ
------------------------------------------—
: | : |
------------------------------------------—
: | MAXKEY | - | XXXX |リストの先頭
------------------------------------------—リストの末尾
: | MINKEY | XXXX | - |
------------------------------------------—
: | : |
------------------------------------------—

Definition at line 45 of file queue.c.

Referenced by clkhandler(), dequeue(), enqueue(), getfirst(), getitem(), getlast(), insert(), insertd(), newqueue(), and unsleep().