XINU
Functions
semcreate.c File Reference

新しいセマフォを作成する。 More...

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

Go to the source code of this file.

Functions

local sid32 newsem (void)
 未使用のセマフォIDを返す。 More...
 
sid32 semcreate (int32 count)
 未使用セマフォを割り当て、そのセマフォへのインデックス(セマフォID)を返す。 More...
 

Detailed Description

新しいセマフォを作成する。

Definition in file semcreate.c.

Function Documentation

◆ newsem()

local sid32 newsem ( void  )

未使用のセマフォIDを返す。

未使用セマフォを探索し、そのセマフォへのインデックス(セマフォID)を返す。

newsem()内で、次に確認すべきセマフォ(未使用セマフォ)へのインデックスを保持している。
未使用セマフォが見つかるまで、以下の処理を最大NSEM(セマフォ上限数)回ループして、セマフォテーブルの全探索を行う。
Step1. 前回調査したセマフォIDをインクリメントする。
Step2. 調査対象のセマフォIDがNSEMを超えていた場合、調査対象のセマフォIDを0とする。
Step3. 調査対象のセマフォIDが未使用状態であった場合、使用中に変更し、そのセマフォIDを返して処理を終了する。

Returns
未使用セマフォが見つかった場合はそのセマフォID、未使用セマフォが無かった場合はSYSERRを返す。

Definition at line 49 of file semcreate.c.

References NSEM, S_FREE, S_USED, semtab, sentry::sstate, and SYSERR.

Referenced by semcreate().

50 {
51  static sid32 nextsem = 0; /* Next semaphore index to try */
52  sid32 sem; /* Semaphore ID to return */
53  int32 i; /* Iterate through # entries */
54 
55  for (i = 0; i < NSEM; i++)
56  {
57  sem = nextsem++;
58  if (nextsem >= NSEM)
59  nextsem = 0;
60  if (semtab[sem].sstate == S_FREE)
61  {
62  semtab[sem].sstate = S_USED;
63  return sem;
64  }
65  }
66  return SYSERR;
67 }
#define S_USED
セマフォテーブルエントリが利用中
Definition: semaphore.h:13
byte sstate
エントリ状態が利用可能(S_FREE)か、利用中(S_USED)かを表す。
Definition: semaphore.h:22
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define NSEM
Definition: conf.h:80
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
#define S_FREE
セマフォテーブルエントリが利用可能
Definition: semaphore.h:11
int32 sid32
セマフォID
Definition: kernel.h:22
struct sentry semtab[]
セマフォテーブルエントリのextern宣言
Definition: initialize.c:25
Here is the caller graph for this function:

◆ semcreate()

sid32 semcreate ( int32  count)

未使用セマフォを割り当て、そのセマフォへのインデックス(セマフォID)を返す。

Step1. 割り込みを禁止する
Step2. セマフォカウント初期値が負の値、もしくは未使用のセマフォがない場合は、割り込みを許可状態に復元し、処理を終了する。
Step3. newsem()で取得したセマフォIDを用いて、セマフォテーブルからセマフォを取り出し、セマフォカウントの初期値を設定する。
Step4. 割り込みを許可状態に復元する。

Parameters
[in]countセマフォカウントの初期値
Returns
セマフォが生成できた場合は生成したセマフォのID、
「セマフォカウント初期値が負の値」もしくは「未使用のセマフォがない」場合はSYSERRを返す。
Note
セマフォの状態は、newsem()内で未使用→使用に変更されている。

Definition at line 22 of file semcreate.c.

References disable(), newsem(), restore(), sentry::scount, semtab, and SYSERR.

Referenced by ethinit(), lflinit(), lfsinit(), markinit(), mkbufpool(), net_init(), ptcreate(), rdsinit(), rfsinit(), and ttyinit().

23 {
24  intmask mask; /* Saved interrupt mask */
25  sid32 sem; /* Semaphore ID to return */
26 
27  mask = disable();
28 
29  if (count < 0 || ((sem = newsem()) == SYSERR))
30  {
31  restore(mask);
32  return SYSERR;
33  }
34  semtab[sem].scount = count; /* Initialize table entry */
35 
36  restore(mask);
37  return sem;
38 }
void restore(intmask)
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
local sid32 newsem(void)
未使用のセマフォIDを返す。
Definition: semcreate.c:49
int32 scount
セマフォカウント(負の値(-N)の場合は、キューにN個の待機プロセスがある。それ以外はキューが空である) ...
Definition: semaphore.h:24
int32 sid32
セマフォID
Definition: kernel.h:22
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: