source: asp_ewarm/asp-1.7.0/kernel/pridataq.c@ 61

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

ASP for EWARM のコミット.

File size: 14.8 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: pridataq.c 1774 2010-03-19 12:45:46Z ertl-hiro $
45 */
46
47/*
48 * —Dæ“xƒf[ƒ^ƒLƒ…
49[‹@”\
50 */
51
52#include "kernel_impl.h"
53#include "check.h"
54#include "task.h"
55#include "wait.h"
56#include "pridataq.h"
57
58/*
59 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
60 */
61#ifndef LOG_SND_PDQ_ENTER
62#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
63#endif /* LOG_SND_PDQ_ENTER */
64
65#ifndef LOG_SND_PDQ_LEAVE
66#define LOG_SND_PDQ_LEAVE(ercd)
67#endif /* LOG_SND_PDQ_LEAVE */
68
69#ifndef LOG_PSND_PDQ_ENTER
70#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
71#endif /* LOG_PSND_PDQ_ENTER */
72
73#ifndef LOG_PSND_PDQ_LEAVE
74#define LOG_PSND_PDQ_LEAVE(ercd)
75#endif /* LOG_PSND_PDQ_LEAVE */
76
77#ifndef LOG_IPSND_PDQ_ENTER
78#define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri)
79#endif /* LOG_IPSND_PDQ_ENTER */
80
81#ifndef LOG_IPSND_PDQ_LEAVE
82#define LOG_IPSND_PDQ_LEAVE(ercd)
83#endif /* LOG_IPSND_PDQ_LEAVE */
84
85#ifndef LOG_TSND_PDQ_ENTER
86#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
87#endif /* LOG_TSND_PDQ_ENTER */
88
89#ifndef LOG_TSND_PDQ_LEAVE
90#define LOG_TSND_PDQ_LEAVE(ercd)
91#endif /* LOG_TSND_PDQ_LEAVE */
92
93#ifndef LOG_RCV_PDQ_ENTER
94#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
95#endif /* LOG_RCV_PDQ_ENTER */
96
97#ifndef LOG_RCV_PDQ_LEAVE
98#define LOG_RCV_PDQ_LEAVE(ercd, data, datapri)
99#endif /* LOG_RCV_PDQ_LEAVE */
100
101#ifndef LOG_PRCV_PDQ_ENTER
102#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
103#endif /* LOG_PRCV_PDQ_ENTER */
104
105#ifndef LOG_PRCV_PDQ_LEAVE
106#define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri)
107#endif /* LOG_PRCV_PDQ_LEAVE */
108
109#ifndef LOG_TRCV_PDQ_ENTER
110#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
111#endif /* LOG_TRCV_PDQ_ENTER */
112
113#ifndef LOG_TRCV_PDQ_LEAVE
114#define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri)
115#endif /* LOG_TRCV_PDQ_LEAVE */
116
117#ifndef LOG_INI_PDQ_ENTER
118#define LOG_INI_PDQ_ENTER(pdqid)
119#endif /* LOG_INI_PDQ_ENTER */
120
121#ifndef LOG_INI_PDQ_LEAVE
122#define LOG_INI_PDQ_LEAVE(ercd)
123#endif /* LOG_INI_PDQ_LEAVE */
124
125#ifndef LOG_REF_PDQ_ENTER
126#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
127#endif /* LOG_REF_PDQ_ENTER */
128
129#ifndef LOG_REF_PDQ_LEAVE
130#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
131#endif /* LOG_REF_PDQ_LEAVE */
132
133/*
134 * —Dæ“xƒf[ƒ^ƒLƒ…
135[‚̐”
136 */
137#define tnum_pdq ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
138
139/*
140 * —Dæ“xƒf[ƒ^ƒLƒ…
141[ID‚©‚ç—Dæ“xƒf[ƒ^ƒLƒ…
142[ŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½
143 * ‚߂̃}ƒNƒ
144 */
145#define INDEX_PDQ(pdqid) ((uint_t)((pdqid) - TMIN_PDQID))
146#define get_pdqcb(pdqid) (&(pdqcb_table[INDEX_PDQ(pdqid)]))
147
148/*
149 * —Dæ“xƒf[ƒ^ƒLƒ…
150[‹@”\‚̏‰Šú‰»
151 */
152#ifdef TOPPERS_pdqini
153
154void
155initialize_pridataq(void)
156{
157 uint_t i;
158 PDQCB *p_pdqcb;
159
160 for (p_pdqcb = pdqcb_table, i = 0; i < tnum_pdq; p_pdqcb++, i++) {
161 queue_initialize(&(p_pdqcb->swait_queue));
162 p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
163 queue_initialize(&(p_pdqcb->rwait_queue));
164 p_pdqcb->count = 0U;
165 p_pdqcb->p_head = NULL;
166 p_pdqcb->unused = 0U;
167 p_pdqcb->p_freelist = NULL;
168 }
169}
170
171#endif /* TOPPERS_pdqini */
172
173/*
174 * —Dæ“xƒf[ƒ^ƒLƒ…
175[ŠÇ——̈æ‚ւ̃f[ƒ^‚ÌŠi”[
176 */
177#ifdef TOPPERS_pdqenq
178
179void
180enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
181{
182 PDQMB *p_pdqmb;
183 PDQMB **pp_prev_next, *p_next;
184
185 if (p_pdqcb->p_freelist != NULL) {
186 p_pdqmb = p_pdqcb->p_freelist;
187 p_pdqcb->p_freelist = p_pdqmb->p_next;
188 }
189 else {
190 p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
191 p_pdqcb->unused++;
192 }
193
194 p_pdqmb->data = data;
195 p_pdqmb->datapri = datapri;
196
197 pp_prev_next = &(p_pdqcb->p_head);
198 while ((p_next = *pp_prev_next) != NULL) {
199 if (p_next->datapri > datapri) {
200 break;
201 }
202 pp_prev_next = &(p_next->p_next);
203 }
204 p_pdqmb->p_next = p_next;
205 *pp_prev_next = p_pdqmb;
206 p_pdqcb->count++;
207}
208
209#endif /* TOPPERS_pdqenq */
210
211/*
212 * —Dæ“xƒf[ƒ^ƒLƒ…
213[ŠÇ——̈悩‚ç‚̃f[ƒ^‚ÌŽæo‚µ
214 */
215#ifdef TOPPERS_pdqdeq
216
217void
218dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
219{
220 PDQMB *p_pdqmb;
221
222 p_pdqmb = p_pdqcb->p_head;
223 p_pdqcb->p_head = p_pdqmb->p_next;
224 p_pdqcb->count--;
225
226 *p_data = p_pdqmb->data;
227 *p_datapri = p_pdqmb->datapri;
228
229 p_pdqmb->p_next = p_pdqcb->p_freelist;
230 p_pdqcb->p_freelist = p_pdqmb;
231}
232
233#endif /* TOPPERS_pdqdeq */
234
235/*
236 * —Dæ“xƒf[ƒ^ƒLƒ…
237[‚ւ̃f[ƒ^‘—M
238 */
239#ifdef TOPPERS_pdqsnd
240
241bool_t
242send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_reqdsp)
243{
244 TCB *p_tcb;
245
246 if (!queue_empty(&(p_pdqcb->rwait_queue))) {
247 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
248 ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data;
249 ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
250 *p_reqdsp = wait_complete(p_tcb);
251 return(true);
252 }
253 else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
254 enqueue_pridata(p_pdqcb, data, datapri);
255 *p_reqdsp = false;
256 return(true);
257 }
258 else {
259 return(false);
260 }
261}
262
263#endif /* TOPPERS_pdqsnd */
264
265/*
266 * —Dæ“xƒf[ƒ^ƒLƒ…
267[‚©‚ç‚̃f[ƒ^ŽóM
268 */
269#ifdef TOPPERS_pdqrcv
270
271bool_t
272receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
273 PRI *p_datapri, bool_t *p_reqdsp)
274{
275 TCB *p_tcb;
276 intptr_t data;
277 PRI datapri;
278
279 if (p_pdqcb->count > 0U) {
280 dequeue_pridata(p_pdqcb, p_data, p_datapri);
281 if (!queue_empty(&(p_pdqcb->swait_queue))) {
282 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
283 data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
284 datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
285 enqueue_pridata(p_pdqcb, data, datapri);
286 *p_reqdsp = wait_complete(p_tcb);
287 }
288 else {
289 *p_reqdsp = false;
290 }
291 return(true);
292 }
293 else if (!queue_empty(&(p_pdqcb->swait_queue))) {
294 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
295 *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
296 *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
297 *p_reqdsp = wait_complete(p_tcb);
298 return(true);
299 }
300 else {
301 return(false);
302 }
303}
304
305#endif /* TOPPERS_pdqrcv */
306
307/*
308 * —Dæ“xƒf[ƒ^ƒLƒ…
309[‚Ö‚Ì‘—M
310 */
311#ifdef TOPPERS_snd_pdq
312
313ER
314snd_pdq(ID pdqid, intptr_t data, PRI datapri)
315{
316 PDQCB *p_pdqcb;
317 WINFO_PDQ winfo_pdq;
318 bool_t reqdsp;
319 ER ercd;
320
321 LOG_SND_PDQ_ENTER(pdqid, data, datapri);
322 CHECK_DISPATCH();
323 CHECK_PDQID(pdqid);
324 p_pdqcb = get_pdqcb(pdqid);
325 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
326
327 t_lock_cpu();
328 if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
329 if (reqdsp) {
330 dispatch();
331 }
332 ercd = E_OK;
333 }
334 else {
335 winfo_pdq.data = data;
336 winfo_pdq.datapri = datapri;
337 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
338 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
339 dispatch();
340 ercd = winfo_pdq.winfo.wercd;
341 }
342 t_unlock_cpu();
343
344 error_exit:
345 LOG_SND_PDQ_LEAVE(ercd);
346 return(ercd);
347}
348
349#endif /* TOPPERS_snd_pdq */
350
351/*
352 * —Dæ“xƒf[ƒ^ƒLƒ…
353[‚Ö‚Ì‘—Miƒ|[ƒŠƒ“ƒOj
354 */
355#ifdef TOPPERS_psnd_pdq
356
357ER
358psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
359{
360 PDQCB *p_pdqcb;
361 bool_t reqdsp;
362 ER ercd;
363
364 LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
365 CHECK_TSKCTX_UNL();
366 CHECK_PDQID(pdqid);
367 p_pdqcb = get_pdqcb(pdqid);
368 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
369
370 t_lock_cpu();
371 if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
372 if (reqdsp) {
373 dispatch();
374 }
375 ercd = E_OK;
376 }
377 else {
378 ercd = E_TMOUT;
379 }
380 t_unlock_cpu();
381
382 error_exit:
383 LOG_PSND_PDQ_LEAVE(ercd);
384 return(ercd);
385}
386
387#endif /* TOPPERS_psnd_pdq */
388
389/*
390 * —Dæ“xƒf[ƒ^ƒLƒ…
391[‚Ö‚Ì‘—Miƒ|[ƒŠƒ“ƒOC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
392 */
393#ifdef TOPPERS_ipsnd_pdq
394
395ER
396ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
397{
398 PDQCB *p_pdqcb;
399 bool_t reqdsp;
400 ER ercd;
401
402 LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
403 CHECK_INTCTX_UNL();
404 CHECK_PDQID(pdqid);
405 p_pdqcb = get_pdqcb(pdqid);
406 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
407
408 i_lock_cpu();
409 if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
410 if (reqdsp) {
411 reqflg = true;
412 }
413 ercd = E_OK;
414 }
415 else {
416 ercd = E_TMOUT;
417 }
418 i_unlock_cpu();
419
420 error_exit:
421 LOG_IPSND_PDQ_LEAVE(ercd);
422 return(ercd);
423}
424
425#endif /* TOPPERS_ipsnd_pdq */
426
427/*
428 * —Dæ“xƒf[ƒ^ƒLƒ…
429[‚Ö‚Ì‘—Miƒ^ƒCƒ€ƒAƒEƒg‚ ‚èj
430 */
431#ifdef TOPPERS_tsnd_pdq
432
433ER
434tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
435{
436 PDQCB *p_pdqcb;
437 WINFO_PDQ winfo_pdq;
438 TMEVTB tmevtb;
439 bool_t reqdsp;
440 ER ercd;
441
442 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
443 CHECK_DISPATCH();
444 CHECK_PDQID(pdqid);
445 CHECK_TMOUT(tmout);
446 p_pdqcb = get_pdqcb(pdqid);
447 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
448
449 t_lock_cpu();
450 if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
451 if (reqdsp) {
452 dispatch();
453 }
454 ercd = E_OK;
455 }
456 else if (tmout == TMO_POL) {
457 ercd = E_TMOUT;
458 }
459 else {
460 winfo_pdq.data = data;
461 winfo_pdq.datapri = datapri;
462 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
463 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
464 &tmevtb, tmout);
465 dispatch();
466 ercd = winfo_pdq.winfo.wercd;
467 }
468 t_unlock_cpu();
469
470 error_exit:
471 LOG_TSND_PDQ_LEAVE(ercd);
472 return(ercd);
473}
474
475#endif /* TOPPERS_tsnd_pdq */
476
477/*
478 * —Dæ“xƒf[ƒ^ƒLƒ…
479[‚©‚ç‚ÌŽóM
480 */
481#ifdef TOPPERS_rcv_pdq
482
483ER
484rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
485{
486 PDQCB *p_pdqcb;
487 WINFO_PDQ winfo_pdq;
488 bool_t reqdsp;
489 ER ercd;
490
491 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
492 CHECK_DISPATCH();
493 CHECK_PDQID(pdqid);
494 p_pdqcb = get_pdqcb(pdqid);
495
496 t_lock_cpu();
497 if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
498 if (reqdsp) {
499 dispatch();
500 }
501 ercd = E_OK;
502 }
503 else {
504 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
505 make_wait(&(winfo_pdq.winfo));
506 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
507 winfo_pdq.p_pdqcb = p_pdqcb;
508 LOG_TSKSTAT(p_runtsk);
509 dispatch();
510 ercd = winfo_pdq.winfo.wercd;
511 if (ercd == E_OK) {
512 *p_data = winfo_pdq.data;
513 *p_datapri = winfo_pdq.datapri;
514 }
515 }
516 t_unlock_cpu();
517
518 error_exit:
519 LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
520 return(ercd);
521}
522
523#endif /* TOPPERS_rcv_pdq */
524
525/*
526 * —Dæ“xƒf[ƒ^ƒLƒ…
527[‚©‚ç‚ÌŽóMiƒ|[ƒŠƒ“ƒOj
528 */
529#ifdef TOPPERS_prcv_pdq
530
531ER
532prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
533{
534 PDQCB *p_pdqcb;
535 bool_t reqdsp;
536 ER ercd;
537
538 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
539 CHECK_TSKCTX_UNL();
540 CHECK_PDQID(pdqid);
541 p_pdqcb = get_pdqcb(pdqid);
542
543 t_lock_cpu();
544 if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
545 if (reqdsp) {
546 dispatch();
547 }
548 ercd = E_OK;
549 }
550 else {
551 ercd = E_TMOUT;
552 }
553 t_unlock_cpu();
554
555 error_exit:
556 LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
557 return(ercd);
558}
559
560#endif /* TOPPERS_prcv_pdq */
561
562/*
563 * —Dæ“xƒf[ƒ^ƒLƒ…
564[‚©‚ç‚ÌŽóMiƒ^ƒCƒ€ƒAƒEƒg‚ ‚èj
565 */
566#ifdef TOPPERS_trcv_pdq
567
568ER
569trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
570{
571 PDQCB *p_pdqcb;
572 WINFO_PDQ winfo_pdq;
573 TMEVTB tmevtb;
574 bool_t reqdsp;
575 ER ercd;
576
577 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
578 CHECK_DISPATCH();
579 CHECK_PDQID(pdqid);
580 CHECK_TMOUT(tmout);
581 p_pdqcb = get_pdqcb(pdqid);
582
583 t_lock_cpu();
584 if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
585 if (reqdsp) {
586 dispatch();
587 }
588 ercd = E_OK;
589 }
590 else if (tmout == TMO_POL) {
591 ercd = E_TMOUT;
592 }
593 else {
594 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
595 make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout);
596 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
597 winfo_pdq.p_pdqcb = p_pdqcb;
598 LOG_TSKSTAT(p_runtsk);
599 dispatch();
600 ercd = winfo_pdq.winfo.wercd;
601 if (ercd == E_OK) {
602 *p_data = winfo_pdq.data;
603 *p_datapri = winfo_pdq.datapri;
604 }
605 }
606 t_unlock_cpu();
607
608 error_exit:
609 LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
610 return(ercd);
611}
612
613#endif /* TOPPERS_trcv_pdq */
614
615/*
616 * —Dæ“xƒf[ƒ^ƒLƒ…
617[‚̍ú‰»
618 */
619#ifdef TOPPERS_ini_pdq
620
621ER
622ini_pdq(ID pdqid)
623{
624 PDQCB *p_pdqcb;
625 bool_t dspreq;
626 ER ercd;
627
628 LOG_INI_PDQ_ENTER(pdqid);
629 CHECK_TSKCTX_UNL();
630 CHECK_PDQID(pdqid);
631 p_pdqcb = get_pdqcb(pdqid);
632
633 t_lock_cpu();
634 dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
635 if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
636 dspreq = true;
637 }
638 p_pdqcb->count = 0U;
639 p_pdqcb->p_head = NULL;
640 p_pdqcb->unused = 0U;
641 p_pdqcb->p_freelist = NULL;
642 if (dspreq) {
643 dispatch();
644 }
645 ercd = E_OK;
646 t_unlock_cpu();
647
648 error_exit:
649 LOG_INI_PDQ_LEAVE(ercd);
650 return(ercd);
651}
652
653#endif /* TOPPERS_ini_pdq */
654
655/*
656 * —Dæ“xƒf[ƒ^ƒLƒ…
657[‚̏ó‘ÔŽQÆ
658 */
659#ifdef TOPPERS_ref_pdq
660
661ER
662ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
663{
664 PDQCB *p_pdqcb;
665 ER ercd;
666
667 LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
668 CHECK_TSKCTX_UNL();
669 CHECK_PDQID(pdqid);
670 p_pdqcb = get_pdqcb(pdqid);
671
672 t_lock_cpu();
673 pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
674 pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
675 pk_rpdq->spdqcnt = p_pdqcb->count;
676 ercd = E_OK;
677 t_unlock_cpu();
678
679 error_exit:
680 LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
681 return(ercd);
682}
683
684#endif /* TOPPERS_ref_pdq */
Note: See TracBrowser for help on using the repository browser.