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