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

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

ASPカーネルの動的生成パッケージに追従。

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