source: anotherchoice/tags/jsp-1.4.4-full-UTF8/kernel/mailbox.c@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 7.3 KB
RevLine 
[26]1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: mailbox.c,v 1.8 2003/07/01 13:31:08 hiro Exp $
51 */
52
53/*
54 * メールボックス機能
55 */
56
57#include "jsp_kernel.h"
58#include "check.h"
59#include "task.h"
60#include "wait.h"
61#include "mailbox.h"
62
63/*
64 * メールボックスIDの最大値(kernel_cfg.c)
65 */
66extern const ID tmax_mbxid;
67
68/*
69 * メールボックス初期化ブロックのエリア(kernel_cfg.c)
70 */
71extern const MBXINIB mbxinib_table[];
72
73/*
74 * メールボックス管理ブロックのエリア(kernel_cfg.c)
75 */
76extern MBXCB mbxcb_table[];
77
78/*
79 * メールボックスの数
80 */
81#define TNUM_MBX ((UINT)(tmax_mbxid - TMIN_MBXID + 1))
82
83/*
84 * メールボックスIDからメールボックス管理ブロックを取り出すためのマクロ
85 */
86#define INDEX_MBX(mbxid) ((UINT)((mbxid) - TMIN_MBXID))
87#define get_mbxcb(mbxid) (&(mbxcb_table[INDEX_MBX(mbxid)]))
88
89/*
90 * メールボックス待
91ち情
92報ブロックの定義
93 */
94typedef struct mailbox_waiting_information {
95 WINFO winfo; /* 標準の待
96ち情
97報ブロック */
98 WOBJCB *wobjcb; /* 待
99ちオブジェクトの管理ブロック */
100 T_MSG *pk_msg; /* 受信したメッセージ */
101} WINFO_MBX;
102
103/*
104 * メールボックス機能の初期化
105 */
106#ifdef __mbxini
107
108void
109mailbox_initialize()
110{
111 UINT i;
112 MBXCB *mbxcb;
113
114 for (mbxcb = mbxcb_table, i = 0; i < TNUM_MBX; mbxcb++, i++) {
115 queue_initialize(&(mbxcb->wait_queue));
116 mbxcb->mbxinib = &(mbxinib_table[i]);
117 mbxcb->head = NULL;
118 }
119}
120
121#endif /* __mbxini */
122
123/*
124 * メッセージ優å…
125ˆåº¦ã®å–出し
126 */
127#define MSGPRI(pk_msg) (((T_MSG_PRI *) pk_msg)->msgpri)
128
129/*
130 * 優å…
131ˆåº¦é †ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚­ãƒ¥ãƒ¼ã¸ã®æŒ¿å…
132¥
133 */
134Inline void
135enqueue_msg_pri(T_MSG **p_prevmsg_next, T_MSG *pk_msg)
136{
137 T_MSG *pk_nextmsg;
138
139 while ((pk_nextmsg = *p_prevmsg_next) != NULL) {
140 if (MSGPRI(pk_nextmsg) > MSGPRI(pk_msg)) {
141 break;
142 }
143 p_prevmsg_next = &(pk_nextmsg->next);
144 }
145 pk_msg->next = pk_nextmsg;
146 *p_prevmsg_next = pk_msg;
147}
148
149/*
150 * メールボックスへの送信
151 */
152#ifdef __snd_mbx
153
154SYSCALL ER
155snd_mbx(ID mbxid, T_MSG *pk_msg)
156{
157 MBXCB *mbxcb;
158 TCB *tcb;
159 ER ercd;
160
161 LOG_SND_MBX_ENTER(mbxid, pk_msg);
162 CHECK_TSKCTX_UNL();
163 CHECK_MBXID(mbxid);
164 mbxcb = get_mbxcb(mbxid);
165 CHECK_PAR((mbxcb->mbxinib->mbxatr & TA_MPRI) == 0
166 || (TMIN_MPRI <= MSGPRI(pk_msg)
167 && MSGPRI(pk_msg) <= mbxcb->mbxinib->maxmpri));
168
169 t_lock_cpu();
170 if (!(queue_empty(&(mbxcb->wait_queue)))) {
171 tcb = (TCB *) queue_delete_next(&(mbxcb->wait_queue));
172 ((WINFO_MBX *)(tcb->winfo))->pk_msg = pk_msg;
173 if (wait_complete(tcb)) {
174 dispatch();
175 }
176 ercd = E_OK;
177 }
178 else if ((mbxcb->mbxinib->mbxatr & TA_MPRI) != 0) {
179 enqueue_msg_pri(&(mbxcb->head), pk_msg);
180 ercd = E_OK;
181 }
182 else {
183 pk_msg->next = NULL;
184 if (mbxcb->head != NULL) {
185 mbxcb->last->next = pk_msg;
186 }
187 else {
188 mbxcb->head = pk_msg;
189 }
190 mbxcb->last = pk_msg;
191 ercd = E_OK;
192 }
193 t_unlock_cpu();
194
195 exit:
196 LOG_SND_MBX_LEAVE(ercd);
197 return(ercd);
198}
199
200#endif /* __snd_mbx */
201
202/*
203 * メールボックスからの受信
204 */
205#ifdef __rcv_mbx
206
207SYSCALL ER
208rcv_mbx(ID mbxid, T_MSG **ppk_msg)
209{
210 MBXCB *mbxcb;
211 WINFO_MBX winfo;
212 ER ercd;
213
214 LOG_RCV_MBX_ENTER(mbxid, ppk_msg);
215 CHECK_DISPATCH();
216 CHECK_MBXID(mbxid);
217 mbxcb = get_mbxcb(mbxid);
218
219 t_lock_cpu();
220 if (mbxcb->head != NULL) {
221 *ppk_msg = mbxcb->head;
222 mbxcb->head = (*ppk_msg)->next;
223 ercd = E_OK;
224 }
225 else {
226 wobj_make_wait((WOBJCB *) mbxcb, (WINFO_WOBJ *) &winfo);
227 dispatch();
228 ercd = winfo.winfo.wercd;
229 if (ercd == E_OK) {
230 *ppk_msg = winfo.pk_msg;
231 }
232 }
233 t_unlock_cpu();
234
235 exit:
236 LOG_RCV_MBX_LEAVE(ercd, *ppk_msg);
237 return(ercd);
238}
239
240#endif /* __rcv_mbx */
241
242/*
243 * メールボックスからの受信(ポーリング)
244 */
245#ifdef __prcv_mbx
246
247SYSCALL ER
248prcv_mbx(ID mbxid, T_MSG **ppk_msg)
249{
250 MBXCB *mbxcb;
251 ER ercd;
252
253 LOG_PRCV_MBX_ENTER(mbxid, ppk_msg);
254 CHECK_TSKCTX_UNL();
255 CHECK_MBXID(mbxid);
256 mbxcb = get_mbxcb(mbxid);
257
258 t_lock_cpu();
259 if (mbxcb->head != NULL) {
260 *ppk_msg = mbxcb->head;
261 mbxcb->head = (*ppk_msg)->next;
262 ercd = E_OK;
263 }
264 else {
265 ercd = E_TMOUT;
266 }
267 t_unlock_cpu();
268
269 exit:
270 LOG_PRCV_MBX_LEAVE(ercd, *ppk_msg);
271 return(ercd);
272}
273
274#endif /* __prcv_mbx */
275
276/*
277 * メールボックスからの受信(タイムアウトあり)
278 */
279#ifdef __trcv_mbx
280
281SYSCALL ER
282trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout)
283{
284 MBXCB *mbxcb;
285 WINFO_MBX winfo;
286 TMEVTB tmevtb;
287 ER ercd;
288
289 LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout);
290 CHECK_DISPATCH();
291 CHECK_MBXID(mbxid);
292 CHECK_TMOUT(tmout);
293 mbxcb = get_mbxcb(mbxid);
294
295 t_lock_cpu();
296 if (mbxcb->head != NULL) {
297 *ppk_msg = mbxcb->head;
298 mbxcb->head = (*ppk_msg)->next;
299 ercd = E_OK;
300 }
301 else if (tmout == TMO_POL) {
302 ercd = E_TMOUT;
303 }
304 else {
305 wobj_make_wait_tmout((WOBJCB *) mbxcb, (WINFO_WOBJ *) &winfo,
306 &tmevtb, tmout);
307 dispatch();
308 ercd = winfo.winfo.wercd;
309 if (ercd == E_OK) {
310 *ppk_msg = winfo.pk_msg;
311 }
312 }
313 t_unlock_cpu();
314
315 exit:
316 LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg);
317 return(ercd);
318}
319
320#endif /* __trcv_mbx */
Note: See TracBrowser for help on using the repository browser.