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