XINU
Functions
signaln.c File Reference
#include <xinu.h>
Include dependency graph for signaln.c:

Go to the source code of this file.

Functions

syscall signaln (sid32 sem, int32 count)
 セマフォにシグナルをN回送り、N個の待機プロセスがある場合はそれらをREADY状態にする。 More...
 

Function Documentation

◆ signaln()

syscall signaln ( sid32  sem,
int32  count 
)

セマフォにシグナルをN回送り、N個の待機プロセスがある場合はそれらをREADY状態にする。

基本的な仕様は signal()と同様であり、差異は以下の通りである。
 ・待機プロセスがある限り、シグナル送信を続ける事(送信上限は引数で指定された回数)
 ・プロセスをREADY状態にする間は再スケジューリングを遅延(Defer)させる事

Parameters
[in]semシグナルを送信したいセマフォのID
[in]countシグナルを送信する数(最大)
Returns
シグナルを送信した場合はOK、「セマフォIDが不正な場合」や「引数で渡されたセマフォがFREE状態の場合」はSYSERRを返す。

Definition at line 16 of file signaln.c.

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

Referenced by ttyhandle_in(), and ttyhandle_out().

17 {
18  intmask mask; /* Saved interrupt mask */
19  struct sentry *semptr; /* Ptr to sempahore table entry */
20 
21  mask = disable();
22  if (isbadsem(sem) || (count < 0))
23  {
24  restore(mask);
25  return SYSERR;
26  }
27  semptr = &semtab[sem];
28  if (semptr->sstate == S_FREE)
29  {
30  restore(mask);
31  return SYSERR;
32  }
33 
35  for (; count > 0; count--)
36  {
37  if ((semptr->scount++) < 0)
38  {
39  ready(dequeue(semptr->squeue));
40  }
41  }
43  restore(mask);
44  return OK;
45 }
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
status resched_cntl(int32)
再スケジューリングを延期させるか、もしくは許可させるかを制御する。
Definition: resched.c:81
pid32 dequeue(qid16)
プロセスキューテーブルからキューを削除し、リスト先頭のプロセスIDを返す。
Definition: queue.c:78
#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
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: