source: rubycfg_asp/trunk/asp_dcre/kernel/dataqueue.c@ 313

Last change on this file since 313 was 313, checked in by coas-nagasima, 7 years ago

ソースを追加

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