XINU
Functions
send.c File Reference

プロセスにメッセージを送信し、受信側が待機状態の場合はREADY状態にする。 More...

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

Go to the source code of this file.

Functions

syscall send (pid32 pid, umsg32 msg)
 プロセスにメッセージを送信し、受信側が待機状態の場合はREADY状態にする。 More...
 

Detailed Description

プロセスにメッセージを送信し、受信側が待機状態の場合はREADY状態にする。

Definition in file send.c.

Function Documentation

◆ send()

syscall send ( pid32  pid,
umsg32  msg 
)

プロセスにメッセージを送信し、受信側が待機状態の場合はREADY状態にする。

Step1. 割り込みを禁止する。
Step2. 引数で渡されたプロセスのIDが不正値の場合は、割り込みを許可状態に復元し、処理を終了する。
Step3. 受信側プロセスが過去のメッセージを未処理の場合は、割り込みを許可状態に復元し、処理を終了する。
Step4. メッセージを受信側プロセスに送信(セット)し、受信側プロセスのメッセージ所持フラグを有効化する。
Step5. 受信側プロセスが受信待ち状態の場合はREADY状態とし、
受信待ちかタイムアウト待ちの場合はプロセスの休眠状態を解除してからREADY状態に変更する。
Step6. 割り込みを許可状態に復元する。

Parameters
[in]pidメッセージを受信するプロセスのID
[in]msgメッセージ内容(整数かポインタ)
Returns
メッセージを送信した場合はOK、受信側プロセスIDが不正値の場合や受信側プロセスが過去メッセージ未処理の場合はSYSERRを返す。

Definition at line 21 of file send.c.

References disable(), isbadpid, OK, PR_RECTIM, PR_RECV, procent::prhasmsg, procent::prmsg, proctab, procent::prstate, ready(), restore(), SYSERR, TRUE, and unsleep().

Referenced by arp_in(), icmp_in(), kill(), rdsprocess(), and udp_in().

22 {
23  intmask mask; /* Saved interrupt mask */
24  struct procent *prptr; /* Ptr to process's table entry */
25 
26  mask = disable();
27  if (isbadpid(pid))
28  {
29  restore(mask);
30  return SYSERR;
31  }
32 
33  prptr = &proctab[pid];
34  if (prptr->prhasmsg)
35  {
36  restore(mask);
37  return SYSERR;
38  }
39  prptr->prmsg = msg; /* Deliver message */
40  prptr->prhasmsg = TRUE; /* Indicate message is waiting */
41 
42  /* If recipient waiting or in timed-wait make it ready */
43 
44  if (prptr->prstate == PR_RECV)
45  {
46  ready(pid);
47  }
48  else if (prptr->prstate == PR_RECTIM)
49  {
50  unsleep(pid);
51  ready(pid);
52  }
53  restore(mask); /* Restore interrupts */
54  return OK;
55 }
#define PR_RECTIM
プロセスが「タイムアウト」か「メッセージの到着」のいずれか早い方で待機中の状態。
Definition: process.h:49
void restore(intmask)
#define isbadpid(x)
プロセスIDを検証する。割り込みが無効になっている事を想定している。
Definition: process.h:71
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define OK
処理が成功した場合
Definition: kernel.h:77
status ready(pid32)
プロセスをCPUサービスの対象にする。
Definition: ready.c:21
#define PR_RECV
プロセスがメッセージで待機中の状態。
Definition: process.h:41
syscall unsleep(pid32)
Definition: unsleep.c:11
#define TRUE
Boolean True(1)
Definition: kernel.h:65
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
uint16 prstate
プロセス状態(PR_CURR, ..., etc)。
Definition: process.h:88
struct procent proctab[]
プロセステーブル。
Definition: initialize.c:23
プロセステーブル(32bitsの倍数)。
Definition: process.h:85
bool8 prhasmsg
有効(Valid)メッセージの場合、非0となる。
Definition: process.h:106
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
umsg32 prmsg
このプロセスに送信されたメッセージ。
Definition: process.h:104
Here is the call graph for this function:
Here is the caller graph for this function: