XINU
queue.c
Go to the documentation of this file.
1 
8 #include <xinu.h>
9 
46 
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 }
71 
79  qid16 q /* ID of queue to use */
80 )
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 isbadpid(x)
プロセスIDを検証する。割り込みが無効になっている事を想定している。
Definition: process.h:71
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
struct qentry queuetab[NQENT]
Definition: queue.c:45
pid32 enqueue(pid32 pid, qid16 q)
プロセスをプロセスキューテーブルの末尾に挿入する。
Definition: queue.c:53
#define isbadqid(x)
キューIDが不正値かどうかをチェックする。
Definition: queue.h:132
プロセスエントリであり、本構造体の配列(長さNQENT)がプロセスキューテーブルとなる。 ...
Definition: queue.h:34
#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
#define NQENT
Definition: queue.h:19
int16 qid16
キューID
Definition: kernel.h:24
pid32 getfirst(qid16)
キューの先頭からプロセスを取り出す。
Definition: getitem.c:13
pid32 dequeue(qid16 q)
プロセスキューテーブルからキューを削除し、リスト先頭のプロセスIDを返す。
Definition: queue.c:78
int32 pid32
プロセスID
Definition: kernel.h:26
#define queuetail(q)
キューの末尾を返す。
Definition: queue.h:61