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

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

コメントの修正。

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