XINU
freebuf.c
Go to the documentation of this file.
1 
5 #include <xinu.h>
6 
19 syscall freebuf(char *bufaddr)
20 {
21  intmask mask; /* Saved interrupt mask */
22  struct bpentry *bpptr; /* Pointer to entry in buftab */
23  bpid32 poolid; /* ID of buffer's pool */
24 
25  mask = disable();
26 
27  /* Extract pool ID from integer prior to buffer address */
28 
29  bufaddr -= sizeof(bpid32);
30  poolid = *(bpid32 *)bufaddr;
31  if (poolid < 0 || poolid >= nbpools)
32  {
33  restore(mask);
34  return SYSERR;
35  }
36 
37  /* Get address of correct pool entry in table */
38 
39  bpptr = &buftab[poolid];
40 
41  /* Insert buffer into list and signal semaphore */
42 
43  ((struct bpentry *)bufaddr)->bpnext = bpptr->bpnext;
44  bpptr->bpnext = (struct bpentry *)bufaddr;
45  signal(bpptr->bpsem);
46  restore(mask);
47  return OK;
48 }
struct bpentry buftab[]
バッファプールテーブルのextern宣言
Definition: bufinit.c:8
void restore(intmask)
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define OK
処理が成功した場合
Definition: kernel.h:77
syscall freebuf(char *bufaddr)
バッファプールから取得したバッファを解放する。
Definition: freebuf.c:19
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
int32 syscall
システムコール関数 返り値の型
Definition: kernel.h:47
syscall signal(sid32)
セマフォにシグナルを送り、待機プロセスがある場合は解除する。
Definition: signal.c:18
intmask disable(void)
割り込み禁止(intr.Sに定義がある)