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

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

asp_wo_kernelをコミット。

  • Property svn:keywords set to Id
File size: 16.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-2012 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 49 2012-09-06 04:41:53Z 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 dtqatr = pk_cdtq->dtqatr;
204 p_dtqmb = pk_cdtq->dtqmb;
205 p_dtqcb = get_dtqcb(dtqid);
206
207 if (p_dtqcb->p_dtqinib->dtqatr != TA_NOEXS) {
208 ercd = E_OBJ;
209 }
210 else {
211 if (pk_cdtq->dtqcnt != 0 && p_dtqmb == NULL) {
212 p_dtqmb = kernel_malloc(sizeof(DTQMB) * pk_cdtq->dtqcnt);
213 dtqatr |= TA_MBALLOC;
214 }
215 if (pk_cdtq->dtqcnt != 0 && p_dtqmb == NULL) {
216 ercd = E_NOMEM;
217 }
218 else {
219 p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib);
220 p_dtqinib->dtqatr = dtqatr;
221 p_dtqinib->dtqcnt = pk_cdtq->dtqcnt;
222 p_dtqinib->p_dtqmb = p_dtqmb;
223
224 queue_initialize(&(p_dtqcb->swait_queue));
225 queue_initialize(&(p_dtqcb->rwait_queue));
226 p_dtqcb->count = 0U;
227 p_dtqcb->head = 0U;
228 p_dtqcb->tail = 0U;
229 ercd = E_OK;
230 }
231 }
232
233 error_exit:
234 LOG_CRE_DTQ_LEAVE(ercd);
235 return(ercd);
236}
237
238#endif /* TOPPERS_cre_dtq */
239
240/*
241 * データキュー管理領域へのデータの格納
242 */
243#ifdef TOPPERS_dtqenq
244
245void
246enqueue_data(DTQCB *p_dtqcb, intptr_t data)
247{
248 (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
249 p_dtqcb->count++;
250 p_dtqcb->tail++;
251 if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
252 p_dtqcb->tail = 0U;
253 }
254}
255
256#endif /* TOPPERS_dtqenq */
257
258/*
259 * データキュー管理領域へのデータの強制格納
260 */
261#ifdef TOPPERS_dtqfenq
262
263void
264force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
265{
266 (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail)->data = data;
267 p_dtqcb->tail++;
268 if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
269 p_dtqcb->tail = 0U;
270 }
271 if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
272 p_dtqcb->count++;
273 }
274 else {
275 p_dtqcb->head = p_dtqcb->tail;
276 }
277}
278
279#endif /* TOPPERS_dtqfenq */
280
281/*
282 * データキュー管理領域からのデータの取出し
283 */
284#ifdef TOPPERS_dtqdeq
285
286void
287dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data)
288{
289 *p_data = (p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head)->data;
290 p_dtqcb->count--;
291 p_dtqcb->head++;
292 if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
293 p_dtqcb->head = 0U;
294 }
295}
296
297#endif /* TOPPERS_dtqdeq */
298
299/*
300 * データキューへのデータ送信
301 */
302#ifdef TOPPERS_dtqsnd
303
304bool_t
305send_data(DTQCB *p_dtqcb, intptr_t data, bool_t *p_reqdsp)
306{
307 TCB *p_tcb;
308
309 if (!queue_empty(&(p_dtqcb->rwait_queue))) {
310 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
311 ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
312 *p_reqdsp = wait_complete(p_tcb);
313 return(true);
314 }
315 else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
316 enqueue_data(p_dtqcb, data);
317 *p_reqdsp = false;
318 return(true);
319 }
320 else {
321 return(false);
322 }
323}
324
325#endif /* TOPPERS_dtqsnd */
326
327/*
328 * データキューへのデータ強制送信
329 */
330#ifdef TOPPERS_dtqfsnd
331
332bool_t
333force_send_data(DTQCB *p_dtqcb, intptr_t data)
334{
335 TCB *p_tcb;
336
337 if (!queue_empty(&(p_dtqcb->rwait_queue))) {
338 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
339 ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
340 return(wait_complete(p_tcb));
341 }
342 else {
343 force_enqueue_data(p_dtqcb, data);
344 return(false);
345 }
346}
347
348#endif /* TOPPERS_dtqfsnd */
349
350/*
351 * 送信待ちキューの先頭タスクからのデータ受信
352 */
353#ifdef TOPPERS_dtqrcv
354
355bool_t
356receive_data(DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_reqdsp)
357{
358 TCB *p_tcb;
359 intptr_t data;
360
361 if (p_dtqcb->count > 0U) {
362 dequeue_data(p_dtqcb, p_data);
363 if (!queue_empty(&(p_dtqcb->swait_queue))) {
364 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
365 data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
366 enqueue_data(p_dtqcb, data);
367 *p_reqdsp = wait_complete(p_tcb);
368 }
369 else {
370 *p_reqdsp = false;
371 }
372 return(true);
373 }
374 else if (!queue_empty(&(p_dtqcb->swait_queue))) {
375 p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
376 *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
377 *p_reqdsp = wait_complete(p_tcb);
378 return(true);
379 }
380 else {
381 return(false);
382 }
383}
384
385#endif /* TOPPERS_dtqrcv */
386
387/*
388 * データキューへの送信
389 */
390#ifdef TOPPERS_snd_dtq
391
392ER
393snd_dtq(ID dtqid, intptr_t data)
394{
395 DTQCB *p_dtqcb;
396 WINFO_DTQ winfo_dtq;
397 bool_t reqdsp;
398 ER ercd;
399
400 LOG_SND_DTQ_ENTER(dtqid, data);
401 CHECK_DISPATCH();
402 CHECK_DTQID(dtqid);
403 p_dtqcb = get_dtqcb(dtqid);
404 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
405
406 t_lock_cpu();
407 if (send_data(p_dtqcb, data, &reqdsp)) {
408 if (reqdsp) {
409 dispatch();
410 }
411 ercd = E_OK;
412 }
413 else {
414 winfo_dtq.data = data;
415 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
416 wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq);
417 dispatch();
418 ercd = winfo_dtq.winfo.wercd;
419 }
420 t_unlock_cpu();
421
422 error_exit:
423 LOG_SND_DTQ_LEAVE(ercd);
424 return(ercd);
425}
426
427#endif /* TOPPERS_snd_dtq */
428
429/*
430 * データキューへの送信(ポーリング)
431 */
432#ifdef TOPPERS_psnd_dtq
433
434ER
435psnd_dtq(ID dtqid, intptr_t data)
436{
437 DTQCB *p_dtqcb;
438 bool_t reqdsp;
439 ER ercd;
440
441 LOG_PSND_DTQ_ENTER(dtqid, data);
442 CHECK_TSKCTX_UNL();
443 CHECK_DTQID(dtqid);
444 p_dtqcb = get_dtqcb(dtqid);
445 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
446
447 t_lock_cpu();
448 if (send_data(p_dtqcb, data, &reqdsp)) {
449 if (reqdsp) {
450 dispatch();
451 }
452 ercd = E_OK;
453 }
454 else {
455 ercd = E_TMOUT;
456 }
457 t_unlock_cpu();
458
459 error_exit:
460 LOG_PSND_DTQ_LEAVE(ercd);
461 return(ercd);
462}
463
464#endif /* TOPPERS_psnd_dtq */
465
466/*
467 * データキューへの送信(ポーリング,非タスクコンテキスト用)
468 */
469#ifdef TOPPERS_ipsnd_dtq
470
471ER
472ipsnd_dtq(ID dtqid, intptr_t data)
473{
474 DTQCB *p_dtqcb;
475 bool_t reqdsp;
476 ER ercd;
477
478 LOG_IPSND_DTQ_ENTER(dtqid, data);
479 CHECK_INTCTX_UNL();
480 CHECK_DTQID(dtqid);
481 p_dtqcb = get_dtqcb(dtqid);
482 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
483
484 i_lock_cpu();
485 if (send_data(p_dtqcb, data, &reqdsp)) {
486 if (reqdsp) {
487 reqflg = true;
488 }
489 ercd = E_OK;
490 }
491 else {
492 ercd = E_TMOUT;
493 }
494 i_unlock_cpu();
495
496 error_exit:
497 LOG_IPSND_DTQ_LEAVE(ercd);
498 return(ercd);
499}
500
501#endif /* TOPPERS_ipsnd_dtq */
502
503/*
504 * データキューへの送信(タイムアウトあり)
505 */
506#ifdef TOPPERS_tsnd_dtq
507
508ER
509tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
510{
511 DTQCB *p_dtqcb;
512 WINFO_DTQ winfo_dtq;
513 TMEVTB tmevtb;
514 bool_t reqdsp;
515 ER ercd;
516
517 LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
518 CHECK_DISPATCH();
519 CHECK_DTQID(dtqid);
520 CHECK_TMOUT(tmout);
521 p_dtqcb = get_dtqcb(dtqid);
522 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
523
524 t_lock_cpu();
525 if (send_data(p_dtqcb, data, &reqdsp)) {
526 if (reqdsp) {
527 dispatch();
528 }
529 ercd = E_OK;
530 }
531 else if (tmout == TMO_POL) {
532 ercd = E_TMOUT;
533 }
534 else {
535 winfo_dtq.data = data;
536 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
537 wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq,
538 &tmevtb, tmout);
539 dispatch();
540 ercd = winfo_dtq.winfo.wercd;
541 }
542 t_unlock_cpu();
543
544 error_exit:
545 LOG_TSND_DTQ_LEAVE(ercd);
546 return(ercd);
547}
548
549#endif /* TOPPERS_tsnd_dtq */
550
551/*
552 * データキューへの強制送信
553 */
554#ifdef TOPPERS_fsnd_dtq
555
556ER
557fsnd_dtq(ID dtqid, intptr_t data)
558{
559 DTQCB *p_dtqcb;
560 ER ercd;
561
562 LOG_FSND_DTQ_ENTER(dtqid, data);
563 CHECK_TSKCTX_UNL();
564 CHECK_DTQID(dtqid);
565 p_dtqcb = get_dtqcb(dtqid);
566 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
567 CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
568
569 t_lock_cpu();
570 if (force_send_data(p_dtqcb, data)) {
571 dispatch();
572 }
573 ercd = E_OK;
574 t_unlock_cpu();
575
576 error_exit:
577 LOG_FSND_DTQ_LEAVE(ercd);
578 return(ercd);
579}
580
581#endif /* TOPPERS_fsnd_dtq */
582
583/*
584 * データキューへの強制送信(非タスクコンテキスト用)
585 */
586#ifdef TOPPERS_ifsnd_dtq
587
588ER
589ifsnd_dtq(ID dtqid, intptr_t data)
590{
591 DTQCB *p_dtqcb;
592 ER ercd;
593
594 LOG_IFSND_DTQ_ENTER(dtqid, data);
595 CHECK_INTCTX_UNL();
596 CHECK_DTQID(dtqid);
597 p_dtqcb = get_dtqcb(dtqid);
598 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
599 CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
600
601 i_lock_cpu();
602 if (force_send_data(p_dtqcb, data)) {
603 reqflg = true;
604 }
605 ercd = E_OK;
606 i_unlock_cpu();
607
608 error_exit:
609 LOG_IFSND_DTQ_LEAVE(ercd);
610 return(ercd);
611}
612
613#endif /* TOPPERS_ifsnd_dtq */
614
615/*
616 * データキューからの受信
617 */
618#ifdef TOPPERS_rcv_dtq
619
620ER
621rcv_dtq(ID dtqid, intptr_t *p_data)
622{
623 DTQCB *p_dtqcb;
624 WINFO_DTQ winfo_dtq;
625 bool_t reqdsp;
626 ER ercd;
627
628 LOG_RCV_DTQ_ENTER(dtqid, p_data);
629 CHECK_DISPATCH();
630 CHECK_DTQID(dtqid);
631 p_dtqcb = get_dtqcb(dtqid);
632 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
633
634 t_lock_cpu();
635 if (receive_data(p_dtqcb, p_data, &reqdsp)) {
636 if (reqdsp) {
637 dispatch();
638 }
639 ercd = E_OK;
640 }
641 else {
642 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
643 make_wait(&(winfo_dtq.winfo));
644 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
645 winfo_dtq.p_dtqcb = p_dtqcb;
646 LOG_TSKSTAT(p_runtsk);
647 dispatch();
648 ercd = winfo_dtq.winfo.wercd;
649 if (ercd == E_OK) {
650 *p_data = winfo_dtq.data;
651 }
652 }
653 t_unlock_cpu();
654
655 error_exit:
656 LOG_RCV_DTQ_LEAVE(ercd, *p_data);
657 return(ercd);
658}
659
660#endif /* TOPPERS_rcv_dtq */
661
662/*
663 * データキューからの受信(ポーリング)
664 */
665#ifdef TOPPERS_prcv_dtq
666
667ER
668prcv_dtq(ID dtqid, intptr_t *p_data)
669{
670 DTQCB *p_dtqcb;
671 bool_t reqdsp;
672 ER ercd;
673
674 LOG_PRCV_DTQ_ENTER(dtqid, p_data);
675 CHECK_TSKCTX_UNL();
676 CHECK_DTQID(dtqid);
677 p_dtqcb = get_dtqcb(dtqid);
678 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
679
680 t_lock_cpu();
681 if (receive_data(p_dtqcb, p_data, &reqdsp)) {
682 if (reqdsp) {
683 dispatch();
684 }
685 ercd = E_OK;
686 }
687 else {
688 ercd = E_TMOUT;
689 }
690 t_unlock_cpu();
691
692 error_exit:
693 LOG_PRCV_DTQ_LEAVE(ercd, *p_data);
694 return(ercd);
695}
696
697#endif /* TOPPERS_prcv_dtq */
698
699/*
700 * データキューからの受信(タイムアウトあり)
701 */
702#ifdef TOPPERS_trcv_dtq
703
704ER
705trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
706{
707 DTQCB *p_dtqcb;
708 WINFO_DTQ winfo_dtq;
709 TMEVTB tmevtb;
710 bool_t reqdsp;
711 ER ercd;
712
713 LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
714 CHECK_DISPATCH();
715 CHECK_DTQID(dtqid);
716 CHECK_TMOUT(tmout);
717 p_dtqcb = get_dtqcb(dtqid);
718 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
719
720 t_lock_cpu();
721 if (receive_data(p_dtqcb, p_data, &reqdsp)) {
722 if (reqdsp) {
723 dispatch();
724 }
725 ercd = E_OK;
726 }
727 else if (tmout == TMO_POL) {
728 ercd = E_TMOUT;
729 }
730 else {
731 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
732 make_wait_tmout(&(winfo_dtq.winfo), &tmevtb, tmout);
733 queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
734 winfo_dtq.p_dtqcb = p_dtqcb;
735 LOG_TSKSTAT(p_runtsk);
736 dispatch();
737 ercd = winfo_dtq.winfo.wercd;
738 if (ercd == E_OK) {
739 *p_data = winfo_dtq.data;
740 }
741 }
742 t_unlock_cpu();
743
744 error_exit:
745 LOG_TRCV_DTQ_LEAVE(ercd, *p_data);
746 return(ercd);
747}
748
749#endif /* TOPPERS_trcv_dtq */
750
751/*
752 * データキューの再初期化
753 */
754#ifdef TOPPERS_ini_dtq
755
756ER
757ini_dtq(ID dtqid)
758{
759 DTQCB *p_dtqcb;
760 bool_t dspreq;
761 ER ercd;
762
763 LOG_INI_DTQ_ENTER(dtqid);
764 CHECK_TSKCTX_UNL();
765 CHECK_DTQID(dtqid);
766 p_dtqcb = get_dtqcb(dtqid);
767 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
768
769 t_lock_cpu();
770 dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
771 if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
772 dspreq = true;
773 };
774 p_dtqcb->count = 0U;
775 p_dtqcb->head = 0U;
776 p_dtqcb->tail = 0U;
777 if (dspreq) {
778 dispatch();
779 }
780 ercd = E_OK;
781 t_unlock_cpu();
782
783 error_exit:
784 LOG_INI_DTQ_LEAVE(ercd);
785 return(ercd);
786}
787
788#endif /* TOPPERS_ini_dtq */
789
790/*
791 * データキューの状態参照
792 */
793#ifdef TOPPERS_ref_dtq
794
795ER
796ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
797{
798 DTQCB *p_dtqcb;
799 ER ercd;
800
801 LOG_REF_DTQ_ENTER(dtqid, pk_rdtq);
802 CHECK_TSKCTX_UNL();
803 CHECK_DTQID(dtqid);
804 p_dtqcb = get_dtqcb(dtqid);
805 CHECK_NOEXS(p_dtqcb->p_dtqinib->dtqatr);
806
807 t_lock_cpu();
808 pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue));
809 pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue));
810 pk_rdtq->sdtqcnt = p_dtqcb->count;
811 ercd = E_OK;
812 t_unlock_cpu();
813
814 error_exit:
815 LOG_REF_DTQ_LEAVE(ercd, pk_rdtq);
816 return(ercd);
817}
818
819#endif /* TOPPERS_ref_dtq */
Note: See TracBrowser for help on using the repository browser.