XINU
semcreate.c
Go to the documentation of this file.
1 
5 #include <xinu.h>
6 
8 local sid32 newsem(void);
9 
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 }
39 
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 }
sid32 semcreate(int32 count)
未使用セマフォを割り当て、そのセマフォへのインデックス(セマフォID)を返す。
Definition: semcreate.c:22
#define S_USED
セマフォテーブルエントリが利用中
Definition: semaphore.h:13
void restore(intmask)
byte sstate
エントリ状態が利用可能(S_FREE)か、利用中(S_USED)かを表す。
Definition: semaphore.h:22
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define NSEM
Definition: conf.h:80
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
#define local
ローカル関数かローカル変数の宣言
Definition: kernel.h:60
local sid32 newsem(void)
未使用のセマフォIDを返す。
Definition: semcreate.c:49
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に定義がある)