XINU
Functions
ptrecv.c File Reference

ポートからメッセージを受信する。受信前にメッセージが空の場合はブロッキングする。 More...

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

Go to the source code of this file.

Functions

uint32 ptrecv (int32 portid)
 ポートからメッセージを受信する。受信前にメッセージが空の場合はブロッキングする。 More...
 

Detailed Description

ポートからメッセージを受信する。受信前にメッセージが空の場合はブロッキングする。

Definition in file ptrecv.c.

Function Documentation

◆ ptrecv()

uint32 ptrecv ( int32  portid)

ポートからメッセージを受信する。受信前にメッセージが空の場合はブロッキングする。

Step1. 割り込みを禁止する。
Step2. ポートIDが不正、もしくはポートがALLOC状態でなければ割り込み状態を復元し、処理を終了する。
Step3. 送信側セマフォに空きが出るまで待機する。
セマフォ待機後、以下の状態のいずれかであれば割り込み状態を復元し、処理を終了する。
 ・セマフォ待機結果がエラー
 ・ポートがALLOC状態以外
 ・シーケンス番号が変化した場合
Step4. ポートフリーノードがNULL状態であれば(メッセージを使い果たした場合)、Panic状態とする。
Step5. ポートフリーノードからメッセージノード1個を切り出し、メッセージノードにメッセージを追加する。
Step6. メッセージノードをメッセージリストの末尾に追加する。
Step7. 受信セマフォにシグナルを送る。
Step8. 割り込み状態を復元する。

Parameters
[in]portid使用するポートのID
Returns
メッセージ送信時はOKを返し、以下の場合はSYSERRを返す。
 ・引数のポートIDが不正
・セマフォ待機結果がエラー
 ・ポートがALLOC状態以外
 ・シーケンス番号が変化した場合

Definition at line 29 of file ptrecv.c.

References disable(), isbadport, NULL, porttab, PT_ALLOC, ptfree, ptentry::pthead, ptnode::ptmsg, ptnode::ptnext, ptentry::ptrsem, ptentry::ptseq, ptentry::ptssem, ptentry::ptstate, ptentry::pttail, restore(), signal(), SYSERR, and wait().

30 {
31  intmask mask; /* Saved interrupt mask */
32  struct ptentry *ptptr; /* Pointer to table entry */
33  int32 seq; /* Local copy of sequence num. */
34  umsg32 msg; /* Message to return */
35  struct ptnode *msgnode; /* First node on message list */
36 
37  mask = disable();
38  if (isbadport(portid) ||
39  (ptptr = &porttab[portid])->ptstate != PT_ALLOC)
40  {
41  restore(mask);
42  return (uint32)SYSERR;
43  }
44 
45  /* Wait for message and verify that the port is still allocated */
46 
47  seq = ptptr->ptseq; /* Record orignal sequence */
48  if (wait(ptptr->ptrsem) == SYSERR || ptptr->ptstate != PT_ALLOC || ptptr->ptseq != seq)
49  {
50  restore(mask);
51  return (uint32)SYSERR;
52  }
53 
54  /* Dequeue first message that is waiting in the port */
55 
56  msgnode = ptptr->pthead;
57  msg = msgnode->ptmsg;
58  if (ptptr->pthead == ptptr->pttail) /* Delete last item */
59  ptptr->pthead = ptptr->pttail = NULL;
60  else
61  ptptr->pthead = msgnode->ptnext;
62  msgnode->ptnext = ptfree; /* Return to free list */
63  ptfree = msgnode;
64  signal(ptptr->ptssem);
65  restore(mask);
66  return msg;
67 }
#define NULL
連結リスト用のNULLポインタ
Definition: kernel.h:68
void restore(intmask)
ポートテーブルエントリ
Definition: ports.h:33
#define isbadport(portid)
ポートIDが不正値かどうかを確認する。
Definition: ports.h:64
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define PT_ALLOC
ポートが割り当てられた
Definition: ports.h:15
sid32 ptrsem
受信側セマフォ
Definition: ports.h:38
メッセージリストのノード
Definition: ports.h:21
uint32 umsg32
プロセス間で渡されるメッセージ
Definition: kernel.h:32
struct ptentry porttab[]
ポートテーブルエントリのextern宣言
Definition: ptinit.c:10
struct ptnode * ptnext
メッセージリストの次のノードへのポインタ
Definition: ports.h:26
sid32 ptssem
送信側セマフォ
Definition: ports.h:36
uint16 ptstate
ポート状態(FREE/LIMBO/ALLOC)
Definition: ports.h:40
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
struct ptnode * pttail
メッセージリストの末尾ポインタ
Definition: ports.h:48
uint32 ptmsg
ワンワードのメッセージ
Definition: ports.h:24
syscall wait(sid32)
Definition: wait.c:9
syscall signal(sid32)
セマフォにシグナルを送り、待機プロセスがある場合は解除する。
Definition: signal.c:18
unsigned int uint32
符号なし32ビット整数(unsigned int)
Definition: kernel.h:15
struct ptnode * pthead
メッセージリストの先頭ポインタ
Definition: ports.h:46
int32 ptseq
生成時に変更されたシーケンス
Definition: ports.h:44
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
struct ptnode * ptfree
フリーノードリストのextern宣言
Definition: ptinit.c:8
Here is the call graph for this function: