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

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

ASP Release 1.9.0 への追従。

  • 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 62 2013-10-18 15:38:33Z 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 pdqatr |= TA_MBALLOC;
200 }
201 if (pk_cpdq->pdqcnt != 0 && p_pdqmb == NULL) {
202 ercd = E_NOMEM;
203 }
204 else {
205 p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib);
206 p_pdqinib->pdqatr = pdqatr;
207 p_pdqinib->pdqcnt = pk_cpdq->pdqcnt;
208 p_pdqinib->maxdpri = pk_cpdq->maxdpri;
209 p_pdqinib->p_pdqmb = p_pdqmb;
210
211 queue_initialize(&(p_pdqcb->swait_queue));
212 queue_initialize(&(p_pdqcb->rwait_queue));
213 p_pdqcb->count = 0U;
214 p_pdqcb->p_head = NULL;
215 p_pdqcb->unused = 0U;
216 p_pdqcb->p_freelist = NULL;
217 ercd = E_OK;
218 }
219 }
220
221 error_exit:
222 LOG_CRE_PDQ_LEAVE(ercd);
223 return(ercd);
224}
225
226#endif /* TOPPERS_cre_pdq */
227
228/*
229 * 優先度データキュー管理領域へのデータの格納
230 */
231#ifdef TOPPERS_pdqenq
232
233void
234enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
235{
236 PDQMB *p_pdqmb;
237 PDQMB **pp_prev_next, *p_next;
238
239 if (p_pdqcb->p_freelist != NULL) {
240 p_pdqmb = p_pdqcb->p_freelist;
241 p_pdqcb->p_freelist = p_pdqmb->p_next;
242 }
243 else {
244 p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
245 p_pdqcb->unused++;
246 }
247
248 p_pdqmb->data = data;
249 p_pdqmb->datapri = datapri;
250
251 pp_prev_next = &(p_pdqcb->p_head);
252 while ((p_next = *pp_prev_next) != NULL) {
253 if (p_next->datapri > datapri) {
254 break;
255 }
256 pp_prev_next = &(p_next->p_next);
257 }
258 p_pdqmb->p_next = p_next;
259 *pp_prev_next = p_pdqmb;
260 p_pdqcb->count++;
261}
262
263#endif /* TOPPERS_pdqenq */
264
265/*
266 * 優先度データキュー管理領域からのデータの取出し
267 */
268#ifdef TOPPERS_pdqdeq
269
270void
271dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
272{
273 PDQMB *p_pdqmb;
274
275 p_pdqmb = p_pdqcb->p_head;
276 p_pdqcb->p_head = p_pdqmb->p_next;
277 p_pdqcb->count--;
278
279 *p_data = p_pdqmb->data;
280 *p_datapri = p_pdqmb->datapri;
281
282 p_pdqmb->p_next = p_pdqcb->p_freelist;
283 p_pdqcb->p_freelist = p_pdqmb;
284}
285
286#endif /* TOPPERS_pdqdeq */
287
288/*
289 * 優先度データキューへのデータ送信
290 */
291#ifdef TOPPERS_pdqsnd
292
293bool_t
294send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_dspreq)
295{
296 TCB *p_tcb;
297
298 if (!queue_empty(&(p_pdqcb->rwait_queue))) {
299 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
300 ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data;
301 ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
302 *p_dspreq = wait_complete(p_tcb);
303 return(true);
304 }
305 else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
306 enqueue_pridata(p_pdqcb, data, datapri);
307 *p_dspreq = false;
308 return(true);
309 }
310 else {
311 return(false);
312 }
313}
314
315#endif /* TOPPERS_pdqsnd */
316
317/*
318 * 優先度データキューからのデータ受信
319 */
320#ifdef TOPPERS_pdqrcv
321
322bool_t
323receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
324 PRI *p_datapri, bool_t *p_dspreq)
325{
326 TCB *p_tcb;
327 intptr_t data;
328 PRI datapri;
329
330 if (p_pdqcb->count > 0U) {
331 dequeue_pridata(p_pdqcb, p_data, p_datapri);
332 if (!queue_empty(&(p_pdqcb->swait_queue))) {
333 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
334 data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
335 datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
336 enqueue_pridata(p_pdqcb, data, datapri);
337 *p_dspreq = wait_complete(p_tcb);
338 }
339 else {
340 *p_dspreq = false;
341 }
342 return(true);
343 }
344 else if (!queue_empty(&(p_pdqcb->swait_queue))) {
345 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
346 *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
347 *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
348 *p_dspreq = wait_complete(p_tcb);
349 return(true);
350 }
351 else {
352 return(false);
353 }
354}
355
356#endif /* TOPPERS_pdqrcv */
357
358/*
359 * 優先度データキューへの送信
360 */
361#ifdef TOPPERS_snd_pdq
362
363ER
364snd_pdq(ID pdqid, intptr_t data, PRI datapri)
365{
366 PDQCB *p_pdqcb;
367 WINFO_PDQ winfo_pdq;
368 bool_t dspreq;
369 ER ercd;
370
371 LOG_SND_PDQ_ENTER(pdqid, data, datapri);
372 CHECK_DISPATCH();
373 CHECK_PDQID(pdqid);
374 p_pdqcb = get_pdqcb(pdqid);
375 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
376 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
377
378 t_lock_cpu();
379 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
380 if (dspreq) {
381 dispatch();
382 }
383 ercd = E_OK;
384 }
385 else {
386 winfo_pdq.data = data;
387 winfo_pdq.datapri = datapri;
388 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
389 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
390 dispatch();
391 ercd = winfo_pdq.winfo.wercd;
392 }
393 t_unlock_cpu();
394
395 error_exit:
396 LOG_SND_PDQ_LEAVE(ercd);
397 return(ercd);
398}
399
400#endif /* TOPPERS_snd_pdq */
401
402/*
403 * 優先度データキューへの送信(ポーリング)
404 */
405#ifdef TOPPERS_psnd_pdq
406
407ER
408psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
409{
410 PDQCB *p_pdqcb;
411 bool_t dspreq;
412 ER ercd;
413
414 LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
415 CHECK_TSKCTX_UNL();
416 CHECK_PDQID(pdqid);
417 p_pdqcb = get_pdqcb(pdqid);
418 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
419 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
420
421 t_lock_cpu();
422 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
423 if (dspreq) {
424 dispatch();
425 }
426 ercd = E_OK;
427 }
428 else {
429 ercd = E_TMOUT;
430 }
431 t_unlock_cpu();
432
433 error_exit:
434 LOG_PSND_PDQ_LEAVE(ercd);
435 return(ercd);
436}
437
438#endif /* TOPPERS_psnd_pdq */
439
440/*
441 * 優先度データキューへの送信(ポーリング,非タスクコンテキスト用)
442 */
443#ifdef TOPPERS_ipsnd_pdq
444
445ER
446ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
447{
448 PDQCB *p_pdqcb;
449 bool_t dspreq;
450 ER ercd;
451
452 LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
453 CHECK_INTCTX_UNL();
454 CHECK_PDQID(pdqid);
455 p_pdqcb = get_pdqcb(pdqid);
456 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
457 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
458
459 i_lock_cpu();
460 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
461 if (dspreq) {
462 reqflg = true;
463 }
464 ercd = E_OK;
465 }
466 else {
467 ercd = E_TMOUT;
468 }
469 i_unlock_cpu();
470
471 error_exit:
472 LOG_IPSND_PDQ_LEAVE(ercd);
473 return(ercd);
474}
475
476#endif /* TOPPERS_ipsnd_pdq */
477
478/*
479 * 優先度データキューへの送信(タイムアウトあり)
480 */
481#ifdef TOPPERS_tsnd_pdq
482
483ER
484tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
485{
486 PDQCB *p_pdqcb;
487 WINFO_PDQ winfo_pdq;
488 TMEVTB tmevtb;
489 bool_t dspreq;
490 ER ercd;
491
492 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
493 CHECK_DISPATCH();
494 CHECK_PDQID(pdqid);
495 CHECK_TMOUT(tmout);
496 p_pdqcb = get_pdqcb(pdqid);
497 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
498 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
499
500 t_lock_cpu();
501 if (send_pridata(p_pdqcb, data, datapri, &dspreq)) {
502 if (dspreq) {
503 dispatch();
504 }
505 ercd = E_OK;
506 }
507 else if (tmout == TMO_POL) {
508 ercd = E_TMOUT;
509 }
510 else {
511 winfo_pdq.data = data;
512 winfo_pdq.datapri = datapri;
513 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
514 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
515 &tmevtb, tmout);
516 dispatch();
517 ercd = winfo_pdq.winfo.wercd;
518 }
519 t_unlock_cpu();
520
521 error_exit:
522 LOG_TSND_PDQ_LEAVE(ercd);
523 return(ercd);
524}
525
526#endif /* TOPPERS_tsnd_pdq */
527
528/*
529 * 優先度データキューからの受信
530 */
531#ifdef TOPPERS_rcv_pdq
532
533ER
534rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
535{
536 PDQCB *p_pdqcb;
537 WINFO_PDQ winfo_pdq;
538 bool_t dspreq;
539 ER ercd;
540
541 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
542 CHECK_DISPATCH();
543 CHECK_PDQID(pdqid);
544 p_pdqcb = get_pdqcb(pdqid);
545 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
546
547 t_lock_cpu();
548 if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
549 if (dspreq) {
550 dispatch();
551 }
552 ercd = E_OK;
553 }
554 else {
555 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
556 make_wait(&(winfo_pdq.winfo));
557 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
558 winfo_pdq.p_pdqcb = p_pdqcb;
559 LOG_TSKSTAT(p_runtsk);
560 dispatch();
561 ercd = winfo_pdq.winfo.wercd;
562 if (ercd == E_OK) {
563 *p_data = winfo_pdq.data;
564 *p_datapri = winfo_pdq.datapri;
565 }
566 }
567 t_unlock_cpu();
568
569 error_exit:
570 LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
571 return(ercd);
572}
573
574#endif /* TOPPERS_rcv_pdq */
575
576/*
577 * 優先度データキューからの受信(ポーリング)
578 */
579#ifdef TOPPERS_prcv_pdq
580
581ER
582prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
583{
584 PDQCB *p_pdqcb;
585 bool_t dspreq;
586 ER ercd;
587
588 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
589 CHECK_TSKCTX_UNL();
590 CHECK_PDQID(pdqid);
591 p_pdqcb = get_pdqcb(pdqid);
592 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
593
594 t_lock_cpu();
595 if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
596 if (dspreq) {
597 dispatch();
598 }
599 ercd = E_OK;
600 }
601 else {
602 ercd = E_TMOUT;
603 }
604 t_unlock_cpu();
605
606 error_exit:
607 LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
608 return(ercd);
609}
610
611#endif /* TOPPERS_prcv_pdq */
612
613/*
614 * 優先度データキューからの受信(タイムアウトあり)
615 */
616#ifdef TOPPERS_trcv_pdq
617
618ER
619trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
620{
621 PDQCB *p_pdqcb;
622 WINFO_PDQ winfo_pdq;
623 TMEVTB tmevtb;
624 bool_t dspreq;
625 ER ercd;
626
627 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
628 CHECK_DISPATCH();
629 CHECK_PDQID(pdqid);
630 CHECK_TMOUT(tmout);
631 p_pdqcb = get_pdqcb(pdqid);
632 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
633
634 t_lock_cpu();
635 if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) {
636 if (dspreq) {
637 dispatch();
638 }
639 ercd = E_OK;
640 }
641 else if (tmout == TMO_POL) {
642 ercd = E_TMOUT;
643 }
644 else {
645 p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
646 make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout);
647 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
648 winfo_pdq.p_pdqcb = p_pdqcb;
649 LOG_TSKSTAT(p_runtsk);
650 dispatch();
651 ercd = winfo_pdq.winfo.wercd;
652 if (ercd == E_OK) {
653 *p_data = winfo_pdq.data;
654 *p_datapri = winfo_pdq.datapri;
655 }
656 }
657 t_unlock_cpu();
658
659 error_exit:
660 LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
661 return(ercd);
662}
663
664#endif /* TOPPERS_trcv_pdq */
665
666/*
667 * 優先度データキューの再初期化
668 */
669#ifdef TOPPERS_ini_pdq
670
671ER
672ini_pdq(ID pdqid)
673{
674 PDQCB *p_pdqcb;
675 bool_t dspreq;
676 ER ercd;
677
678 LOG_INI_PDQ_ENTER(pdqid);
679 CHECK_TSKCTX_UNL();
680 CHECK_PDQID(pdqid);
681 p_pdqcb = get_pdqcb(pdqid);
682 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
683
684 t_lock_cpu();
685 dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
686 if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
687 dspreq = true;
688 }
689 p_pdqcb->count = 0U;
690 p_pdqcb->p_head = NULL;
691 p_pdqcb->unused = 0U;
692 p_pdqcb->p_freelist = NULL;
693 if (dspreq) {
694 dispatch();
695 }
696 ercd = E_OK;
697 t_unlock_cpu();
698
699 error_exit:
700 LOG_INI_PDQ_LEAVE(ercd);
701 return(ercd);
702}
703
704#endif /* TOPPERS_ini_pdq */
705
706/*
707 * 優先度データキューの状態参照
708 */
709#ifdef TOPPERS_ref_pdq
710
711ER
712ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
713{
714 PDQCB *p_pdqcb;
715 ER ercd;
716
717 LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
718 CHECK_TSKCTX_UNL();
719 CHECK_PDQID(pdqid);
720 p_pdqcb = get_pdqcb(pdqid);
721 CHECK_NOEXS(p_pdqcb->p_pdqinib->pdqatr);
722
723 t_lock_cpu();
724 pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
725 pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
726 pk_rpdq->spdqcnt = p_pdqcb->count;
727 ercd = E_OK;
728 t_unlock_cpu();
729
730 error_exit:
731 LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
732 return(ercd);
733}
734
735#endif /* TOPPERS_ref_pdq */
Note: See TracBrowser for help on using the repository browser.