XINU
system
mkbufpool.c
Go to the documentation of this file.
1
5
#include <
xinu.h
>
6
38
bpid32
mkbufpool
(
int32
bufsiz,
int32
numbufs)
39
{
40
intmask
mask;
/* Saved interrupt mask */
41
bpid32
poolid;
/* ID of pool that is created */
42
struct
bpentry
*bpptr;
/* Pointer to entry in buftab */
43
char
*buf;
/* Pointer to memory for buffer */
44
45
mask =
disable
();
46
if
(bufsiz < BP_MINB || bufsiz >
BP_MAXB
|| numbufs < 1 || numbufs >
BP_MAXN
||
nbpools
>=
NBPOOLS
)
47
{
48
restore
(mask);
49
return
(
bpid32
)
SYSERR
;
50
}
51
/* Round request to a multiple of 4 bytes */
52
53
bufsiz = ((bufsiz + 3) & (~3));
54
55
buf = (
char
*)
getmem
(numbufs * (bufsiz +
sizeof
(
bpid32
)));
56
if
((
int32
)buf ==
SYSERR
)
57
{
58
restore
(mask);
59
return
(
bpid32
)
SYSERR
;
60
}
61
poolid =
nbpools
++;
62
bpptr = &
buftab
[poolid];
63
bpptr->
bpnext
= (
struct
bpentry
*)buf;
64
bpptr->
bpsize
= bufsiz;
65
if
((bpptr->
bpsem
=
semcreate
(numbufs)) ==
SYSERR
)
66
{
67
freemem
(buf, numbufs * (bufsiz +
sizeof
(
bpid32
)));
68
nbpools
--;
69
restore
(mask);
70
return
(
bpid32
)
SYSERR
;
71
}
72
bufsiz +=
sizeof
(
bpid32
);
73
for
(numbufs--; numbufs > 0; numbufs--)
74
{
75
bpptr = (
struct
bpentry
*)buf;
76
buf += bufsiz;
77
bpptr->
bpnext
= (
struct
bpentry
*)buf;
78
}
79
bpptr = (
struct
bpentry
*)buf;
80
bpptr->
bpnext
= (
struct
bpentry
*)
NULL
;
81
restore
(mask);
82
return
poolid;
83
}
buftab
struct bpentry buftab[]
バッファプールテーブルのextern宣言
Definition:
bufinit.c:8
NULL
#define NULL
連結リスト用のNULLポインタ
Definition:
kernel.h:68
BP_MAXN
#define BP_MAXN
バッファプールに存在するバッファの最大数
Definition:
bufpool.h:20
semcreate
sid32 semcreate(int32)
未使用セマフォを割り当て、そのセマフォへのインデックス(セマフォID)を返す。
Definition:
semcreate.c:22
restore
void restore(intmask)
freemem
syscall freemem(char *, uint32)
メモリブロックを解放し、ブロックを空きリストに戻す。
Definition:
freemem.c:33
xinu.h
全てのシステムヘッダファイルをインクルードする。
SYSERR
#define SYSERR
処理が失敗した場合
Definition:
kernel.h:79
NBPOOLS
#define NBPOOLS
バッファプール数の最大数
Definition:
bufpool.h:8
BP_MAXB
#define BP_MAXB
最大バッファサイズ(Byte)
Definition:
bufpool.h:13
bpid32
int32 bpid32
バッファプールID
Definition:
kernel.h:34
nbpools
bpid32 nbpools
割り当てられたバッファプールの現在の数
Definition:
bufinit.c:10
bpentry::bpsem
sid32 bpsem
バッファプールで現在使用可能なバッファをカウントするセマフォ
Definition:
bufpool.h:32
bpentry::bpnext
struct bpentry * bpnext
次のフリーバッファへのポインタ
Definition:
bufpool.h:30
bpentry
バッファプールテーブルエントリ
Definition:
bufpool.h:27
intmask
uint32 intmask
保存された割り込みマスク
Definition:
kernel.h:38
bpentry::bpsize
uint32 bpsize
本バッファプール内のバッファサイズ
Definition:
bufpool.h:34
int32
int int32
符号あり32ビット整数(int)
Definition:
kernel.h:11
mkbufpool
bpid32 mkbufpool(int32 bufsiz, int32 numbufs)
バッファプール用のメモリを割り当て、バッファ同士をリンクする。
Definition:
mkbufpool.c:38
disable
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
getmem
char * getmem(uint32)
ヒープ領域を割り当て、最下位のワードアドレスを返す。
Definition:
getmem.c:25
Generated by
1.8.13