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

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

ASP for EWARM のコミット.

File size: 15.4 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: dataqueue.c 1960 2010-11-20 02:20:40Z ertl-hiro $
45 */
46
47/*
48 * ƒf[ƒ^ƒLƒ…
49[‹@”\
50 */
51
52#include "kernel_impl.h"
53#include "check.h"
54#include "task.h"
55#include "wait.h"
56#include "dataqueue.h"
57
58/*
59 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
60 */
61#ifndef LOG_SND_DTQ_ENTER
62#define LOG_SND_DTQ_ENTER(dtqid, data)
63#endif /* LOG_SND_DTQ_ENTER */
64
65#ifndef LOG_SND_DTQ_LEAVE
66#define LOG_SND_DTQ_LEAVE(ercd)
67#endif /* LOG_SND_DTQ_LEAVE */
68
69#ifndef LOG_PSND_DTQ_ENTER
70#define LOG_PSND_DTQ_ENTER(dtqid, data)
71#endif /* LOG_PSND_DTQ_ENTER */
72
73#ifndef LOG_PSND_DTQ_LEAVE
74#define LOG_PSND_DTQ_LEAVE(ercd)
75#endif /* LOG_PSND_DTQ_LEAVE */
76
77#ifndef LOG_IPSND_DTQ_ENTER
78#define LOG_IPSND_DTQ_ENTER(dtqid, data)
79#endif /* LOG_IPSND_DTQ_ENTER */
80
81#ifndef LOG_IPSND_DTQ_LEAVE
82#define LOG_IPSND_DTQ_LEAVE(ercd)
83#endif /* LOG_IPSND_DTQ_LEAVE */
84
85#ifndef LOG_TSND_DTQ_ENTER
86#define LOG_TSND_DTQ_ENTER(dtqid, data, tmout)
87#endif /* LOG_TSND_DTQ_ENTER */
88
89#ifndef LOG_TSND_DTQ_LEAVE
90#define LOG_TSND_DTQ_LEAVE(ercd)
91#endif /* LOG_TSND_DTQ_LEAVE */
92
93#ifndef LOG_FSND_DTQ_ENTER
94#define LOG_FSND_DTQ_ENTER(dtqid, data)
95#endif /* LOG_FSND_DTQ_ENTER */
96
97#ifndef LOG_FSND_DTQ_LEAVE
98#define LOG_FSND_DTQ_LEAVE(ercd)
99#endif /* LOG_FSND_DTQ_LEAVE */
100
101#ifndef LOG_IFSND_DTQ_ENTER
102#define LOG_IFSND_DTQ_ENTER(dtqid, data)
103#endif /* LOG_IFSND_DTQ_ENTER */
104
105#ifndef LOG_IFSND_DTQ_LEAVE
106#define LOG_IFSND_DTQ_LEAVE(ercd)
107#endif /* LOG_IFSND_DTQ_LEAVE */
108
109#ifndef LOG_RCV_DTQ_ENTER
110#define LOG_RCV_DTQ_ENTER(dtqid, p_data)
111#endif /* LOG_RCV_DTQ_ENTER */
112
113#ifndef LOG_RCV_DTQ_LEAVE
114#define LOG_RCV_DTQ_LEAVE(ercd, data)
115#endif /* LOG_RCV_DTQ_LEAVE */
116
117#ifndef LOG_PRCV_DTQ_ENTER
118#define LOG_PRCV_DTQ_ENTER(dtqid, p_data)
119#endif /* LOG_PRCV_DTQ_ENTER */
120
121#ifndef LOG_PRCV_DTQ_LEAVE
122#define LOG_PRCV_DTQ_LEAVE(ercd, data)
123#endif /* LOG_PRCV_DTQ_LEAVE */
124
125#ifndef LOG_TRCV_DTQ_ENTER
126#define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout)
127#endif /* LOG_TRCV_DTQ_ENTER */
128
129#ifndef LOG_TRCV_DTQ_LEAVE
130#define LOG_TRCV_DTQ_LEAVE(ercd, data)
131#endif /* LOG_TRCV_DTQ_LEAVE */
132
133#ifndef LOG_INI_DTQ_ENTER
134#define LOG_INI_DTQ_ENTER(dtqid)
135#endif /* LOG_INI_DTQ_ENTER */
136
137#ifndef LOG_INI_DTQ_LEAVE
138#define LOG_INI_DTQ_LEAVE(ercd)
139#endif /* LOG_INI_DTQ_LEAVE */
140
141#ifndef LOG_REF_DTQ_ENTER
142#define LOG_REF_DTQ_ENTER(dtqid, pk_rdtq)
143#endif /* LOG_REF_DTQ_ENTER */
144
145#ifndef LOG_REF_DTQ_LEAVE
146#define LOG_REF_DTQ_LEAVE(ercd, pk_rdtq)
147#endif /* LOG_REF_DTQ_LEAVE */
148
149/*
150 * ƒf[ƒ^ƒLƒ…
151[‚̐”
152 */
153#define tnum_dtq ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))
154
155/*
156 * ƒf[ƒ^ƒLƒ…
157[ID‚©‚çƒf[ƒ^ƒLƒ…
158[ŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒ
159 */
160#define INDEX_DTQ(dtqid) ((uint_t)((dtqid) - TMIN_DTQID))
161#define get_dtqcb(dtqid) (&(dtqcb_table[INDEX_DTQ(dtqid)]))
162
163/*
164 * ƒf[ƒ^ƒLƒ…
165[‹@”\‚̏‰Šú‰»
166 */
167#ifdef TOPPERS_dtqini
168
169void
170initialize_dataqueue(void)
171{
172 uint_t i;
173 DTQCB *p_dtqcb;
174
175 for (p_dtqcb = dtqcb_table, i = 0; i < tnum_dtq; p_dtqcb++, i++) {
176 queue_initialize(&(p_dtqcb->swait_queue));
177 p_dtqcb->p_dtqinib = &(dtqinib_table[i]);
178 queue_initialize(&(p_dtqcb->rwait_queue));
179 p_dtqcb->count = 0U;
180 p_dtqcb->head = 0U;
181 p_dtqcb->tail = 0U;
182 }
183}
184
185#endif /* TOPPERS_dtqini */
186
187/*
188 * ƒf[ƒ^ƒLƒ…
189[ŠÇ——̈æ‚ւ̃f[ƒ^‚ÌŠi”[
190 */
191#ifdef TOPPERS_dtqenq
192
193void
194enqueue_data(DTQCB *p_dtqcb, intptr_t data)
195{
196 (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
197 p_dtqcb->count++;
198 p_dtqcb->tail++;
199 if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
200 p_dtqcb->tail = 0U;
201 }
202}
203
204#endif /* TOPPERS_dtqenq */
205
206/*
207 * ƒf[ƒ^ƒLƒ…
208[ŠÇ——̈æ‚ւ̃f[ƒ^‚Ì‹­§Ši”[
209 */
210#ifdef TOPPERS_dtqfenq
211
212void
213force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
214{
215 (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
216 p_dtqcb->tail++;
217 if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
218 p_dtqcb->tail = 0U;
219 }
220 if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
221 p_dtqcb->count++;
222 }
223 else {
224 p_dtqcb->head = p_dtqcb->tail;
225 }
226}
227
228#endif /* TOPPERS_dtqfenq */
229
230/*
231 * ƒf[ƒ^ƒLƒ…
232[ŠÇ——̈悩‚ç‚̃f[ƒ^‚ÌŽæo‚µ
233 */
234#ifdef TOPPERS_dtqdeq
235
236void
237dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data)
238{
239 *p_data = (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head)->data;
240 p_dtqcb->count--;
241 p_dtqcb->head++;
242 if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
243 p_dtqcb->head = 0U;
244 }
245}
246
247#endif /* TOPPERS_dtqdeq */
248
249/*
250 * ƒf[ƒ^ƒLƒ…
251[‚ւ̃f[ƒ^‘—M
252 */
253#ifdef TOPPERS_dtqsnd
254
255bool_t
256send_data(DTQCB *p_dtqcb, intptr_t data, bool_t *p_reqdsp)
257{
258 TCB *p_tcb;
259
260 if (!queue_empty(&(p_dtqcb->rwait_queue))) {
261 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
262 ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
263 *p_reqdsp = wait_complete(p_tcb);
264 return(true);
265 }
266 else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
267 enqueue_data(p_dtqcb, data);
268 *p_reqdsp = false;
269 return(true);
270 }
271 else {
272 return(false);
273 }
274}
275
276#endif /* TOPPERS_dtqsnd */
277
278/*
279 * ƒf[ƒ^ƒLƒ…
280[‚ւ̃f[ƒ^‹­§‘—M
281 */
282#ifdef TOPPERS_dtqfsnd
283
284bool_t
285force_send_data(DTQCB *p_dtqcb, intptr_t data)
286{
287 TCB *p_tcb;
288
289 if (!queue_empty(&(p_dtqcb->rwait_queue))) {
290 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
291 ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
292 return(wait_complete(p_tcb));
293 }
294 else {
295 force_enqueue_data(p_dtqcb, data);
296 return(false);
297 }
298}
299
300#endif /* TOPPERS_dtqfsnd */
301
302/*
303 * ‘—M‘Ò‚¿ƒLƒ…
304[‚̐擪ƒ^ƒXƒN‚©‚ç‚̃f[ƒ^ŽóM
305 */
306#ifdef TOPPERS_dtqrcv
307
308bool_t
309receive_data(DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_reqdsp)
310{
311 TCB *p_tcb;
312 intptr_t data;
313
314 if (p_dtqcb->count > 0U) {
315 dequeue_data(p_dtqcb, p_data);
316 if (!queue_empty(&(p_dtqcb->swait_queue))) {
317 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
318 data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
319 enqueue_data(p_dtqcb, data);
320 *p_reqdsp = wait_complete(p_tcb);
321 }
322 else {
323 *p_reqdsp = false;
324 }
325 return(true);
326 }
327 else if (!queue_empty(&(p_dtqcb->swait_queue))) {
328 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
329 *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
330 *p_reqdsp = wait_complete(p_tcb);
331 return(true);
332 }
333 else {
334 return(false);
335 }
336}
337
338#endif /* TOPPERS_dtqrcv */
339
340/*
341 * ƒf[ƒ^ƒLƒ…
342[‚Ö‚Ì‘—M
343 */
344#ifdef TOPPERS_snd_dtq
345
346ER
347snd_dtq(ID dtqid, intptr_t data)
348{
349 DTQCB *p_dtqcb;
350 WINFO_DTQ winfo_dtq;
351 bool_t reqdsp;
352 ER ercd;
353
354 LOG_SND_DTQ_ENTER(dtqid, data);
355 CHECK_DISPATCH();
356 CHECK_DTQID(dtqid);
357 p_dtqcb = get_dtqcb(dtqid);
358
359 t_lock_cpu();
360 if (send_data(p_dtqcb, data, &reqdsp)) {
361 if (reqdsp) {
362 dispatch();
363 }
364 ercd = E_OK;
365 }
366 else {
367 winfo_dtq.data = data;
368 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
369 wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq);
370 dispatch();
371 ercd = winfo_dtq.winfo.wercd;
372 }
373 t_unlock_cpu();
374
375 error_exit:
376 LOG_SND_DTQ_LEAVE(ercd);
377 return(ercd);
378}
379
380#endif /* TOPPERS_snd_dtq */
381
382/*
383 * ƒf[ƒ^ƒLƒ…
384[‚Ö‚Ì‘—Miƒ|[ƒŠƒ“ƒOj
385 */
386#ifdef TOPPERS_psnd_dtq
387
388ER
389psnd_dtq(ID dtqid, intptr_t data)
390{
391 DTQCB *p_dtqcb;
392 bool_t reqdsp;
393 ER ercd;
394
395 LOG_PSND_DTQ_ENTER(dtqid, data);
396 CHECK_TSKCTX_UNL();
397 CHECK_DTQID(dtqid);
398 p_dtqcb = get_dtqcb(dtqid);
399
400 t_lock_cpu();
401 if (send_data(p_dtqcb, data, &reqdsp)) {
402 if (reqdsp) {
403 dispatch();
404 }
405 ercd = E_OK;
406 }
407 else {
408 ercd = E_TMOUT;
409 }
410 t_unlock_cpu();
411
412 error_exit:
413 LOG_PSND_DTQ_LEAVE(ercd);
414 return(ercd);
415}
416
417#endif /* TOPPERS_psnd_dtq */
418
419/*
420 * ƒf[ƒ^ƒLƒ…
421[‚Ö‚Ì‘—Miƒ|[ƒŠƒ“ƒOC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
422 */
423#ifdef TOPPERS_ipsnd_dtq
424
425ER
426ipsnd_dtq(ID dtqid, intptr_t data)
427{
428 DTQCB *p_dtqcb;
429 bool_t reqdsp;
430 ER ercd;
431
432 LOG_IPSND_DTQ_ENTER(dtqid, data);
433 CHECK_INTCTX_UNL();
434 CHECK_DTQID(dtqid);
435 p_dtqcb = get_dtqcb(dtqid);
436
437 i_lock_cpu();
438 if (send_data(p_dtqcb, data, &reqdsp)) {
439 if (reqdsp) {
440 reqflg = true;
441 }
442 ercd = E_OK;
443 }
444 else {
445 ercd = E_TMOUT;
446 }
447 i_unlock_cpu();
448
449 error_exit:
450 LOG_IPSND_DTQ_LEAVE(ercd);
451 return(ercd);
452}
453
454#endif /* TOPPERS_ipsnd_dtq */
455
456/*
457 * ƒf[ƒ^ƒLƒ…
458[‚Ö‚Ì‘—Miƒ^ƒCƒ€ƒAƒEƒg‚ ‚èj
459 */
460#ifdef TOPPERS_tsnd_dtq
461
462ER
463tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
464{
465 DTQCB *p_dtqcb;
466 WINFO_DTQ winfo_dtq;
467 TMEVTB tmevtb;
468 bool_t reqdsp;
469 ER ercd;
470
471 LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
472 CHECK_DISPATCH();
473 CHECK_DTQID(dtqid);
474 CHECK_TMOUT(tmout);
475 p_dtqcb = get_dtqcb(dtqid);
476
477 t_lock_cpu();
478 if (send_data(p_dtqcb, data, &reqdsp)) {
479 if (reqdsp) {
480 dispatch();
481 }
482 ercd = E_OK;
483 }
484 else if (tmout == TMO_POL) {
485 ercd = E_TMOUT;
486 }
487 else {
488 winfo_dtq.data = data;
489 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
490 wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq,
491 &tmevtb, tmout);
492 dispatch();
493 ercd = winfo_dtq.winfo.wercd;
494 }
495 t_unlock_cpu();
496
497 error_exit:
498 LOG_TSND_DTQ_LEAVE(ercd);
499 return(ercd);
500}
501
502#endif /* TOPPERS_tsnd_dtq */
503
504/*
505 * ƒf[ƒ^ƒLƒ…
506[‚Ö‚Ì‹­§‘—M
507 */
508#ifdef TOPPERS_fsnd_dtq
509
510ER
511fsnd_dtq(ID dtqid, intptr_t data)
512{
513 DTQCB *p_dtqcb;
514 ER ercd;
515
516 LOG_FSND_DTQ_ENTER(dtqid, data);
517 CHECK_TSKCTX_UNL();
518 CHECK_DTQID(dtqid);
519 p_dtqcb = get_dtqcb(dtqid);
520 CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
521
522 t_lock_cpu();
523 if (force_send_data(p_dtqcb, data)) {
524 dispatch();
525 }
526 ercd = E_OK;
527 t_unlock_cpu();
528
529 error_exit:
530 LOG_FSND_DTQ_LEAVE(ercd);
531 return(ercd);
532}
533
534#endif /* TOPPERS_fsnd_dtq */
535
536/*
537 * ƒf[ƒ^ƒLƒ…
538[‚Ö‚Ì‹­§‘—Mi”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
539 */
540#ifdef TOPPERS_ifsnd_dtq
541
542ER
543ifsnd_dtq(ID dtqid, intptr_t data)
544{
545 DTQCB *p_dtqcb;
546 ER ercd;
547
548 LOG_IFSND_DTQ_ENTER(dtqid, data);
549 CHECK_INTCTX_UNL();
550 CHECK_DTQID(dtqid);
551 p_dtqcb = get_dtqcb(dtqid);
552 CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
553
554 i_lock_cpu();
555 if (force_send_data(p_dtqcb, data)) {
556 reqflg = true;
557 }
558 ercd = E_OK;
559 i_unlock_cpu();
560
561 error_exit:
562 LOG_IFSND_DTQ_LEAVE(ercd);
563 return(ercd);
564}
565
566#endif /* TOPPERS_ifsnd_dtq */
567
568/*
569 * ƒf[ƒ^ƒLƒ…
570[‚©‚ç‚ÌŽóM
571 */
572#ifdef TOPPERS_rcv_dtq
573
574ER
575rcv_dtq(ID dtqid, intptr_t *p_data)
576{
577 DTQCB *p_dtqcb;
578 WINFO_DTQ winfo_dtq;
579 bool_t reqdsp;
580 ER ercd;
581
582 LOG_RCV_DTQ_ENTER(dtqid, p_data);
583 CHECK_DISPATCH();
584 CHECK_DTQID(dtqid);
585 p_dtqcb = get_dtqcb(dtqid);
586
587 t_lock_cpu();
588 if (receive_data(p_dtqcb, p_data, &reqdsp)) {
589 if (reqdsp) {
590 dispatch();
591 }
592 ercd = E_OK;
593 }
594 else {
595 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
596 make_wait(&(winfo_dtq.winfo));
597 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
598 winfo_dtq.p_dtqcb = p_dtqcb;
599 LOG_TSKSTAT(p_runtsk);
600 dispatch();
601 ercd = winfo_dtq.winfo.wercd;
602 if (ercd == E_OK) {
603 *p_data = winfo_dtq.data;
604 }
605 }
606 t_unlock_cpu();
607
608 error_exit:
609 LOG_RCV_DTQ_LEAVE(ercd, *p_data);
610 return(ercd);
611}
612
613#endif /* TOPPERS_rcv_dtq */
614
615/*
616 * ƒf[ƒ^ƒLƒ…
617[‚©‚ç‚ÌŽóMiƒ|[ƒŠƒ“ƒOj
618 */
619#ifdef TOPPERS_prcv_dtq
620
621ER
622prcv_dtq(ID dtqid, intptr_t *p_data)
623{
624 DTQCB *p_dtqcb;
625 bool_t reqdsp;
626 ER ercd;
627
628 LOG_PRCV_DTQ_ENTER(dtqid, p_data);
629 CHECK_TSKCTX_UNL();
630 CHECK_DTQID(dtqid);
631 p_dtqcb = get_dtqcb(dtqid);
632
633 t_lock_cpu();
634 if (receive_data(p_dtqcb, p_data, &reqdsp)) {
635 if (reqdsp) {
636 dispatch();
637 }
638 ercd = E_OK;
639 }
640 else {
641 ercd = E_TMOUT;
642 }
643 t_unlock_cpu();
644
645 error_exit:
646 LOG_PRCV_DTQ_LEAVE(ercd, *p_data);
647 return(ercd);
648}
649
650#endif /* TOPPERS_prcv_dtq */
651
652/*
653 * ƒf[ƒ^ƒLƒ…
654[‚©‚ç‚ÌŽóMiƒ^ƒCƒ€ƒAƒEƒg‚ ‚èj
655 */
656#ifdef TOPPERS_trcv_dtq
657
658ER
659trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
660{
661 DTQCB *p_dtqcb;
662 WINFO_DTQ winfo_dtq;
663 TMEVTB tmevtb;
664 bool_t reqdsp;
665 ER ercd;
666
667 LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
668 CHECK_DISPATCH();
669 CHECK_DTQID(dtqid);
670 CHECK_TMOUT(tmout);
671 p_dtqcb = get_dtqcb(dtqid);
672
673 t_lock_cpu();
674 if (receive_data(p_dtqcb, p_data, &reqdsp)) {
675 if (reqdsp) {
676 dispatch();
677 }
678 ercd = E_OK;
679 }
680 else if (tmout == TMO_POL) {
681 ercd = E_TMOUT;
682 }
683 else {
684 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
685 make_wait_tmout(&(winfo_dtq.winfo), &tmevtb, tmout);
686 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
687 winfo_dtq.p_dtqcb = p_dtqcb;
688 LOG_TSKSTAT(p_runtsk);
689 dispatch();
690 ercd = winfo_dtq.winfo.wercd;
691 if (ercd == E_OK) {
692 *p_data = winfo_dtq.data;
693 }
694 }
695 t_unlock_cpu();
696
697 error_exit:
698 LOG_TRCV_DTQ_LEAVE(ercd, *p_data);
699 return(ercd);
700}
701
702#endif /* TOPPERS_trcv_dtq */
703
704/*
705 * ƒf[ƒ^ƒLƒ…
706[‚̍ú‰»
707 */
708#ifdef TOPPERS_ini_dtq
709
710ER
711ini_dtq(ID dtqid)
712{
713 DTQCB *p_dtqcb;
714 bool_t dspreq;
715 ER ercd;
716
717 LOG_INI_DTQ_ENTER(dtqid);
718 CHECK_TSKCTX_UNL();
719 CHECK_DTQID(dtqid);
720 p_dtqcb = get_dtqcb(dtqid);
721
722 t_lock_cpu();
723 dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
724 if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
725 dspreq = true;
726 };
727 p_dtqcb->count = 0U;
728 p_dtqcb->head = 0U;
729 p_dtqcb->tail = 0U;
730 if (dspreq) {
731 dispatch();
732 }
733 ercd = E_OK;
734 t_unlock_cpu();
735
736 error_exit:
737 LOG_INI_DTQ_LEAVE(ercd);
738 return(ercd);
739}
740
741#endif /* TOPPERS_ini_dtq */
742
743/*
744 * ƒf[ƒ^ƒLƒ…
745[‚̏ó‘ÔŽQÆ
746 */
747#ifdef TOPPERS_ref_dtq
748
749ER
750ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
751{
752 DTQCB *p_dtqcb;
753 ER ercd;
754
755 LOG_REF_DTQ_ENTER(dtqid, pk_rdtq);
756 CHECK_TSKCTX_UNL();
757 CHECK_DTQID(dtqid);
758 p_dtqcb = get_dtqcb(dtqid);
759
760 t_lock_cpu();
761 pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue));
762 pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue));
763 pk_rdtq->sdtqcnt = p_dtqcb->count;
764 ercd = E_OK;
765 t_unlock_cpu();
766
767 error_exit:
768 LOG_REF_DTQ_LEAVE(ercd, pk_rdtq);
769 return(ercd);
770}
771
772#endif /* TOPPERS_ref_dtq */
Note: See TracBrowser for help on using the repository browser.