XINU
system
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
}
NULL
#define NULL
連結リスト用のNULLポインタ
Definition:
kernel.h:68
ptsend
syscall ptsend(int32 portid, umsg32 msg)
メッセージをキューに追加する事によってポートへメッセージを送信する。
Definition:
ptsend.c:31
restore
void restore(intmask)
ptentry
ポートテーブルエントリ
Definition:
ports.h:33
isbadport
#define isbadport(portid)
ポートIDが不正値かどうかを確認する。
Definition:
ports.h:64
xinu.h
全てのシステムヘッダファイルをインクルードする。
SYSERR
#define SYSERR
処理が失敗した場合
Definition:
kernel.h:79
PT_ALLOC
#define PT_ALLOC
ポートが割り当てられた
Definition:
ports.h:15
ptentry::ptrsem
sid32 ptrsem
受信側セマフォ
Definition:
ports.h:38
OK
#define OK
処理が成功した場合
Definition:
kernel.h:77
ptnode
メッセージリストのノード
Definition:
ports.h:21
umsg32
uint32 umsg32
プロセス間で渡されるメッセージ
Definition:
kernel.h:32
porttab
struct ptentry porttab[]
ポートテーブルエントリのextern宣言
Definition:
ptinit.c:10
ptnode::ptnext
struct ptnode * ptnext
メッセージリストの次のノードへのポインタ
Definition:
ports.h:26
ptentry::ptssem
sid32 ptssem
送信側セマフォ
Definition:
ports.h:36
ptentry::ptstate
uint16 ptstate
ポート状態(FREE/LIMBO/ALLOC)
Definition:
ports.h:40
intmask
uint32 intmask
保存された割り込みマスク
Definition:
kernel.h:38
int32
int int32
符号あり32ビット整数(int)
Definition:
kernel.h:11
panic
void panic(char *)
Panic状態に陥った旨のメッセージを表示し、全てのプロセスを停止させる。
Definition:
panic.c:12
ptentry::pttail
struct ptnode * pttail
メッセージリストの末尾ポインタ
Definition:
ports.h:48
syscall
int32 syscall
システムコール関数 返り値の型
Definition:
kernel.h:47
ptnode::ptmsg
uint32 ptmsg
ワンワードのメッセージ
Definition:
ports.h:24
wait
syscall wait(sid32)
Definition:
wait.c:9
signal
syscall signal(sid32)
セマフォにシグナルを送り、待機プロセスがある場合は解除する。
Definition:
signal.c:18
ptentry::pthead
struct ptnode * pthead
メッセージリストの先頭ポインタ
Definition:
ports.h:46
ptentry::ptseq
int32 ptseq
生成時に変更されたシーケンス
Definition:
ports.h:44
disable
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
ptfree
struct ptnode * ptfree
フリーノードリストのextern宣言
Definition:
ptinit.c:8
Generated by
1.8.13