XINU
semdelete.c
Go to the documentation of this file.
1 
5 #include <xinu.h>
6 
23 {
24  intmask mask; /* Saved interrupt mask */
25  struct sentry *semptr; /* Ptr to semaphore table entry */
26 
27  mask = disable();
28  if (isbadsem(sem))
29  {
30  restore(mask);
31  return SYSERR;
32  }
33 
34  semptr = &semtab[sem];
35  if (semptr->sstate == S_FREE)
36  {
37  restore(mask);
38  return SYSERR;
39  }
40  semptr->sstate = S_FREE;
41 
43  while (semptr->scount++ < 0)
44  { /* Free all waiting processes */
45  ready(getfirst(semptr->squeue));
46  }
48  restore(mask);
49  return OK;
50 }
void restore(intmask)
byte sstate
エントリ状態が利用可能(S_FREE)か、利用中(S_USED)かを表す。
Definition: semaphore.h:22
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
セマフォテーブルエントリであり、本構造体の配列(長さNSEM)が静的に確保される。
Definition: semaphore.h:19
syscall semdelete(sid32 sem)
セマフォテーブルエントリを解放し、セマフォを削除する。
Definition: semdelete.c:22
#define isbadsem(s)
セマフォIDが不適切かどうかを確認する。
Definition: semaphore.h:40
#define OK
処理が成功した場合
Definition: kernel.h:77
status ready(pid32)
プロセスをCPUサービスの対象にする。
Definition: ready.c:21
status resched_cntl(int32)
再スケジューリングを延期させるか、もしくは許可させるかを制御する。
Definition: resched.c:81
#define DEFER_STOP
遅延リスケジューリングの停止
Definition: resched.h:10
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
#define DEFER_START
遅延リスケジューリングの開始
Definition: resched.h:8
qid16 squeue
セマフォ待機中プロセスのキュー
Definition: semaphore.h:26
pid32 getfirst(qid16)
キューの先頭からプロセスを取り出す。
Definition: getitem.c:13
int32 syscall
システムコール関数 返り値の型
Definition: kernel.h:47
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
intmask disable(void)
割り込み禁止(intr.Sに定義がある)