XINU
Functions | Variables
queue.c File Reference

キュー操作API(キューの追加、キューの削除)を提供する。 More...

#include <xinu.h>
Include dependency graph for queue.c:

Go to the source code of this file.

Functions

pid32 dequeue (qid16 q)
 プロセスキューテーブルからキューを削除し、リスト先頭のプロセスIDを返す。 More...
 
pid32 enqueue (pid32 pid, qid16 q)
 プロセスをプロセスキューテーブルの末尾に挿入する。 More...
 

Variables

struct qentry queuetab [NQENT]
 

Detailed Description

キュー操作API(キューの追加、キューの削除)を提供する。

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

Definition in file queue.c.

Function Documentation

◆ dequeue()

pid32 dequeue ( qid16  q)

プロセスキューテーブルからキューを削除し、リスト先頭のプロセスIDを返す。

Parameters
[in]q使用するキューID
Returns
キューを削除した場合はリスト先頭のプロセスID、キューIDが不正の場合はSYSERR、
キューが空の場合はEMPTYを返す。

Definition at line 78 of file queue.c.

References EMPTY, getfirst(), isbadqid, isempty, qentry::qnext, qentry::qprev, queuetab, and SYSERR.

Referenced by resched(), signal(), signaln(), and wakeup().

81 {
82  pid32 pid; /* ID of process removed */
83 
84  if (isbadqid(q))
85  {
86  return SYSERR;
87  }
88  else if (isempty(q))
89  {
90  return EMPTY;
91  }
92 
93  pid = getfirst(q);
94  queuetab[pid].qprev = EMPTY;
95  queuetab[pid].qnext = EMPTY;
96  return pid;
97 }
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
struct qentry queuetab[NQENT]
Definition: queue.c:45
#define isbadqid(x)
キューIDが不正値かどうかをチェックする。
Definition: queue.h:132
#define EMPTY
次のキューインデックスもしくは前のキューインデックスがNULL値
Definition: queue.h:23
qid16 qnext
次のプロセスか末尾のプロセスのインデックス。
Definition: queue.h:39
#define isempty(q)
リストが空かどうかを返す。
Definition: queue.h:89
qid16 qprev
前のプロセスか先頭のプロセスのインデックス。
Definition: queue.h:41
pid32 getfirst(qid16)
キューの先頭からプロセスを取り出す。
Definition: getitem.c:13
int32 pid32
プロセスID
Definition: kernel.h:26
Here is the call graph for this function:
Here is the caller graph for this function:

◆ enqueue()

pid32 enqueue ( pid32  pid,
qid16  q 
)

プロセスをプロセスキューテーブルの末尾に挿入する。

Parameters
[in]pid挿入するプロセスID
[in]q使用するキューID
Returns
成功時はキューに挿入したプロセスID、引数不正時はSYSERRを返す。

Definition at line 53 of file queue.c.

References isbadpid, isbadqid, qentry::qnext, qentry::qprev, queuetab, queuetail, and SYSERR.

Referenced by wait().

54 {
55  qid16 tail, prev; /* Tail & previous node indexes */
56 
57  if (isbadqid(q) || isbadpid(pid))
58  {
59  return SYSERR;
60  }
61 
62  tail = queuetail(q);
63  prev = queuetab[tail].qprev;
64 
65  queuetab[pid].qnext = tail; /* Insert just before tail node */
66  queuetab[pid].qprev = prev;
67  queuetab[prev].qnext = pid;
68  queuetab[tail].qprev = pid;
69  return pid;
70 }
#define isbadpid(x)
プロセスIDを検証する。割り込みが無効になっている事を想定している。
Definition: process.h:71
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
struct qentry queuetab[NQENT]
Definition: queue.c:45
#define isbadqid(x)
キューIDが不正値かどうかをチェックする。
Definition: queue.h:132
qid16 qnext
次のプロセスか末尾のプロセスのインデックス。
Definition: queue.h:39
qid16 qprev
前のプロセスか先頭のプロセスのインデックス。
Definition: queue.h:41
int16 qid16
キューID
Definition: kernel.h:24
#define queuetail(q)
キューの末尾を返す。
Definition: queue.h:61
Here is the caller graph for this function:

Variable Documentation

◆ queuetab

struct qentry queuetab[NQENT]

プロセスキューテーブル(全てのプロセスがアクセス可能な変数)。
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().