source: asp_wo_cfg/trunk/kernel/pridataq.c@ 63

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

TA_MEMALLOCとTA_MBALLOCを廃止。

  • Property svn:keywords set to Id
File size: 15.8 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: pridataq.c 63 2013-10-18 22:26: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 "pridataq.h"
52
53/*
54 * トレースログマクロのデフォルト定義
55 */
56#ifndef LOG_CRE_PDQ_ENTER
57#define LOG_CRE_PDQ_ENTER(pdqid, pk_cpdq)
58#endif /* LOG_CRE_PDQ_ENTER */
59
60#ifndef LOG_CRE_PDQ_LEAVE
61#define LOG_CRE_PDQ_LEAVE(ercd)
62#endif /* LOG_CRE_PDQ_LEAVE */
63
64#ifndef LOG_SND_PDQ_ENTER
65#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
66#endif /* LOG_SND_PDQ_ENTER */
67
68#ifndef LOG_SND_PDQ_LEAVE
69#define LOG_SND_PDQ_LEAVE(ercd)
70#endif /* LOG_SND_PDQ_LEAVE */
71
72#ifndef LOG_PSND_PDQ_ENTER
73#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
74#endif /* LOG_PSND_PDQ_ENTER */
75
76#ifndef LOG_PSND_PDQ_LEAVE
77#define LOG_PSND_PDQ_LEAVE(ercd)
78#endif /* LOG_PSND_PDQ_LEAVE */
79
80#ifndef LOG_IPSND_PDQ_ENTER
81#define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri)
82#endif /* LOG_IPSND_PDQ_ENTER */
83
84#ifndef LOG_IPSND_PDQ_LEAVE
85#define LOG_IPSND_PDQ_LEAVE(ercd)
86#endif /* LOG_IPSND_PDQ_LEAVE */
87
88#ifndef LOG_TSND_PDQ_ENTER
89#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
90#endif /* LOG_TSND_PDQ_ENTER */
91
92#ifndef LOG_TSND_PDQ_LEAVE
93#define LOG_TSND_PDQ_LEAVE(ercd)
94#endif /* LOG_TSND_PDQ_LEAVE */
95
96#ifndef LOG_RCV_PDQ_ENTER
97#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
98#endif /* LOG_RCV_PDQ_ENTER */
99
100#ifndef LOG_RCV_PDQ_LEAVE
101#define LOG_RCV_PDQ_LEAVE(ercd, data, datapri)
102#endif /* LOG_RCV_PDQ_LEAVE */
103
104#ifndef LOG_PRCV_PDQ_ENTER
105#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
106#endif /* LOG_PRCV_PDQ_ENTER */
107
108#ifndef LOG_PRCV_PDQ_LEAVE
109#define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri)
110#endif /* LOG_PRCV_PDQ_LEAVE */
111
112#ifndef LOG_TRCV_PDQ_ENTER
113#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
114#endif /* LOG_TRCV_PDQ_ENTER */
115
116#ifndef LOG_TRCV_PDQ_LEAVE
117#define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri)
118#endif /* LOG_TRCV_PDQ_LEAVE */
119
120#ifndef LOG_INI_PDQ_ENTER
121#define LOG_INI_PDQ_ENTER(pdqid)
122#endif /* LOG_INI_PDQ_ENTER */
123
124#ifndef LOG_INI_PDQ_LEAVE
125#define LOG_INI_PDQ_LEAVE(ercd)
126#endif /* LOG_INI_PDQ_LEAVE */
127
128#ifndef LOG_REF_PDQ_ENTER
129#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
130#endif /* LOG_REF_PDQ_ENTER */
131
132#ifndef LOG_REF_PDQ_LEAVE
133#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
134#endif /* LOG_REF_PDQ_LEAVE */
135
136/*
137 * 優先度データキューの数
138 */
139#define tnum_pdq ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
140
141/*
142 * 優先度データキューIDから優先度データキュー管理ブロックを取り出すた
143 * めのマクロ
144 */
145#define INDEX_PDQ(pdqid) ((uint_t)((pdqid) - TMIN_PDQID))
146#define get_pdqcb(pdqid) (&(pdqcb_table[INDEX_PDQ(pdqid)]))
147
148/*
149 * 優先度データキュー機能の初期化
150 */
151#ifdef TOPPERS_pdqini
152
153void
154initialize_pridataq(void)
155{
156 uint_t i;
157 PDQCB *p_pdqcb;
158 PDQINIB *p_pdqinib;
159
160 for (i = 0; i < tnum_pdq; i++) {
161 p_pdqcb = &(pdqcb_table[i]);
162 p_pdqinib = &(pdqinib_table[i]);
163 p_pdqinib->pdqatr = TA_NOEXS;
164 p_pdqcb->p_pdqinib = ((const PDQINIB *) p_pdqinib);
165 }
166}
167
168#endif /* TOPPERS_pdqini */
169
170/*
171 * 優先度データキューの生成
172 */
173#ifdef TOPPERS_cre_pdq
174
175ER
176cre_pdq(ID pdqid, const T_CPDQ *pk_cpdq)
177{
178 PDQCB *p_pdqcb;
179 PDQINIB *p_pdqinib;
180 ATR pdqatr;
181 PDQMB *p_pdqmb;
182 ER ercd;
183
184 LOG_CRE_PDQ_ENTER(pdqid, pk_cpdq);
185 CHECK_INIRTN();
186 CHECK_PDQID(pdqid);
187 CHECK_RSATR(pk_cpdq->pdqatr, TA_TPRI);
188 CHECK_DPRI(pk_cpdq->maxdpri);
189 pdqatr = pk_cpdq->pdqatr;
190 p_pdqmb = pk_cpdq->pdqmb;
191 p_pdqcb = get_pdqcb(pdqid);
192
193 if (p_pdqcb->p_pdqinib->pdqatr != TA_NOEXS) {
194 ercd = E_OBJ;
195 }
196 else {
197 if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
198 p_pdqmb = kernel_malloc(sizeof(PDQMB) * pk_cpdq->pdqcnt);
199 }
200 if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
201 ercd = E_NOMEM;
202 }
203 else {
204 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
205 p_pdqinib->pdqatr = pdqatr;
206 p_pdqinib->pdqcnt = pk_cpdq->pdqcnt;
207 p_pdqinib->maxdpri = pk_cpdq->maxdpri;
208 p_pdqinib->p_pdqmb = p_pdqmb;
209
210 queue_initialize(&(p_pdqcb->swait_queue));
211 queue_initialize(&(p_pdqcb->rwait_queue));
212 p_pdqcb->count = 0U;
213 p_pdqcb->p_head = NULL;
214 p_pdqcb->unused = 0U;
215 p_pdqcb->p_freelist = NULL;
216 ercd = E_OK;
217 }
218 }
219
220 error_exit:
221 LOG_CRE_PDQ_LEAVE(ercd);
222 return(ercd);
223}
224
225#endif /* TOPPERS_cre_pdq */
226
227/*
228 * 優先度データキュー管理領域へのデータの格納
229 */
230#ifdef TOPPERS_pdqenq
231
232void
233enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
234{
235 PDQMB *p_pdqmb;
236 PDQMB **pp_prev_next, *p_next;
237
238 if (p_pdqcb->p_freelist != NULL) {
239 p_pdqmb = p_pdqcb->p_freelist;
240 p_pdqcb->p_freelist = p_pdqmb->p_next;
241 }
242 else {
243 p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
244 p_pdqcb->unused++;
245 }
246
247 p_pdqmb->data = data;
248 p_pdqmb->datapri = datapri;
249
250 pp_prev_next = &(p_pdqcb->p_head);
251 while ((p_next = *pp_prev_next) != NULL) {
252 if (p_next->datapri > datapri) {
253 break;
254 }
255 pp_prev_next = &(p_next->p_next);
256 }
257 p_pdqmb->p_next = p_next;
258 *pp_prev_next = p_pdqmb;
259 p_pdqcb->count++;
260}
261
262#endif /* TOPPERS_pdqenq */
263
264/*
265 * 優先度データキュー管理領域からのデータの取出し
266 */
267#ifdef TOPPERS_pdqdeq
268
269void
270dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
271{
272 PDQMB *p_pdqmb;
273
274 p_pdqmb = p_pdqcb->p_head;
275 p_pdqcb->p_head = p_pdqmb->p_next;
276 p_pdqcb->count--;
277
278 *p_data = p_pdqmb->data;
279 *p_datapri = p_pdqmb->datapri;
280
281 p_pdqmb->p_next = p_pdqcb->p_freelist;
282 p_pdqcb->p_freelist = p_pdqmb;
283}
284
285#endif /* TOPPERS_pdqdeq */
286
287/*
288 * 優先度データキューへのデータ送信
289 */
290#ifdef TOPPERS_pdqsnd
291
292bool_t
293send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_dspreq)
294{
295 TCB *p_tcb;
296
297 if (!queue_empty(&(p_pdqcb->rwait_queue))) {
298 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
299 ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data;
300 ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
301 *p_dspreq = wait_complete(p_tcb);
302 return(true);
303 }
304 else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
305 enqueue_pridata(p_pdqcb, data, datapri);
306 *p_dspreq = false;
307 return(true);
308 }
309 else {
310 return(false);
311 }
312}
313
314#endif /* TOPPERS_pdqsnd */
315
316/*
317 * 優先度データキューからのデータ受信
318 */
319#ifdef TOPPERS_pdqrcv
320
321bool_t
322receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
323 PRI *p_datapri, bool_t *p_dspreq)
324{
325 TCB *p_tcb;
326 intptr_t data;
327 PRI datapri;
328
329 if (p_pdqcb->count > 0U) {
330 dequeue_pridata(p_pdqcb, p_data, p_datapri);
331 if (!queue_empty(&(p_pdqcb->swait_queue))) {
332 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
333 data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
334 datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
335 enqueue_pridata(p_pdqcb, data, datapri);
336 *p_dspreq = wait_complete(p_tcb);
337 }
338 else {
339 *p_dspreq = false;
340 }
341 return(true);
342 }
343 else if (!queue_empty(&(p_pdqcb->swait_queue))) {
344 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
345 *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
346 *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
347 *p_dspreq = wait_complete(p_tcb);
348 return(true);
349 }
350 else {
351 return(false);
352 }
353}
354
355#endif /* TOPPERS_pdqrcv */
356
357/*
358 * 優先度データキューへの送信
359 */
360#ifdef TOPPERS_snd_pdq
361
362ER
363snd_pdq(ID pdqid, intptr_t data, PRI datapri)
364{
365 PDQCB *p_pdqcb;
366 WINFO_PDQ winfo_pdq;
367 bool_t dspreq;
368 ER ercd;
369
370 LOG_SND_PDQ_ENTER(pdqid, data, datapri);
371 CHECK_DISPATCH();
372 CHECK_PDQID(pdqid);
373 p_pdqcb = get_pdqcb(pdqid);
374 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
375 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
376
377 t_lock_cpu();
378 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
379 if (dspreq) {
380 dispatch();
381 }
382 ercd = E_OK;
383 }
384 else {
385 winfo_pdq.data = data;
386 winfo_pdq.datapri = datapri;
387 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
388 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
389 dispatch();
390 ercd = winfo_pdq.winfo.wercd;
391 }
392 t_unlock_cpu();
393
394 error_exit:
395 LOG_SND_PDQ_LEAVE(ercd);
396 return(ercd);
397}
398
399#endif /* TOPPERS_snd_pdq */
400
401/*
402 * 優先度データキューへの送信(ポーリング)
403 */
404#ifdef TOPPERS_psnd_pdq
405
406ER
407psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
408{
409 PDQCB *p_pdqcb;
410 bool_t dspreq;
411 ER ercd;
412
413 LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
414 CHECK_TSKCTX_UNL();
415 CHECK_PDQID(pdqid);
416 p_pdqcb = get_pdqcb(pdqid);
417 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
418 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
419
420 t_lock_cpu();
421 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
422 if (dspreq) {
423 dispatch();
424 }
425 ercd = E_OK;
426 }
427 else {
428 ercd = E_TMOUT;
429 }
430 t_unlock_cpu();
431
432 error_exit:
433 LOG_PSND_PDQ_LEAVE(ercd);
434 return(ercd);
435}
436
437#endif /* TOPPERS_psnd_pdq */
438
439/*
440 * 優先度データキューへの送信(ポーリング,非タスクコンテキスト用)
441 */
442#ifdef TOPPERS_ipsnd_pdq
443
444ER
445ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
446{
447 PDQCB *p_pdqcb;
448 bool_t dspreq;
449 ER ercd;
450
451 LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
452 CHECK_INTCTX_UNL();
453 CHECK_PDQID(pdqid);
454 p_pdqcb = get_pdqcb(pdqid);
455 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
456 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
457
458 i_lock_cpu();
459 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
460 if (dspreq) {
461 reqflg = true;
462 }
463 ercd = E_OK;
464 }
465 else {
466 ercd = E_TMOUT;
467 }
468 i_unlock_cpu();
469
470 error_exit:
471 LOG_IPSND_PDQ_LEAVE(ercd);
472 return(ercd);
473}
474
475#endif /* TOPPERS_ipsnd_pdq */
476
477/*
478 * 優先度データキューへの送信(タイムアウトあり)
479 */
480#ifdef TOPPERS_tsnd_pdq
481
482ER
483tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
484{
485 PDQCB *p_pdqcb;
486 WINFO_PDQ winfo_pdq;
487 TMEVTB tmevtb;
488 bool_t dspreq;
489 ER ercd;
490
491 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
492 CHECK_DISPATCH();
493 CHECK_PDQID(pdqid);
494 CHECK_TMOUT(tmout);
495 p_pdqcb = get_pdqcb(pdqid);
496 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
497 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
498
499 t_lock_cpu();
500 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
501 if (dspreq) {
502 dispatch();
503 }
504 ercd = E_OK;
505 }
506 else if (tmout == TMO_POL) {
507 ercd = E_TMOUT;
508 }
509 else {
510 winfo_pdq.data = data;
511 winfo_pdq.datapri = datapri;
512 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
513 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
514 &tmevtb, tmout);
515 dispatch();
516 ercd = winfo_pdq.winfo.wercd;
517 }
518 t_unlock_cpu();
519
520 error_exit:
521 LOG_TSND_PDQ_LEAVE(ercd);
522 return(ercd);
523}
524
525#endif /* TOPPERS_tsnd_pdq */
526
527/*
528 * 優先度データキューからの受信
529 */
530#ifdef TOPPERS_rcv_pdq
531
532ER
533rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
534{
535 PDQCB *p_pdqcb;
536 WINFO_PDQ winfo_pdq;
537 bool_t dspreq;
538 ER ercd;
539
540 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
541 CHECK_DISPATCH();
542 CHECK_PDQID(pdqid);
543 p_pdqcb = get_pdqcb(pdqid);
544 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
545
546 t_lock_cpu();
547 if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
548 if (dspreq) {
549 dispatch();
550 }
551 ercd = E_OK;
552 }
553 else {
554 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
555 make_wait(&(winfo_pdq.winfo));
556 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
557 winfo_pdq.p_pdqcb = p_pdqcb;
558 LOG_TSKSTAT(p_runtsk);
559 dispatch();
560 ercd = winfo_pdq.winfo.wercd;
561 if (ercd == E_OK) {
562 *p_data = winfo_pdq.data;
563 *p_datapri = winfo_pdq.datapri;
564 }
565 }
566 t_unlock_cpu();
567
568 error_exit:
569 LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
570 return(ercd);
571}
572
573#endif /* TOPPERS_rcv_pdq */
574
575/*
576 * 優先度データキューからの受信(ポーリング)
577 */
578#ifdef TOPPERS_prcv_pdq
579
580ER
581prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
582{
583 PDQCB *p_pdqcb;
584 bool_t dspreq;
585 ER ercd;
586
587 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
588 CHECK_TSKCTX_UNL();
589 CHECK_PDQID(pdqid);
590 p_pdqcb = get_pdqcb(pdqid);
591 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
592
593 t_lock_cpu();
594 if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
595 if (dspreq) {
596 dispatch();
597 }
598 ercd = E_OK;
599 }
600 else {
601 ercd = E_TMOUT;
602 }
603 t_unlock_cpu();
604
605 error_exit:
606 LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
607 return(ercd);
608}
609
610#endif /* TOPPERS_prcv_pdq */
611
612/*
613 * 優先度データキューからの受信(タイムアウトあり)
614 */
615#ifdef TOPPERS_trcv_pdq
616
617ER
618trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
619{
620 PDQCB *p_pdqcb;
621 WINFO_PDQ winfo_pdq;
622 TMEVTB tmevtb;
623 bool_t dspreq;
624 ER ercd;
625
626 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
627 CHECK_DISPATCH();
628 CHECK_PDQID(pdqid);
629 CHECK_TMOUT(tmout);
630 p_pdqcb = get_pdqcb(pdqid);
631 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
632
633 t_lock_cpu();
634 if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
635 if (dspreq) {
636 dispatch();
637 }
638 ercd = E_OK;
639 }
640 else if (tmout == TMO_POL) {
641 ercd = E_TMOUT;
642 }
643 else {
644 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
645 make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout);
646 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
647 winfo_pdq.p_pdqcb = p_pdqcb;
648 LOG_TSKSTAT(p_runtsk);
649 dispatch();
650 ercd = winfo_pdq.winfo.wercd;
651 if (ercd == E_OK) {
652 *p_data = winfo_pdq.data;
653 *p_datapri = winfo_pdq.datapri;
654 }
655 }
656 t_unlock_cpu();
657
658 error_exit:
659 LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
660 return(ercd);
661}
662
663#endif /* TOPPERS_trcv_pdq */
664
665/*
666 * 優先度データキューの再初期化
667 */
668#ifdef TOPPERS_ini_pdq
669
670ER
671ini_pdq(ID pdqid)
672{
673 PDQCB *p_pdqcb;
674 bool_t dspreq;
675 ER ercd;
676
677 LOG_INI_PDQ_ENTER(pdqid);
678 CHECK_TSKCTX_UNL();
679 CHECK_PDQID(pdqid);
680 p_pdqcb = get_pdqcb(pdqid);
681 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
682
683 t_lock_cpu();
684 dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
685 if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
686 dspreq = true;
687 }
688 p_pdqcb->count = 0U;
689 p_pdqcb->p_head = NULL;
690 p_pdqcb->unused = 0U;
691 p_pdqcb->p_freelist = NULL;
692 if (dspreq) {
693 dispatch();
694 }
695 ercd = E_OK;
696 t_unlock_cpu();
697
698 error_exit:
699 LOG_INI_PDQ_LEAVE(ercd);
700 return(ercd);
701}
702
703#endif /* TOPPERS_ini_pdq */
704
705/*
706 * 優先度データキューの状態参照
707 */
708#ifdef TOPPERS_ref_pdq
709
710ER
711ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
712{
713 PDQCB *p_pdqcb;
714 ER ercd;
715
716 LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
717 CHECK_TSKCTX_UNL();
718 CHECK_PDQID(pdqid);
719 p_pdqcb = get_pdqcb(pdqid);
720 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
721
722 t_lock_cpu();
723 pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
724 pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
725 pk_rpdq->spdqcnt = p_pdqcb->count;
726 ercd = E_OK;
727 t_unlock_cpu();
728
729 error_exit:
730 LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
731 return(ercd);
732}
733
734#endif /* TOPPERS_ref_pdq */
Note: See TracBrowser for help on using the repository browser.