XINU
system
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
*/
9
syscall
wait
(
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
}
currpid
pid32 currpid
現在実行中のプロセス。
Definition:
initialize.c:32
enqueue
pid32 enqueue(pid32, qid16)
プロセスをプロセスキューテーブルの末尾に挿入する。
Definition:
queue.c:53
wait
syscall wait(sid32 sem)
Definition:
wait.c:9
restore
void restore(intmask)
sentry::sstate
byte sstate
エントリ状態が利用可能(S_FREE)か、利用中(S_USED)かを表す。
Definition:
semaphore.h:22
xinu.h
全てのシステムヘッダファイルをインクルードする。
SYSERR
#define SYSERR
処理が失敗した場合
Definition:
kernel.h:79
sentry
セマフォテーブルエントリであり、本構造体の配列(長さNSEM)が静的に確保される。
Definition:
semaphore.h:19
isbadsem
#define isbadsem(s)
セマフォIDが不適切かどうかを確認する。
Definition:
semaphore.h:40
OK
#define OK
処理が成功した場合
Definition:
kernel.h:77
procent::prsem
sid32 prsem
プロセスが待機しているセマフォ。
Definition:
process.h:100
intmask
uint32 intmask
保存された割り込みマスク
Definition:
kernel.h:38
procent::prstate
uint16 prstate
プロセス状態(PR_CURR, ..., etc)。
Definition:
process.h:88
resched
void resched(void)
最優先の適切なプロセスにCPU実行権を渡す。
Definition:
resched.c:22
sentry::squeue
qid16 squeue
セマフォ待機中プロセスのキュー
Definition:
semaphore.h:26
proctab
struct procent proctab[]
プロセステーブル。
Definition:
initialize.c:23
syscall
int32 syscall
システムコール関数 返り値の型
Definition:
kernel.h:47
procent
プロセステーブル(32bitsの倍数)。
Definition:
process.h:85
sentry::scount
int32 scount
セマフォカウント(負の値(-N)の場合は、キューにN個の待機プロセスがある。それ以外はキューが空である) ...
Definition:
semaphore.h:24
S_FREE
#define S_FREE
セマフォテーブルエントリが利用可能
Definition:
semaphore.h:11
sid32
int32 sid32
セマフォID
Definition:
kernel.h:22
semtab
struct sentry semtab[]
セマフォテーブルエントリのextern宣言
Definition:
initialize.c:25
PR_WAIT
#define PR_WAIT
プロセスがセマフォ上で待機中の状態。
Definition:
process.h:47
disable
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
Generated by
1.8.13