XINU
Functions
semreset.c File Reference

セマフォカウントをリセットし、待機中のプロセスを全て解放する。 More...

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

Go to the source code of this file.

Functions

syscall semreset (sid32 sem, int32 count)
 セマフォカウントをリセットし、待機中のプロセスを全て解放する。 More...
 

Detailed Description

セマフォカウントをリセットし、待機中のプロセスを全て解放する。

Definition in file semreset.c.

Function Documentation

◆ semreset()

syscall semreset ( sid32  sem,
int32  count 
)

セマフォカウントをリセットし、待機中のプロセスを全て解放する。

Step1. 割り込みを禁止する。
Step2. 以下のいずれかを満たす場合、割り込みを許可状態に復元し、処理を終了する。
 ・引数で渡されたセマフォカウンタのリセット値が負の値の場合
 ・引数で渡されたセマフォIDが不整値の場合
 ・セマフォがFREE状態の場合
Step3. 待機状態プロセスを全てREADY状態に移行するまで、再スケジューリングを遅延(Defer)させる。
Step4. キュー操作API(getfirst())でキューの先頭から順番にプロセスIDを取り出し、READY状態にする。
Step5. 再スケジューリングの遅延を解除する。
Step6. 割り込みを許可状態に戻す。

Parameters
[in]semリセット対象のセマフォID
[in]count新しいセマフォカウント(0以上の値)
Returns
セマフォカウンタがリセットできた場合はOK、以下の場合はSYSERRを返す。
 ・引数で渡されたセマフォカウンタのリセット値が負の値の場合
 ・引数で渡されたセマフォIDが不整値の場合
 ・セマフォがFREE状態の場合

Definition at line 25 of file semreset.c.

References DEFER_START, DEFER_STOP, disable(), EMPTY, getfirst(), isbadsem, OK, ready(), resched_cntl(), restore(), S_FREE, sentry::scount, semtab, sentry::squeue, sentry::sstate, and SYSERR.

Referenced by _ptclear(), and rdswrite().

26 {
27  intmask mask; /* Saved interrupt mask */
28  struct sentry *semptr; /* Ptr to semaphore table entry */
29  qid16 semqueue; /* Semaphore's process queue ID */
30  pid32 pid; /* ID of a waiting process */
31 
32  mask = disable();
33 
34  if (count < 0 || isbadsem(sem) || semtab[sem].sstate == S_FREE)
35  {
36  restore(mask);
37  return SYSERR;
38  }
39 
40  semptr = &semtab[sem];
41  semqueue = semptr->squeue; /* Free any waiting processes */
43  while ((pid = getfirst(semqueue)) != EMPTY)
44  ready(pid);
45  semptr->scount = count; /* Reset count as specified */
47  restore(mask);
48  return OK;
49 }
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
status ready(pid32)
プロセスをCPUサービスの対象にする。
Definition: ready.c:21
#define EMPTY
次のキューインデックスもしくは前のキューインデックスがNULL値
Definition: queue.h:23
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
int16 qid16
キューID
Definition: kernel.h:24
qid16 squeue
セマフォ待機中プロセスのキュー
Definition: semaphore.h:26
pid32 getfirst(qid16)
キューの先頭からプロセスを取り出す。
Definition: getitem.c:13
int32 pid32
プロセスID
Definition: kernel.h:26
int32 scount
セマフォカウント(負の値(-N)の場合は、キューにN個の待機プロセスがある。それ以外はキューが空である) ...
Definition: semaphore.h:24
#define S_FREE
セマフォテーブルエントリが利用可能
Definition: semaphore.h:11
struct sentry semtab[]
セマフォテーブルエントリのextern宣言
Definition: initialize.c:25
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
Here is the call graph for this function:
Here is the caller graph for this function: