XINU
ptsend.c
Go to the documentation of this file.
1 
5 #include <xinu.h>
6 
31 syscall ptsend(int32 portid, umsg32 msg)
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
syscall ptsend(int32 portid, umsg32 msg)
メッセージをキューに追加する事によってポートへメッセージを送信する。
Definition: ptsend.c:31
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
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
void panic(char *)
Panic状態に陥った旨のメッセージを表示し、全てのプロセスを停止させる。
Definition: panic.c:12
struct ptnode * pttail
メッセージリストの末尾ポインタ
Definition: ports.h:48
int32 syscall
システムコール関数 返り値の型
Definition: kernel.h:47
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