XINU
Functions
mkbufpool.c File Reference

バッファプール用のメモリを割り当て、バッファ同士をリンクする。 More...

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

Go to the source code of this file.

Functions

bpid32 mkbufpool (int32 bufsiz, int32 numbufs)
 バッファプール用のメモリを割り当て、バッファ同士をリンクする。 More...
 

Detailed Description

バッファプール用のメモリを割り当て、バッファ同士をリンクする。

Definition in file mkbufpool.c.

Function Documentation

◆ mkbufpool()

bpid32 mkbufpool ( int32  bufsiz,
int32  numbufs 
)

バッファプール用のメモリを割り当て、バッファ同士をリンクする。

Step1. 割り込みを禁止する。
Step2. 以下のいずれかの場合は、割り込み状態を復元し、処理を終了する。
 ・バッファサイズがバッファ最小値を下回る場合
 ・バッファサイズがバッファ最大値を超えた場合
 ・バッファ数が0以下の場合
 ・バッファ数がバッファ最大数を超えた場合
 ・割り当て済みのバッファプール数が最大数を超えた場合
Step3. 要求されたバッファサイズを4の倍数で丸める。
Step4. 要求されたバッファサイズ + バッファプールID分のメモリをバッファ数分、割り当てる。
メモリ確保に失敗した場合は割り込み状態を復元し、処理を終了する。 Step5. 新しいバッファプールIDを割り当て、バッファプールの総数を1増加させる。
Step6. 割り当てたバッファとバッファプールをリンクする。
Step7. 割り当てたバッファにセマフォを割り当てる。
セマフォ割り当てに失敗した場合は割り当てたバッファを解放し、バッファプール総数を元に戻し、
割り込み状態を復元し、処理を終了する。
Step8. 割り当てたバッファ同士をリンクする。
Step9. 割り込み状態を復元する。

Parameters
[in]bufsizバッファプール中のバッファサイズ
[in]numbufsバッファプール中のバッファ数
Returns
バッファプールを割り当てた場合はバッファプールIDを返し、以下の場合はSYSERRを返す。
 ・バッファサイズがバッファ最小値を下回る場合
 ・バッファサイズがバッファ最大値を超えた場合
 ・バッファ数が0以下の場合
 ・バッファ数がバッファ最大数を超えた場合
 ・割り当て済みのバッファプール数が最大数を超えた場合
 ・バッファを確保できなかった場合
 ・セマフォを作成できなかった場合

Definition at line 38 of file mkbufpool.c.

References BP_MAXB, BP_MAXN, bpentry::bpnext, bpentry::bpsem, bpentry::bpsize, buftab, disable(), freemem(), getmem(), NBPOOLS, nbpools, NULL, restore(), semcreate(), and SYSERR.

Referenced by net_init().

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
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
char * getmem(uint32)
ヒープ領域を割り当て、最下位のワードアドレスを返す。
Definition: getmem.c:25
Here is the call graph for this function:
Here is the caller graph for this function: