XINU
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 }
struct bpentry buftab[]
バッファプールテーブルのextern宣言
Definition: bufinit.c:8
#define NULL
連結リスト用のNULLポインタ
Definition: kernel.h:68
#define BP_MAXN
バッファプールに存在するバッファの最大数
Definition: bufpool.h:20
sid32 semcreate(int32)
未使用セマフォを割り当て、そのセマフォへのインデックス(セマフォID)を返す。
Definition: semcreate.c:22
void restore(intmask)
syscall freemem(char *, uint32)
メモリブロックを解放し、ブロックを空きリストに戻す。
Definition: freemem.c:33
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define NBPOOLS
バッファプール数の最大数
Definition: bufpool.h:8
#define BP_MAXB
最大バッファサイズ(Byte)
Definition: bufpool.h:13
int32 bpid32
バッファプールID
Definition: kernel.h:34
bpid32 nbpools
割り当てられたバッファプールの現在の数
Definition: bufinit.c:10
sid32 bpsem
バッファプールで現在使用可能なバッファをカウントするセマフォ
Definition: bufpool.h:32
struct bpentry * bpnext
次のフリーバッファへのポインタ
Definition: bufpool.h:30
バッファプールテーブルエントリ
Definition: bufpool.h:27
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
uint32 bpsize
本バッファプール内のバッファサイズ
Definition: bufpool.h:34
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
bpid32 mkbufpool(int32 bufsiz, int32 numbufs)
バッファプール用のメモリを割り当て、バッファ同士をリンクする。
Definition: mkbufpool.c:38
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
char * getmem(uint32)
ヒープ領域を割り当て、最下位のワードアドレスを返す。
Definition: getmem.c:25