source: asp_ewarm/asp-1.7.0/extension/dcre/kernel/mailbox.c@ 61

Last change on this file since 61 was 61, checked in by ertl-honda, 11 years ago

ASP for EWARM のコミット.

File size: 11.9 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
12 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
13 * •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
14 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
15 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
16 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
17 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
18 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
19ƒƒ“ƒgi—˜—p
20 * ŽÒƒ}ƒjƒ…
21ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
22 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
23 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
24 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
25 * ‚ƁD
26 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
27ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
28ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
29 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
30 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
31 * •ñ‚·‚邱‚ƁD
32 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
33 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
34 * ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
35 * —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
36 * –Ɛӂ·‚邱‚ƁD
37 *
38 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
39 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
40 * ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
41 * ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
42 * ‚̐ӔC‚𕉂í‚È‚¢D
43 *
44 * @(#) $Id: mailbox.c 1970 2010-11-20 11:27:06Z ertl-hiro $
45 */
46
47/*
48 * ƒ[ƒ‹ƒ{ƒbƒNƒX‹@”\
49 */
50
51#include "kernel_impl.h"
52#include "check.h"
53#include "task.h"
54#include "wait.h"
55#include "mailbox.h"
56
57/*
58 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
59 */
60#ifndef LOG_ACRE_MBX_ENTER
61#define LOG_ACRE_MBX_ENTER(pk_cmbx)
62#endif /* LOG_ACRE_MBX_ENTER */
63
64#ifndef LOG_ACRE_MBX_LEAVE
65#define LOG_ACRE_MBX_LEAVE(ercd)
66#endif /* LOG_ACRE_MBX_LEAVE */
67
68#ifndef LOG_DEL_MBX_ENTER
69#define LOG_DEL_MBX_ENTER(mbxid)
70#endif /* LOG_DEL_MBX_ENTER */
71
72#ifndef LOG_DEL_MBX_LEAVE
73#define LOG_DEL_MBX_LEAVE(ercd)
74#endif /* LOG_DEL_MBX_LEAVE */
75
76#ifndef LOG_SND_MBX_ENTER
77#define LOG_SND_MBX_ENTER(mbxid, pk_msg)
78#endif /* LOG_SND_MBX_ENTER */
79
80#ifndef LOG_SND_MBX_LEAVE
81#define LOG_SND_MBX_LEAVE(ercd)
82#endif /* LOG_SND_MBX_LEAVE */
83
84#ifndef LOG_RCV_MBX_ENTER
85#define LOG_RCV_MBX_ENTER(mbxid, ppk_msg)
86#endif /* LOG_RCV_MBX_ENTER */
87
88#ifndef LOG_RCV_MBX_LEAVE
89#define LOG_RCV_MBX_LEAVE(ercd, pk_msg)
90#endif /* LOG_RCV_MBX_LEAVE */
91
92#ifndef LOG_PRCV_MBX_ENTER
93#define LOG_PRCV_MBX_ENTER(mbxid, ppk_msg)
94#endif /* LOG_PRCV_MBX_ENTER */
95
96#ifndef LOG_PRCV_MBX_LEAVE
97#define LOG_PRCV_MBX_LEAVE(ercd, pk_msg)
98#endif /* LOG_PRCV_MBX_LEAVE */
99
100#ifndef LOG_TRCV_MBX_ENTER
101#define LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout)
102#endif /* LOG_TRCV_MBX_ENTER */
103
104#ifndef LOG_TRCV_MBX_LEAVE
105#define LOG_TRCV_MBX_LEAVE(ercd, pk_msg)
106#endif /* LOG_TRCV_MBX_LEAVE */
107
108#ifndef LOG_INI_MBX_ENTER
109#define LOG_INI_MBX_ENTER(mbxid)
110#endif /* LOG_INI_MBX_ENTER */
111
112#ifndef LOG_INI_MBX_LEAVE
113#define LOG_INI_MBX_LEAVE(ercd)
114#endif /* LOG_INI_MBX_LEAVE */
115
116#ifndef LOG_REF_MBX_ENTER
117#define LOG_REF_MBX_ENTER(mbxid, pk_rmbx)
118#endif /* LOG_REF_MBX_ENTER */
119
120#ifndef LOG_REF_MBX_LEAVE
121#define LOG_REF_MBX_LEAVE(ercd, pk_rmbx)
122#endif /* LOG_REF_MBX_LEAVE */
123
124/*
125 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚̐”
126 */
127#define tnum_mbx ((uint_t)(tmax_mbxid - TMIN_MBXID + 1))
128#define tnum_smbx ((uint_t)(tmax_smbxid - TMIN_MBXID + 1))
129
130/*
131 * ƒ[ƒ‹ƒ{ƒbƒNƒXID‚©‚烁[ƒ‹ƒ{ƒbƒNƒXŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒ
132 */
133#define INDEX_MBX(mbxid) ((uint_t)((mbxid) - TMIN_MBXID))
134#define get_mbxcb(mbxid) (&(mbxcb_table[INDEX_MBX(mbxid)]))
135
136#ifdef TOPPERS_mbxini
137
138/*
139 * Žg—p‚µ‚Ä‚¢‚È‚¢ƒ[ƒ‹ƒ{ƒbƒNƒXŠÇ—ƒuƒƒbƒN‚̃ŠƒXƒg
140 */
141QUEUE free_mbxcb;
142
143/*
144 * ƒ[ƒ‹ƒ{ƒbƒNƒX‹@”\‚̏‰Šú‰»
145 */
146void
147initialize_mailbox(void)
148{
149 uint_t i, j;
150 MBXCB *p_mbxcb;
151 MBXINIB *p_mbxinib;
152
153 for (p_mbxcb = mbxcb_table, i = 0; i < tnum_smbx; p_mbxcb++, i++) {
154 queue_initialize(&(p_mbxcb->wait_queue));
155 p_mbxcb->p_mbxinib = &(mbxinib_table[i]);
156 p_mbxcb->pk_head = NULL;
157 }
158 queue_initialize(&free_mbxcb);
159 for (j = 0; i < tnum_mbx; p_mbxcb++, i++, j++) {
160 p_mbxinib = &(ambxinib_table[j]);
161 p_mbxinib->mbxatr = TA_NOEXS;
162 p_mbxcb->p_mbxinib = ((const MBXINIB *) p_mbxinib);
163 queue_insert_prev(&free_mbxcb, &(p_mbxcb->wait_queue));
164 }
165}
166
167#endif /* TOPPERS_mbxini */
168
169/*
170 * ƒƒbƒZ[ƒW—Dæ“x‚ÌŽæo‚µ
171 */
172#define MSGPRI(pk_msg) (((T_MSG_PRI *) pk_msg)->msgpri)
173
174/*
175 * —Dæ“x‡ƒƒbƒZ[ƒWƒLƒ…
176[‚Ö‚Ì‘}“ü
177 */
178Inline void
179enqueue_msg_pri(T_MSG **ppk_prevmsg_next, T_MSG *pk_msg)
180{
181 T_MSG *pk_nextmsg;
182
183 while ((pk_nextmsg = *ppk_prevmsg_next) != NULL) {
184 if (MSGPRI(pk_nextmsg) > MSGPRI(pk_msg)) {
185 break;
186 }
187 ppk_prevmsg_next = &(pk_nextmsg->pk_next);
188 }
189 pk_msg->pk_next = pk_nextmsg;
190 *ppk_prevmsg_next = pk_msg;
191}
192
193/*
194 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚̐¶¬
195 */
196#ifdef TOPPERS_acre_mbx
197
198ER_UINT
199acre_mbx(const T_CMBX *pk_cmbx)
200{
201 MBXCB *p_mbxcb;
202 MBXINIB *p_mbxinib;
203 ER ercd;
204
205 LOG_ACRE_MBX_ENTER(pk_cmbx);
206 CHECK_TSKCTX_UNL();
207 CHECK_RSATR(pk_cmbx->mbxatr, TA_TPRI|TA_MPRI);
208 CHECK_MPRI(pk_cmbx->maxmpri);
209 CHECK_NOSPT(pk_cmbx->mprihd == NULL);
210
211 t_lock_cpu();
212 if (queue_empty(&free_mbxcb)) {
213 ercd = E_NOID;
214 }
215 else {
216 p_mbxcb = ((MBXCB *) queue_delete_next(&free_mbxcb));
217 p_mbxinib = (MBXINIB *)(p_mbxcb->p_mbxinib);
218 p_mbxinib->mbxatr = pk_cmbx->mbxatr;
219 p_mbxinib->maxmpri = pk_cmbx->maxmpri;
220
221 queue_initialize(&(p_mbxcb->wait_queue));
222 p_mbxcb->pk_head = NULL;
223 ercd = MBXID(p_mbxcb);
224 }
225 t_unlock_cpu();
226
227 error_exit:
228 LOG_ACRE_MBX_LEAVE(ercd);
229 return(ercd);
230}
231
232#endif /* TOPPERS_acre_mbx */
233
234/*
235 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚̍폜
236 */
237#ifdef TOPPERS_del_mbx
238
239ER
240del_mbx(ID mbxid)
241{
242 MBXCB *p_mbxcb;
243 MBXINIB *p_mbxinib;
244 bool_t dspreq;
245 ER ercd;
246
247 LOG_DEL_MBX_ENTER(mbxid);
248 CHECK_TSKCTX_UNL();
249 CHECK_MBXID(mbxid);
250 p_mbxcb = get_mbxcb(mbxid);
251
252 t_lock_cpu();
253 if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
254 ercd = E_NOEXS;
255 }
256 else if (MBXID(p_mbxcb) > tmax_smbxid) {
257 dspreq = init_wait_queue(&(p_mbxcb->wait_queue));
258 p_mbxinib = (MBXINIB *)(p_mbxcb->p_mbxinib);
259 p_mbxinib->mbxatr = TA_NOEXS;
260 queue_insert_prev(&free_mbxcb, &(p_mbxcb->wait_queue));
261 if (dspreq) {
262 dispatch();
263 }
264 ercd = E_OK;
265 }
266 else {
267 ercd = E_OBJ;
268 }
269 t_unlock_cpu();
270
271 error_exit:
272 LOG_DEL_MBX_LEAVE(ercd);
273 return(ercd);
274}
275
276#endif /* TOPPERS_del_mbx */
277
278/*
279 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚Ö‚Ì‘—M
280 */
281#ifdef TOPPERS_snd_mbx
282
283ER
284snd_mbx(ID mbxid, T_MSG *pk_msg)
285{
286 MBXCB *p_mbxcb;
287 TCB *p_tcb;
288 ER ercd;
289
290 LOG_SND_MBX_ENTER(mbxid, pk_msg);
291 CHECK_TSKCTX_UNL();
292 CHECK_MBXID(mbxid);
293 p_mbxcb = get_mbxcb(mbxid);
294 CHECK_PAR((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) == 0U
295 || (TMIN_MPRI <= MSGPRI(pk_msg)
296 && MSGPRI(pk_msg) <= p_mbxcb->p_mbxinib->maxmpri));
297
298 t_lock_cpu();
299 if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
300 ercd = E_NOEXS;
301 }
302 else if (!queue_empty(&(p_mbxcb->wait_queue))) {
303 p_tcb = (TCB *) queue_delete_next(&(p_mbxcb->wait_queue));
304 ((WINFO_MBX *)(p_tcb->p_winfo))->pk_msg = pk_msg;
305 if (wait_complete(p_tcb)) {
306 dispatch();
307 }
308 ercd = E_OK;
309 }
310 else if ((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) != 0U) {
311 enqueue_msg_pri(&(p_mbxcb->pk_head), pk_msg);
312 ercd = E_OK;
313 }
314 else {
315 pk_msg->pk_next = NULL;
316 if (p_mbxcb->pk_head != NULL) {
317 p_mbxcb->pk_last->pk_next = pk_msg;
318 }
319 else {
320 p_mbxcb->pk_head = pk_msg;
321 }
322 p_mbxcb->pk_last = pk_msg;
323 ercd = E_OK;
324 }
325 t_unlock_cpu();
326
327 error_exit:
328 LOG_SND_MBX_LEAVE(ercd);
329 return(ercd);
330}
331
332#endif /* TOPPERS_snd_mbx */
333
334/*
335 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚©‚ç‚ÌŽóM
336 */
337#ifdef TOPPERS_rcv_mbx
338
339ER
340rcv_mbx(ID mbxid, T_MSG **ppk_msg)
341{
342 MBXCB *p_mbxcb;
343 WINFO_MBX winfo_mbx;
344 ER ercd;
345
346 LOG_RCV_MBX_ENTER(mbxid, ppk_msg);
347 CHECK_DISPATCH();
348 CHECK_MBXID(mbxid);
349 p_mbxcb = get_mbxcb(mbxid);
350
351 t_lock_cpu();
352 if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
353 ercd = E_NOEXS;
354 }
355 else if (p_mbxcb->pk_head != NULL) {
356 *ppk_msg = p_mbxcb->pk_head;
357 p_mbxcb->pk_head = (*ppk_msg)->pk_next;
358 ercd = E_OK;
359 }
360 else {
361 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
362 wobj_make_wait((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx);
363 dispatch();
364 ercd = winfo_mbx.winfo.wercd;
365 if (ercd == E_OK) {
366 *ppk_msg = winfo_mbx.pk_msg;
367 }
368 }
369 t_unlock_cpu();
370
371 error_exit:
372 LOG_RCV_MBX_LEAVE(ercd, *ppk_msg);
373 return(ercd);
374}
375
376#endif /* TOPPERS_rcv_mbx */
377
378/*
379 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚©‚ç‚ÌŽóMiƒ|[ƒŠƒ“ƒOj
380 */
381#ifdef TOPPERS_prcv_mbx
382
383ER
384prcv_mbx(ID mbxid, T_MSG **ppk_msg)
385{
386 MBXCB *p_mbxcb;
387 ER ercd;
388
389 LOG_PRCV_MBX_ENTER(mbxid, ppk_msg);
390 CHECK_TSKCTX_UNL();
391 CHECK_MBXID(mbxid);
392 p_mbxcb = get_mbxcb(mbxid);
393
394 t_lock_cpu();
395 if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
396 ercd = E_NOEXS;
397 }
398 else if (p_mbxcb->pk_head != NULL) {
399 *ppk_msg = p_mbxcb->pk_head;
400 p_mbxcb->pk_head = (*ppk_msg)->pk_next;
401 ercd = E_OK;
402 }
403 else {
404 ercd = E_TMOUT;
405 }
406 t_unlock_cpu();
407
408 error_exit:
409 LOG_PRCV_MBX_LEAVE(ercd, *ppk_msg);
410 return(ercd);
411}
412
413#endif /* TOPPERS_prcv_mbx */
414
415/*
416 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚©‚ç‚ÌŽóMiƒ^ƒCƒ€ƒAƒEƒg‚ ‚èj
417 */
418#ifdef TOPPERS_trcv_mbx
419
420ER
421trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout)
422{
423 MBXCB *p_mbxcb;
424 WINFO_MBX winfo_mbx;
425 TMEVTB tmevtb;
426 ER ercd;
427
428 LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout);
429 CHECK_DISPATCH();
430 CHECK_MBXID(mbxid);
431 CHECK_TMOUT(tmout);
432 p_mbxcb = get_mbxcb(mbxid);
433
434 t_lock_cpu();
435 if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
436 ercd = E_NOEXS;
437 }
438 else if (p_mbxcb->pk_head != NULL) {
439 *ppk_msg = p_mbxcb->pk_head;
440 p_mbxcb->pk_head = (*ppk_msg)->pk_next;
441 ercd = E_OK;
442 }
443 else if (tmout == TMO_POL) {
444 ercd = E_TMOUT;
445 }
446 else {
447 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
448 wobj_make_wait_tmout((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx,
449 &tmevtb, tmout);
450 dispatch();
451 ercd = winfo_mbx.winfo.wercd;
452 if (ercd == E_OK) {
453 *ppk_msg = winfo_mbx.pk_msg;
454 }
455 }
456 t_unlock_cpu();
457
458 error_exit:
459 LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg);
460 return(ercd);
461}
462
463#endif /* TOPPERS_trcv_mbx */
464
465/*
466 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚̍ú‰»
467 */
468#ifdef TOPPERS_ini_mbx
469
470ER
471ini_mbx(ID mbxid)
472{
473 MBXCB *p_mbxcb;
474 bool_t dspreq;
475 ER ercd;
476
477 LOG_INI_MBX_ENTER(mbxid);
478 CHECK_TSKCTX_UNL();
479 CHECK_MBXID(mbxid);
480 p_mbxcb = get_mbxcb(mbxid);
481
482 t_lock_cpu();
483 if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
484 ercd = E_NOEXS;
485 }
486 else {
487 dspreq = init_wait_queue(&(p_mbxcb->wait_queue));
488 p_mbxcb->pk_head = NULL;
489 if (dspreq) {
490 dispatch();
491 }
492 ercd = E_OK;
493 }
494 t_unlock_cpu();
495
496 error_exit:
497 LOG_INI_MBX_LEAVE(ercd);
498 return(ercd);
499}
500
501#endif /* TOPPERS_ini_mbx */
502
503/*
504 * ƒ[ƒ‹ƒ{ƒbƒNƒX‚̏ó‘ÔŽQÆ
505 */
506#ifdef TOPPERS_ref_mbx
507
508ER
509ref_mbx(ID mbxid, T_RMBX *pk_rmbx)
510{
511 MBXCB *p_mbxcb;
512 ER ercd;
513
514 LOG_REF_MBX_ENTER(mbxid, pk_rmbx);
515 CHECK_TSKCTX_UNL();
516 CHECK_MBXID(mbxid);
517 p_mbxcb = get_mbxcb(mbxid);
518
519 t_lock_cpu();
520 if (p_mbxcb->p_mbxinib->mbxatr == TA_NOEXS) {
521 ercd = E_NOEXS;
522 }
523 else {
524 pk_rmbx->wtskid = wait_tskid(&(p_mbxcb->wait_queue));
525 pk_rmbx->pk_msg = p_mbxcb->pk_head;
526 ercd = E_OK;
527 }
528 t_unlock_cpu();
529
530 error_exit:
531 LOG_REF_MBX_LEAVE(ercd, pk_rmbx);
532 return(ercd);
533}
534
535#endif /* TOPPERS_ref_mbx */
Note: See TracBrowser for help on using the repository browser.