XINU
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Functions
ptsend.c File Reference

メッセージをキューに追加する事によってポートへメッセージを送信する。 More...

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

Go to the source code of this file.

Functions

syscall ptsend (int32 portid, umsg32 msg)
 メッセージをキューに追加する事によってポートへメッセージを送信する。 More...
 

Detailed Description

メッセージをキューに追加する事によってポートへメッセージを送信する。

Definition in file ptsend.c.

Function Documentation

◆ ptsend()

syscall ptsend ( int32  portid,
umsg32  msg 
)

メッセージをキューに追加する事によってポートへメッセージを送信する。

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

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

Definition at line 31 of file ptsend.c.

References disable(), isbadport, NULL, OK, panic(), 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().

32 {
33  intmask mask; /* Saved interrupt mask */
34  struct ptentry *ptptr; /* Pointer to table entry */
35  int32 seq; /* Local copy of sequence num. */
36  struct ptnode *msgnode; /* Allocated message node */
37  struct ptnode *tailnode; /* Last node in port or NULL */
38 
39  mask = disable();
40  if (isbadport(portid) ||
41  (ptptr = &porttab[portid])->ptstate != PT_ALLOC)
42  {
43  restore(mask);
44  return SYSERR;
45  }
46 
47  /* Wait for space and verify port has not been reset */
48  seq = ptptr->ptseq; /* Record original sequence */
49  if (wait(ptptr->ptssem) == SYSERR || ptptr->ptstate != PT_ALLOC || ptptr->ptseq != seq)
50  {
51  restore(mask);
52  return SYSERR;
53  }
54  if (ptfree == NULL)
55  {
56  panic("Port system ran out of message nodes");
57  }
58 
59  /* Obtain node from free list by unlinking */
60 
61  msgnode = ptfree; /* Point to first free node */
62  ptfree = msgnode->ptnext; /* Unlink from the free list */
63  msgnode->ptnext = NULL; /* Set fields in the node */
64  msgnode->ptmsg = msg;
65 
66  /* Link into queue for the specified port */
67 
68  tailnode = ptptr->pttail;
69  if (tailnode == NULL)
70  { /* Queue for port was empty */
71  ptptr->pttail = ptptr->pthead = msgnode;
72  }
73  else
74  { /* Insert new node at tail */
75  tailnode->ptnext = msgnode;
76  ptptr->pttail = msgnode;
77  }
78  signal(ptptr->ptrsem);
79  restore(mask);
80  return OK;
81 }
#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
#define OK
処理が成功した場合
Definition: kernel.h:77
メッセージリストのノード
Definition: ports.h:21
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
void panic(char *)
Panic状態に陥った旨のメッセージを表示し、全てのプロセスを停止させる。
Definition: panic.c:12
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
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: