XINU
Functions
signal.c File Reference

セマフォにシグナルを送り、待機プロセスがある場合はREADY状態にする。 More...

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

Go to the source code of this file.

Functions

syscall signal (sid32 sem)
 セマフォにシグナルを送り、待機プロセスがある場合は解除する。 More...
 

Detailed Description

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

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

Definition in file signal.c.

Function Documentation

◆ signal()

syscall signal ( sid32  sem)

セマフォにシグナルを送り、待機プロセスがある場合は解除する。

Step1. 割り込みを禁止する。
Step2. 不正なセマフォIDの場合は、割り込みを許可状態に復元し、処理を終了する。
Step3. 引数で渡されたセマフォがFREE状態の場合は、割り込みを許可状態に復元し、処理を終了する。
Step4. セマフォ待ち状態のプロセスがある場合、キューの先頭にあるプロセスをREADY状態にする。
Step5. 割り込みを許可状態に復元する。

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

Definition at line 18 of file signal.c.

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

Referenced by ethhandler(), freebuf(), ip_enqueue(), lflclose(), lflcontrol(), lflgetc(), lflputc(), lflseek(), lfsetup(), lfsopen(), mark(), ptrecv(), ptsend(), rdscontrol(), rdsprocess(), rdsread(), rdswrite(), rflclose(), rflread(), rflseek(), rflwrite(), rfscontrol(), rfsopen(), ttycontrol(), ttyhandle_in(), and xsh_ls().

19 {
20  intmask mask; /* Saved interrupt mask */
21  struct sentry *semptr; /* Ptr to sempahore table entry */
22 
23  mask = disable();
24  if (isbadsem(sem))
25  {
26  restore(mask);
27  return SYSERR;
28  }
29  semptr = &semtab[sem];
30  if (semptr->sstate == S_FREE)
31  {
32  restore(mask);
33  return SYSERR;
34  }
35  if ((semptr->scount++) < 0)
36  { /* Release a waiting process */
37  ready(dequeue(semptr->squeue));
38  }
39  restore(mask);
40  return OK;
41 }
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
pid32 dequeue(qid16)
プロセスキューテーブルからキューを削除し、リスト先頭のプロセスIDを返す。
Definition: queue.c:78
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
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: