XINU
Functions
freebuf.c File Reference

バッファプールから取得したバッファを解放する。 More...

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

Go to the source code of this file.

Functions

syscall freebuf (char *bufaddr)
 バッファプールから取得したバッファを解放する。 More...
 

Detailed Description

バッファプールから取得したバッファを解放する。

Definition in file freebuf.c.

Function Documentation

◆ freebuf()

syscall freebuf ( char *  bufaddr)

バッファプールから取得したバッファを解放する。

Step1. 割り込みを禁止する。
Step2. 解放対象バッファアドレスの4Byte前に埋め込んだバッファプールIDが不正値かどうかを確認し、
不正値であれば割り込み状態を復元し、処理を終了する。
Step3. 解放対象バッファをバッファプールに戻す。
Step4. セマフォにシグナルを送り、待機プロセスがいれば待機解除とする。
Step5. 割り込み状態を復元する。

Parameters
[in]bufaddrgetbuf()で取得したバッファアドレス
Returns
バッファを解放した場合はOK、バッファプールIDが不正値の場合はSYSERRを返す。

Definition at line 19 of file freebuf.c.

References bpentry::bpnext, bpentry::bpsem, buftab, disable(), nbpools, OK, restore(), signal(), and SYSERR.

Referenced by arp_in(), icmp_in(), icmp_recv(), icmp_release(), ip_enqueue(), ip_in(), ip_local(), ip_out(), ip_send(), ipout(), netin(), udp_in(), udp_recv(), udp_recvaddr(), and udp_release().

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
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
syscall signal(sid32)
セマフォにシグナルを送り、待機プロセスがある場合は解除する。
Definition: signal.c:18
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
Here is the call graph for this function:
Here is the caller graph for this function: