XINU
recvtime.c
Go to the documentation of this file.
1 
5 #include <xinu.h>
6 
7 /*------------------------------------------------------------------------
8  * recvtime - Wait specified time to receive a message and return
9  *------------------------------------------------------------------------
10  */
18  int32 maxwait /* Ticks to wait before timeout */
19 )
20 {
21  intmask mask; /* Saved interrupt mask */
22  struct procent *prptr; /* Tbl entry of current process */
23  umsg32 msg; /* Message to return */
24 
25  if (maxwait < 0)
26  {
27  return SYSERR;
28  }
29  mask = disable();
30 
31  /* Schedule wakeup and place process in timed-receive state */
32 
33  prptr = &proctab[currpid];
34  if (prptr->prhasmsg == FALSE)
35  { /* Delay if no message waiting */
36  if (insertd(currpid, sleepq, maxwait) == SYSERR)
37  {
38  restore(mask);
39  return SYSERR;
40  }
41  prptr->prstate = PR_RECTIM;
42  resched();
43  }
44 
45  /* Either message arrived or timer expired */
46 
47  if (prptr->prhasmsg)
48  {
49  msg = prptr->prmsg; /* Retrieve message */
50  prptr->prhasmsg = FALSE; /* Reset message indicator */
51  }
52  else
53  {
54  msg = TIMEOUT;
55  }
56  restore(mask);
57  return msg;
58 }
pid32 currpid
現在実行中のプロセス。
Definition: initialize.c:32
#define PR_RECTIM
プロセスが「タイムアウト」か「メッセージの到着」のいずれか早い方で待機中の状態。
Definition: process.h:49
void restore(intmask)
qid16 sleepq
スリープ中のプロセスキュー
Definition: clkinit.c:7
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define TIMEOUT
システムコールがタイムアウトした場合
Definition: kernel.h:83
uint32 umsg32
プロセス間で渡されるメッセージ
Definition: kernel.h:32
umsg32 recvtime(int32 maxwait)
Definition: recvtime.c:17
status insertd(pid32, qid16, int32)
Definition: insertd.c:9
#define FALSE
Boolean False(0)
Definition: kernel.h:63
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
uint16 prstate
プロセス状態(PR_CURR, ..., etc)。
Definition: process.h:88
void resched(void)
最優先の適切なプロセスにCPU実行権を渡す。
Definition: resched.c:22
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