XINU
Functions
ptcount.c File Reference

ポートを用いたメッセージ送受信において、メッセージ数を数える。 More...

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

Go to the source code of this file.

Functions

int32 ptcount (int32 portid)
 ポートを用いたメッセージ送受信において、メッセージ数を数える。 More...
 

Detailed Description

ポートを用いたメッセージ送受信において、メッセージ数を数える。

Definition in file ptcount.c.

Function Documentation

◆ ptcount()

int32 ptcount ( int32  portid)

ポートを用いたメッセージ送受信において、メッセージ数を数える。

Step1. 割り込みを禁止する。
Step2. ポートIDが不正値もしくはポートが未割り当ての場合は、割り込み状態を復元し、
処理を終了する。 Step3. 受信メッセージ数(受信用セマフォ数)を数える。
Step4. 受信メッセージ数が0以上の場合は、送信メッセージ数(送信用セマフォ数)を数える。
Step5. 送信メッセージが0以下の場合は、受信メッセージ数にその数(送信者がブロックされた数)を
加算する。
Step6. 割り込み状態を復元する。

Parameters
[in]portidポートID
Returns
成功時は現在ポートで待機中のメッセージ数を返し、ポートIDが不正値もしくは
ポートが未割り当ての場合はSYSERRを返す。
Note
正の値Kは、ポートにK個のメッセージ(送信者がブロックされて送信待機中のメッセージ含む)が
ある事を意味する。負の値Kはポートが空であり、K個のプロセスがメッセージ受信のために
大気中である事を意味する。

Definition at line 25 of file ptcount.c.

References disable(), isbadport, porttab, PT_ALLOC, ptentry::ptrsem, ptentry::ptssem, ptentry::ptstate, restore(), semcount(), and SYSERR.

26 {
27  intmask mask; /* Saved interrupt mask */
28  int32 count; /* Count of messages available */
29  int32 sndcnt; /* Count of sender semaphore */
30  struct ptentry *ptptr; /* Pointer to port table entry */
31 
32  mask = disable();
33  if (isbadport(portid) ||
34  (ptptr = &porttab[portid])->ptstate != PT_ALLOC)
35  {
36  restore(mask);
37  return SYSERR;
38  }
39 
40  /* Get count of messages available */
41 
42  count = semcount(ptptr->ptrsem);
43 
44  /* If messages are waiting, check for blocked senders */
45 
46  if (count >= 0)
47  {
48  sndcnt = semcount(ptptr->ptssem);
49  if (sndcnt < 0)
50  { /* -sndcnt senders blocked */
51  count += -sndcnt;
52  }
53  }
54  restore(mask);
55  return count;
56 }
syscall semcount(sid32)
セマフォのカウント値を返す。
Definition: semcount.c:18
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
struct ptentry porttab[]
ポートテーブルエントリのextern宣言
Definition: ptinit.c:10
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
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
Here is the call graph for this function: