XINU
wait.c
Go to the documentation of this file.
1 /* wait.c - wait */
2 
3 #include <xinu.h>
4 
5 /*------------------------------------------------------------------------
6  * wait - Cause current process to wait on a semaphore
7  *------------------------------------------------------------------------
8  */
10  sid32 sem /* Semaphore on which to wait */
11  )
12 {
13  intmask mask; /* Saved interrupt mask */
14  struct procent *prptr; /* Ptr to process's table entry */
15  struct sentry *semptr; /* Ptr to sempahore table entry */
16 
17  mask = disable();
18  if (isbadsem(sem)) {
19  restore(mask);
20  return SYSERR;
21  }
22 
23  semptr = &semtab[sem];
24  if (semptr->sstate == S_FREE) {
25  restore(mask);
26  return SYSERR;
27  }
28 
29  if (--(semptr->scount) < 0) { /* If caller must block */
30  prptr = &proctab[currpid];
31  prptr->prstate = PR_WAIT; /* Set state to waiting */
32  prptr->prsem = sem; /* Record semaphore ID */
33  enqueue(currpid,semptr->squeue);/* Enqueue on semaphore */
34  resched(); /* and reschedule */
35  }
36 
37  restore(mask);
38  return OK;
39 }
pid32 currpid
現在実行中のプロセス。
Definition: initialize.c:32
pid32 enqueue(pid32, qid16)
プロセスをプロセスキューテーブルの末尾に挿入する。
Definition: queue.c:53
syscall wait(sid32 sem)
Definition: wait.c:9
void restore(intmask)
byte sstate
エントリ状態が利用可能(S_FREE)か、利用中(S_USED)かを表す。
Definition: semaphore.h:22
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
セマフォテーブルエントリであり、本構造体の配列(長さNSEM)が静的に確保される。
Definition: semaphore.h:19
#define isbadsem(s)
セマフォIDが不適切かどうかを確認する。
Definition: semaphore.h:40
#define OK
処理が成功した場合
Definition: kernel.h:77
sid32 prsem
プロセスが待機しているセマフォ。
Definition: process.h:100
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
uint16 prstate
プロセス状態(PR_CURR, ..., etc)。
Definition: process.h:88
void resched(void)
最優先の適切なプロセスにCPU実行権を渡す。
Definition: resched.c:22
qid16 squeue
セマフォ待機中プロセスのキュー
Definition: semaphore.h:26
struct procent proctab[]
プロセステーブル。
Definition: initialize.c:23
int32 syscall
システムコール関数 返り値の型
Definition: kernel.h:47
プロセステーブル(32bitsの倍数)。
Definition: process.h:85
int32 scount
セマフォカウント(負の値(-N)の場合は、キューにN個の待機プロセスがある。それ以外はキューが空である) ...
Definition: semaphore.h:24
#define S_FREE
セマフォテーブルエントリが利用可能
Definition: semaphore.h:11
int32 sid32
セマフォID
Definition: kernel.h:22
struct sentry semtab[]
セマフォテーブルエントリのextern宣言
Definition: initialize.c:25
#define PR_WAIT
プロセスがセマフォ上で待機中の状態。
Definition: process.h:47
intmask disable(void)
割り込み禁止(intr.Sに定義がある)