source: asp_wo_cfg/trunk/kernel/dataqueue.c@ 70

Last change on this file since 70 was 70, checked in by ertl-hiro, 10 years ago

ASPカーネルの動的生成パッケージに追従。

  • Property svn:keywords set to Id
File size: 16.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-2014 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 * と.
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 * 報告すること.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 * @(#) $Id: dataqueue.c 70 2014-04-16 23:04:43Z ertl-hiro $
41 */
42
43/*
44 * データキュー機能
45 */
46
47#include "kernel_impl.h"
48#include "check.h"
49#include "task.h"
50#include "wait.h"
51#include "dataqueue.h"
52
53/*
54 * トレースログマクロのデフォルト定義
55 */
56#ifndef LOG_CRE_DTQ_ENTER
57#define LOG_CRE_DTQ_ENTER(dtqid, pk_cdtq)
58#endif /* LOG_CRE_DTQ_ENTER */
59
60#ifndef LOG_CRE_DTQ_LEAVE
61#define LOG_CRE_DTQ_LEAVE(ercd)
62#endif /* LOG_CRE_DTQ_LEAVE */
63
64#ifndef LOG_SND_DTQ_ENTER
65#define LOG_SND_DTQ_ENTER(dtqid, data)
66#endif /* LOG_SND_DTQ_ENTER */
67
68#ifndef LOG_SND_DTQ_LEAVE
69#define LOG_SND_DTQ_LEAVE(ercd)
70#endif /* LOG_SND_DTQ_LEAVE */
71
72#ifndef LOG_PSND_DTQ_ENTER
73#define LOG_PSND_DTQ_ENTER(dtqid, data)
74#endif /* LOG_PSND_DTQ_ENTER */
75
76#ifndef LOG_PSND_DTQ_LEAVE
77#define LOG_PSND_DTQ_LEAVE(ercd)
78#endif /* LOG_PSND_DTQ_LEAVE */
79
80#ifndef LOG_IPSND_DTQ_ENTER
81#define LOG_IPSND_DTQ_ENTER(dtqid, data)
82#endif /* LOG_IPSND_DTQ_ENTER */
83
84#ifndef LOG_IPSND_DTQ_LEAVE
85#define LOG_IPSND_DTQ_LEAVE(ercd)
86#endif /* LOG_IPSND_DTQ_LEAVE */
87
88#ifndef LOG_TSND_DTQ_ENTER
89#define LOG_TSND_DTQ_ENTER(dtqid, data, tmout)
90#endif /* LOG_TSND_DTQ_ENTER */
91
92#ifndef LOG_TSND_DTQ_LEAVE
93#define LOG_TSND_DTQ_LEAVE(ercd)
94#endif /* LOG_TSND_DTQ_LEAVE */
95
96#ifndef LOG_FSND_DTQ_ENTER
97#define LOG_FSND_DTQ_ENTER(dtqid, data)
98#endif /* LOG_FSND_DTQ_ENTER */
99
100#ifndef LOG_FSND_DTQ_LEAVE
101#define LOG_FSND_DTQ_LEAVE(ercd)
102#endif /* LOG_FSND_DTQ_LEAVE */
103
104#ifndef LOG_IFSND_DTQ_ENTER
105#define LOG_IFSND_DTQ_ENTER(dtqid, data)
106#endif /* LOG_IFSND_DTQ_ENTER */
107
108#ifndef LOG_IFSND_DTQ_LEAVE
109#define LOG_IFSND_DTQ_LEAVE(ercd)
110#endif /* LOG_IFSND_DTQ_LEAVE */
111
112#ifndef LOG_RCV_DTQ_ENTER
113#define LOG_RCV_DTQ_ENTER(dtqid, p_data)
114#endif /* LOG_RCV_DTQ_ENTER */
115
116#ifndef LOG_RCV_DTQ_LEAVE
117#define LOG_RCV_DTQ_LEAVE(ercd, data)
118#endif /* LOG_RCV_DTQ_LEAVE */
119
120#ifndef LOG_PRCV_DTQ_ENTER
121#define LOG_PRCV_DTQ_ENTER(dtqid, p_data)
122#endif /* LOG_PRCV_DTQ_ENTER */
123
124#ifndef LOG_PRCV_DTQ_LEAVE
125#define LOG_PRCV_DTQ_LEAVE(ercd, data)
126#endif /* LOG_PRCV_DTQ_LEAVE */
127
128#ifndef LOG_TRCV_DTQ_ENTER
129#define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout)
130#endif /* LOG_TRCV_DTQ_ENTER */
131
132#ifndef LOG_TRCV_DTQ_LEAVE
133#define LOG_TRCV_DTQ_LEAVE(ercd, data)
134#endif /* LOG_TRCV_DTQ_LEAVE */
135
136#ifndef LOG_INI_DTQ_ENTER
137#define LOG_INI_DTQ_ENTER(dtqid)
138#endif /* LOG_INI_DTQ_ENTER */
139
140#ifndef LOG_INI_DTQ_LEAVE
141#define LOG_INI_DTQ_LEAVE(ercd)
142#endif /* LOG_INI_DTQ_LEAVE */
143
144#ifndef LOG_REF_DTQ_ENTER
145#define LOG_REF_DTQ_ENTER(dtqid, pk_rdtq)
146#endif /* LOG_REF_DTQ_ENTER */
147
148#ifndef LOG_REF_DTQ_LEAVE
149#define LOG_REF_DTQ_LEAVE(ercd, pk_rdtq)
150#endif /* LOG_REF_DTQ_LEAVE */
151
152/*
153 * データキューの数
154 */
155#define tnum_dtq ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))
156
157/*
158 * データキューIDからデータキュー管理ブロックを取り出すためのマクロ
159 */
160#define INDEX_DTQ(dtqid) ((uint_t)((dtqid) - TMIN_DTQID))
161#define get_dtqcb(dtqid) (&(dtqcb_table[INDEX_DTQ(dtqid)]))
162
163/*
164 * データキュー機能の初期化
165 */
166#ifdef TOPPERS_dtqini
167
168void
169initialize_dataqueue(void)
170{
171 uint_t i;
172 DTQCB *p_dtqcb;
173 DTQINIB *p_dtqinib;
174
175 for (i = 0; i < tnum_dtq; i++) {
176 p_dtqcb = &(dtqcb_table[i]);
177 p_dtqinib = &(dtqinib_table[i]);
178 p_dtqinib->dtqatr = TA_NOEXS;
179 p_dtqcb->p_dtqinib = ((const DTQINIB *) p_dtqinib);
180 }
181}
182
183#endif /* TOPPERS_dtqini */
184
185/*
186 * データキューの生成
187 */
188#ifdef TOPPERS_cre_dtq
189
190ER
191cre_dtq(ID dtqid, const T_CDTQ *pk_cdtq)
192{
193 DTQCB *p_dtqcb;
194 DTQINIB *p_dtqinib;
195 ATR dtqatr;
196 DTQMB *p_dtqmb;
197 ER ercd;
198
199 LOG_CRE_DTQ_ENTER(dtqid, pk_cdtq);
200 CHECK_INIRTN();
201 CHECK_DTQID(dtqid);
202 CHECK_RSATR(pk_cdtq->dtqatr, TA_TPRI);
203 if (pk_cdtq->dtqmb != NULL) {
204 CHECK_ALIGN_MB(pk_cdtq->dtqmb);
205 }
206 dtqatr = pk_cdtq->dtqatr;
207 p_dtqmb = pk_cdtq->dtqmb;
208 p_dtqcb = get_dtqcb(dtqid);
209
210 if (p_dtqcb->p_dtqinib->dtqatr != TA_NOEXS) {
211 ercd = E_OBJ;
212 }
213 else {
214 if (pk_cdtq->dtqcnt != 0 && p_dtqmb == NULL) {
215 p_dtqmb = kernel_malloc(sizeof(DTQMB) * pk_cdtq->dtqcnt);
216 }
217 if (pk_cdtq->dtqcnt != 0 && p_dtqmb == NULL) {
218 ercd = E_NOMEM;
219 }
220 else {
221 p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
222 p_dtqinib->dtqatr = dtqatr;
223 p_dtqinib->dtqcnt = pk_cdtq->dtqcnt;
224 p_dtqinib->p_dtqmb = p_dtqmb;
225
226 queue_initialize(&(p_dtqcb->swait_queue));
227 queue_initialize(&(p_dtqcb->rwait_queue));
228 p_dtqcb->count = 0U;
229 p_dtqcb->head = 0U;
230 p_dtqcb->tail = 0U;
231 ercd = E_OK;
232 }
233 }
234
235 error_exit:
236 LOG_CRE_DTQ_LEAVE(ercd);
237 return(ercd);
238}
239
240#endif /* TOPPERS_cre_dtq */
241
242/*
243 * データキュー管理領域へのデータの格納
244 */
245#ifdef TOPPERS_dtqenq
246
247void
248enqueue_data(DTQCB *p_dtqcb, intptr_t data)
249{
250 (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
251 p_dtqcb->count++;
252 p_dtqcb->tail++;
253 if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
254 p_dtqcb->tail = 0U;
255 }
256}
257
258#endif /* TOPPERS_dtqenq */
259
260/*
261 * データキュー管理領域へのデータの強制格納
262 */
263#ifdef TOPPERS_dtqfenq
264
265void
266force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
267{
268 (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
269 p_dtqcb->tail++;
270 if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
271 p_dtqcb->tail = 0U;
272 }
273 if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
274 p_dtqcb->count++;
275 }
276 else {
277 p_dtqcb->head = p_dtqcb->tail;
278 }
279}
280
281#endif /* TOPPERS_dtqfenq */
282
283/*
284 * データキュー管理領域からのデータの取出し
285 */
286#ifdef TOPPERS_dtqdeq
287
288void
289dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data)
290{
291 *p_data = (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head)->data;
292 p_dtqcb->count--;
293 p_dtqcb->head++;
294 if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
295 p_dtqcb->head = 0U;
296 }
297}
298
299#endif /* TOPPERS_dtqdeq */
300
301/*
302 * データキューへのデータ送信
303 */
304#ifdef TOPPERS_dtqsnd
305
306bool_t
307send_data(DTQCB *p_dtqcb, intptr_t data, bool_t *p_dspreq)
308{
309 TCB *p_tcb;
310
311 if (!queue_empty(&(p_dtqcb->rwait_queue))) {
312 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
313 ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
314 *p_dspreq = wait_complete(p_tcb);
315 return(true);
316 }
317 else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
318 enqueue_data(p_dtqcb, data);
319 *p_dspreq = false;
320 return(true);
321 }
322 else {
323 return(false);
324 }
325}
326
327#endif /* TOPPERS_dtqsnd */
328
329/*
330 * データキューへのデータ強制送信
331 */
332#ifdef TOPPERS_dtqfsnd
333
334bool_t
335force_send_data(DTQCB *p_dtqcb, intptr_t data)
336{
337 TCB *p_tcb;
338
339 if (!queue_empty(&(p_dtqcb->rwait_queue))) {
340 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
341 ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
342 return(wait_complete(p_tcb));
343 }
344 else {
345 force_enqueue_data(p_dtqcb, data);
346 return(false);
347 }
348}
349
350#endif /* TOPPERS_dtqfsnd */
351
352/*
353 * データキューからのデータ受信
354 */
355#ifdef TOPPERS_dtqrcv
356
357bool_t
358receive_data(DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_dspreq)
359{
360 TCB *p_tcb;
361 intptr_t data;
362
363 if (p_dtqcb->count > 0U) {
364 dequeue_data(p_dtqcb, p_data);
365 if (!queue_empty(&(p_dtqcb->swait_queue))) {
366 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
367 data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
368 enqueue_data(p_dtqcb, data);
369 *p_dspreq = wait_complete(p_tcb);
370 }
371 else {
372 *p_dspreq = false;
373 }
374 return(true);
375 }
376 else if (!queue_empty(&(p_dtqcb->swait_queue))) {
377 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
378 *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
379 *p_dspreq = wait_complete(p_tcb);
380 return(true);
381 }
382 else {
383 return(false);
384 }
385}
386
387#endif /* TOPPERS_dtqrcv */
388
389/*
390 * データキューへの送信
391 */
392#ifdef TOPPERS_snd_dtq
393
394ER
395snd_dtq(ID dtqid, intptr_t data)
396{
397 DTQCB *p_dtqcb;
398 WINFO_DTQ winfo_dtq;
399 bool_t dspreq;
400 ER ercd;
401
402 LOG_SND_DTQ_ENTER(dtqid, data);
403 CHECK_DISPATCH();
404 CHECK_DTQID(dtqid);
405 p_dtqcb = get_dtqcb(dtqid);
406 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
407
408 t_lock_cpu();
409 if (send_data(p_dtqcb, data, &dspreq)) {
410 if (dspreq) {
411 dispatch();
412 }
413 ercd = E_OK;
414 }
415 else {
416 winfo_dtq.data = data;
417 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
418 wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq);
419 dispatch();
420 ercd = winfo_dtq.winfo.wercd;
421 }
422 t_unlock_cpu();
423
424 error_exit:
425 LOG_SND_DTQ_LEAVE(ercd);
426 return(ercd);
427}
428
429#endif /* TOPPERS_snd_dtq */
430
431/*
432 * データキューへの送信(ポーリング)
433 */
434#ifdef TOPPERS_psnd_dtq
435
436ER
437psnd_dtq(ID dtqid, intptr_t data)
438{
439 DTQCB *p_dtqcb;
440 bool_t dspreq;
441 ER ercd;
442
443 LOG_PSND_DTQ_ENTER(dtqid, data);
444 CHECK_TSKCTX_UNL();
445 CHECK_DTQID(dtqid);
446 p_dtqcb = get_dtqcb(dtqid);
447 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
448
449 t_lock_cpu();
450 if (send_data(p_dtqcb, data, &dspreq)) {
451 if (dspreq) {
452 dispatch();
453 }
454 ercd = E_OK;
455 }
456 else {
457 ercd = E_TMOUT;
458 }
459 t_unlock_cpu();
460
461 error_exit:
462 LOG_PSND_DTQ_LEAVE(ercd);
463 return(ercd);
464}
465
466#endif /* TOPPERS_psnd_dtq */
467
468/*
469 * データキューへの送信(ポーリング,非タスクコンテキスト用)
470 */
471#ifdef TOPPERS_ipsnd_dtq
472
473ER
474ipsnd_dtq(ID dtqid, intptr_t data)
475{
476 DTQCB *p_dtqcb;
477 bool_t dspreq;
478 ER ercd;
479
480 LOG_IPSND_DTQ_ENTER(dtqid, data);
481 CHECK_INTCTX_UNL();
482 CHECK_DTQID(dtqid);
483 p_dtqcb = get_dtqcb(dtqid);
484 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
485
486 i_lock_cpu();
487 if (send_data(p_dtqcb, data, &dspreq)) {
488 if (dspreq) {
489 reqflg = true;
490 }
491 ercd = E_OK;
492 }
493 else {
494 ercd = E_TMOUT;
495 }
496 i_unlock_cpu();
497
498 error_exit:
499 LOG_IPSND_DTQ_LEAVE(ercd);
500 return(ercd);
501}
502
503#endif /* TOPPERS_ipsnd_dtq */
504
505/*
506 * データキューへの送信(タイムアウトあり)
507 */
508#ifdef TOPPERS_tsnd_dtq
509
510ER
511tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
512{
513 DTQCB *p_dtqcb;
514 WINFO_DTQ winfo_dtq;
515 TMEVTB tmevtb;
516 bool_t dspreq;
517 ER ercd;
518
519 LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
520 CHECK_DISPATCH();
521 CHECK_DTQID(dtqid);
522 CHECK_TMOUT(tmout);
523 p_dtqcb = get_dtqcb(dtqid);
524 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
525
526 t_lock_cpu();
527 if (send_data(p_dtqcb, data, &dspreq)) {
528 if (dspreq) {
529 dispatch();
530 }
531 ercd = E_OK;
532 }
533 else if (tmout == TMO_POL) {
534 ercd = E_TMOUT;
535 }
536 else {
537 winfo_dtq.data = data;
538 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
539 wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq,
540 &tmevtb, tmout);
541 dispatch();
542 ercd = winfo_dtq.winfo.wercd;
543 }
544 t_unlock_cpu();
545
546 error_exit:
547 LOG_TSND_DTQ_LEAVE(ercd);
548 return(ercd);
549}
550
551#endif /* TOPPERS_tsnd_dtq */
552
553/*
554 * データキューへの強制送信
555 */
556#ifdef TOPPERS_fsnd_dtq
557
558ER
559fsnd_dtq(ID dtqid, intptr_t data)
560{
561 DTQCB *p_dtqcb;
562 ER ercd;
563
564 LOG_FSND_DTQ_ENTER(dtqid, data);
565 CHECK_TSKCTX_UNL();
566 CHECK_DTQID(dtqid);
567 p_dtqcb = get_dtqcb(dtqid);
568 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
569 CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
570
571 t_lock_cpu();
572 if (force_send_data(p_dtqcb, data)) {
573 dispatch();
574 }
575 ercd = E_OK;
576 t_unlock_cpu();
577
578 error_exit:
579 LOG_FSND_DTQ_LEAVE(ercd);
580 return(ercd);
581}
582
583#endif /* TOPPERS_fsnd_dtq */
584
585/*
586 * データキューへの強制送信(非タスクコンテキスト用)
587 */
588#ifdef TOPPERS_ifsnd_dtq
589
590ER
591ifsnd_dtq(ID dtqid, intptr_t data)
592{
593 DTQCB *p_dtqcb;
594 ER ercd;
595
596 LOG_IFSND_DTQ_ENTER(dtqid, data);
597 CHECK_INTCTX_UNL();
598 CHECK_DTQID(dtqid);
599 p_dtqcb = get_dtqcb(dtqid);
600 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
601 CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
602
603 i_lock_cpu();
604 if (force_send_data(p_dtqcb, data)) {
605 reqflg = true;
606 }
607 ercd = E_OK;
608 i_unlock_cpu();
609
610 error_exit:
611 LOG_IFSND_DTQ_LEAVE(ercd);
612 return(ercd);
613}
614
615#endif /* TOPPERS_ifsnd_dtq */
616
617/*
618 * データキューからの受信
619 */
620#ifdef TOPPERS_rcv_dtq
621
622ER
623rcv_dtq(ID dtqid, intptr_t *p_data)
624{
625 DTQCB *p_dtqcb;
626 WINFO_DTQ winfo_dtq;
627 bool_t dspreq;
628 ER ercd;
629
630 LOG_RCV_DTQ_ENTER(dtqid, p_data);
631 CHECK_DISPATCH();
632 CHECK_DTQID(dtqid);
633 p_dtqcb = get_dtqcb(dtqid);
634 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
635
636 t_lock_cpu();
637 if (receive_data(p_dtqcb, p_data, &dspreq)) {
638 if (dspreq) {
639 dispatch();
640 }
641 ercd = E_OK;
642 }
643 else {
644 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
645 make_wait(&(winfo_dtq.winfo));
646 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
647 winfo_dtq.p_dtqcb = p_dtqcb;
648 LOG_TSKSTAT(p_runtsk);
649 dispatch();
650 ercd = winfo_dtq.winfo.wercd;
651 if (ercd == E_OK) {
652 *p_data = winfo_dtq.data;
653 }
654 }
655 t_unlock_cpu();
656
657 error_exit:
658 LOG_RCV_DTQ_LEAVE(ercd, *p_data);
659 return(ercd);
660}
661
662#endif /* TOPPERS_rcv_dtq */
663
664/*
665 * データキューからの受信(ポーリング)
666 */
667#ifdef TOPPERS_prcv_dtq
668
669ER
670prcv_dtq(ID dtqid, intptr_t *p_data)
671{
672 DTQCB *p_dtqcb;
673 bool_t dspreq;
674 ER ercd;
675
676 LOG_PRCV_DTQ_ENTER(dtqid, p_data);
677 CHECK_TSKCTX_UNL();
678 CHECK_DTQID(dtqid);
679 p_dtqcb = get_dtqcb(dtqid);
680 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
681
682 t_lock_cpu();
683 if (receive_data(p_dtqcb, p_data, &dspreq)) {
684 if (dspreq) {
685 dispatch();
686 }
687 ercd = E_OK;
688 }
689 else {
690 ercd = E_TMOUT;
691 }
692 t_unlock_cpu();
693
694 error_exit:
695 LOG_PRCV_DTQ_LEAVE(ercd, *p_data);
696 return(ercd);
697}
698
699#endif /* TOPPERS_prcv_dtq */
700
701/*
702 * データキューからの受信(タイムアウトあり)
703 */
704#ifdef TOPPERS_trcv_dtq
705
706ER
707trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
708{
709 DTQCB *p_dtqcb;
710 WINFO_DTQ winfo_dtq;
711 TMEVTB tmevtb;
712 bool_t dspreq;
713 ER ercd;
714
715 LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
716 CHECK_DISPATCH();
717 CHECK_DTQID(dtqid);
718 CHECK_TMOUT(tmout);
719 p_dtqcb = get_dtqcb(dtqid);
720 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
721
722 t_lock_cpu();
723 if (receive_data(p_dtqcb, p_data, &dspreq)) {
724 if (dspreq) {
725 dispatch();
726 }
727 ercd = E_OK;
728 }
729 else if (tmout == TMO_POL) {
730 ercd = E_TMOUT;
731 }
732 else {
733 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
734 make_wait_tmout(&(winfo_dtq.winfo), &tmevtb, tmout);
735 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
736 winfo_dtq.p_dtqcb = p_dtqcb;
737 LOG_TSKSTAT(p_runtsk);
738 dispatch();
739 ercd = winfo_dtq.winfo.wercd;
740 if (ercd == E_OK) {
741 *p_data = winfo_dtq.data;
742 }
743 }
744 t_unlock_cpu();
745
746 error_exit:
747 LOG_TRCV_DTQ_LEAVE(ercd, *p_data);
748 return(ercd);
749}
750
751#endif /* TOPPERS_trcv_dtq */
752
753/*
754 * データキューの再初期化
755 */
756#ifdef TOPPERS_ini_dtq
757
758ER
759ini_dtq(ID dtqid)
760{
761 DTQCB *p_dtqcb;
762 bool_t dspreq;
763 ER ercd;
764
765 LOG_INI_DTQ_ENTER(dtqid);
766 CHECK_TSKCTX_UNL();
767 CHECK_DTQID(dtqid);
768 p_dtqcb = get_dtqcb(dtqid);
769 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
770
771 t_lock_cpu();
772 dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
773 if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
774 dspreq = true;
775 };
776 p_dtqcb->count = 0U;
777 p_dtqcb->head = 0U;
778 p_dtqcb->tail = 0U;
779 if (dspreq) {
780 dispatch();
781 }
782 ercd = E_OK;
783 t_unlock_cpu();
784
785 error_exit:
786 LOG_INI_DTQ_LEAVE(ercd);
787 return(ercd);
788}
789
790#endif /* TOPPERS_ini_dtq */
791
792/*
793 * データキューの状態参照
794 */
795#ifdef TOPPERS_ref_dtq
796
797ER
798ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
799{
800 DTQCB *p_dtqcb;
801 ER ercd;
802
803 LOG_REF_DTQ_ENTER(dtqid, pk_rdtq);
804 CHECK_TSKCTX_UNL();
805 CHECK_DTQID(dtqid);
806 p_dtqcb = get_dtqcb(dtqid);
807 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
808
809 t_lock_cpu();
810 pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue));
811 pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue));
812 pk_rdtq->sdtqcnt = p_dtqcb->count;
813 ercd = E_OK;
814 t_unlock_cpu();
815
816 error_exit:
817 LOG_REF_DTQ_LEAVE(ercd, pk_rdtq);
818 return(ercd);
819}
820
821#endif /* TOPPERS_ref_dtq */
Note: See TracBrowser for help on using the repository browser.