source: asp3_wo_tecs/trunk/kernel/pridataq.c@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 14.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-2015 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: pridataq.c 471 2015-12-30 10:03:16Z ertl-hiro $
56 */
57
58/*
59 * 優å…
60ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½
61 */
62
63#include "kernel_impl.h"
64#include "check.h"
65#include "task.h"
66#include "wait.h"
67#include "pridataq.h"
68
69/*
70 * トレースログマクロのデフォルト定義
71 */
72#ifndef LOG_SND_PDQ_ENTER
73#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
74#endif /* LOG_SND_PDQ_ENTER */
75
76#ifndef LOG_SND_PDQ_LEAVE
77#define LOG_SND_PDQ_LEAVE(ercd)
78#endif /* LOG_SND_PDQ_LEAVE */
79
80#ifndef LOG_PSND_PDQ_ENTER
81#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
82#endif /* LOG_PSND_PDQ_ENTER */
83
84#ifndef LOG_PSND_PDQ_LEAVE
85#define LOG_PSND_PDQ_LEAVE(ercd)
86#endif /* LOG_PSND_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, p_data, p_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, p_data, p_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, p_data, p_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 */
140#define tnum_pdq ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
141
142/*
143 * 優å…
144ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼IDから優å…
145ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†ãƒ–ロックを取り出すた
146 * めのマクロ
147 */
148#define INDEX_PDQ(pdqid) ((uint_t)((pdqid) - TMIN_PDQID))
149#define get_pdqcb(pdqid) (&(pdqcb_table[INDEX_PDQ(pdqid)]))
150
151/*
152 * 優å…
153ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½ã®åˆæœŸåŒ–
154 */
155#ifdef TOPPERS_pdqini
156
157void
158initialize_pridataq(void)
159{
160 uint_t i;
161 PDQCB *p_pdqcb;
162
163 for (i = 0; i < tnum_pdq; i++) {
164 p_pdqcb = &(pdqcb_table[i]);
165 queue_initialize(&(p_pdqcb->swait_queue));
166 p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
167 queue_initialize(&(p_pdqcb->rwait_queue));
168 p_pdqcb->count = 0U;
169 p_pdqcb->p_head = NULL;
170 p_pdqcb->unused = 0U;
171 p_pdqcb->p_freelist = NULL;
172 }
173}
174
175#endif /* TOPPERS_pdqini */
176
177/*
178 * 優å…
179ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸã¸ã®ãƒ‡ãƒ¼ã‚¿ã®æ ¼ç´
180 */
181#ifdef TOPPERS_pdqenq
182
183void
184enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
185{
186 PDQMB *p_pdqmb;
187 PDQMB **pp_prev_next, *p_next;
188
189 if (p_pdqcb->p_freelist != NULL) {
190 p_pdqmb = p_pdqcb->p_freelist;
191 p_pdqcb->p_freelist = p_pdqmb->p_next;
192 }
193 else {
194 p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
195 p_pdqcb->unused++;
196 }
197
198 p_pdqmb->data = data;
199 p_pdqmb->datapri = datapri;
200
201 pp_prev_next = &(p_pdqcb->p_head);
202 while ((p_next = *pp_prev_next) != NULL) {
203 if (p_next->datapri > datapri) {
204 break;
205 }
206 pp_prev_next = &(p_next->p_next);
207 }
208 p_pdqmb->p_next = p_next;
209 *pp_prev_next = p_pdqmb;
210 p_pdqcb->count++;
211}
212
213#endif /* TOPPERS_pdqenq */
214
215/*
216 * 優å…
217ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜åŸŸã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã®å–出し
218 */
219#ifdef TOPPERS_pdqdeq
220
221void
222dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
223{
224 PDQMB *p_pdqmb;
225
226 p_pdqmb = p_pdqcb->p_head;
227 p_pdqcb->p_head = p_pdqmb->p_next;
228 p_pdqcb->count--;
229
230 *p_data = p_pdqmb->data;
231 *p_datapri = p_pdqmb->datapri;
232
233 p_pdqmb->p_next = p_pdqcb->p_freelist;
234 p_pdqcb->p_freelist = p_pdqmb;
235}
236
237#endif /* TOPPERS_pdqdeq */
238
239/*
240 * 優å…
241ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®ãƒ‡ãƒ¼ã‚¿é€ä¿¡
242 */
243#ifdef TOPPERS_pdqsnd
244
245bool_t
246send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
247{
248 TCB *p_tcb;
249
250 if (!queue_empty(&(p_pdqcb->rwait_queue))) {
251 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
252 ((WINFO_RPDQ *)(p_tcb->p_winfo))->data = data;
253 ((WINFO_RPDQ *)(p_tcb->p_winfo))->datapri = datapri;
254 wait_complete(p_tcb);
255 return(true);
256 }
257 else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
258 enqueue_pridata(p_pdqcb, data, datapri);
259 return(true);
260 }
261 else {
262 return(false);
263 }
264}
265
266#endif /* TOPPERS_pdqsnd */
267
268/*
269 * 優å…
270ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿å—ä¿¡
271 */
272#ifdef TOPPERS_pdqrcv
273
274bool_t
275receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
276{
277 TCB *p_tcb;
278 intptr_t data;
279 PRI datapri;
280
281 if (p_pdqcb->count > 0U) {
282 dequeue_pridata(p_pdqcb, p_data, p_datapri);
283 if (!queue_empty(&(p_pdqcb->swait_queue))) {
284 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
285 data = ((WINFO_SPDQ *)(p_tcb->p_winfo))->data;
286 datapri = ((WINFO_SPDQ *)(p_tcb->p_winfo))->datapri;
287 enqueue_pridata(p_pdqcb, data, datapri);
288 wait_complete(p_tcb);
289 }
290 return(true);
291 }
292 else if (!queue_empty(&(p_pdqcb->swait_queue))) {
293 p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
294 *p_data = ((WINFO_SPDQ *)(p_tcb->p_winfo))->data;
295 *p_datapri = ((WINFO_SPDQ *)(p_tcb->p_winfo))->datapri;
296 wait_complete(p_tcb);
297 return(true);
298 }
299 else {
300 return(false);
301 }
302}
303
304#endif /* TOPPERS_pdqrcv */
305
306/*
307 * 優å…
308ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡
309 */
310#ifdef TOPPERS_snd_pdq
311
312ER
313snd_pdq(ID pdqid, intptr_t data, PRI datapri)
314{
315 PDQCB *p_pdqcb;
316 WINFO_SPDQ winfo_spdq;
317 ER ercd;
318
319 LOG_SND_PDQ_ENTER(pdqid, data, datapri);
320 CHECK_DISPATCH();
321 CHECK_ID(VALID_PDQID(pdqid));
322 p_pdqcb = get_pdqcb(pdqid);
323 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
324
325 lock_cpu_dsp();
326 if (p_runtsk->raster) {
327 ercd = E_RASTER;
328 }
329 else if (send_pridata(p_pdqcb, data, datapri)) {
330 if (p_runtsk != p_schedtsk) {
331 dispatch();
332 }
333 ercd = E_OK;
334 }
335 else {
336 winfo_spdq.data = data;
337 winfo_spdq.datapri = datapri;
338 p_runtsk->tstat = TS_WAITING_SPDQ;
339 wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq);
340 dispatch();
341 ercd = winfo_spdq.winfo.wercd;
342 }
343 unlock_cpu_dsp();
344
345 error_exit:
346 LOG_SND_PDQ_LEAVE(ercd);
347 return(ercd);
348}
349
350#endif /* TOPPERS_snd_pdq */
351
352/*
353 * 優å…
354ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆãƒãƒ¼ãƒªãƒ³ã‚°ï¼‰
355 */
356#ifdef TOPPERS_psnd_pdq
357
358ER
359psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
360{
361 PDQCB *p_pdqcb;
362 ER ercd;
363
364 LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
365 CHECK_UNL();
366 CHECK_ID(VALID_PDQID(pdqid));
367 p_pdqcb = get_pdqcb(pdqid);
368 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
369
370 lock_cpu();
371 if (send_pridata(p_pdqcb, data, datapri)) {
372 if (p_runtsk != p_schedtsk) {
373 if (!sense_context()) {
374 dispatch();
375 }
376 else {
377 request_dispatch();
378 }
379 }
380 ercd = E_OK;
381 }
382 else {
383 ercd = E_TMOUT;
384 }
385 unlock_cpu();
386
387 error_exit:
388 LOG_PSND_PDQ_LEAVE(ercd);
389 return(ercd);
390}
391
392#endif /* TOPPERS_psnd_pdq */
393
394/*
395 * 優å…
396ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã¸ã®é€ä¿¡ï¼ˆã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚り)
397 */
398#ifdef TOPPERS_tsnd_pdq
399
400ER
401tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
402{
403 PDQCB *p_pdqcb;
404 WINFO_SPDQ winfo_spdq;
405 TMEVTB tmevtb;
406 ER ercd;
407
408 LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
409 CHECK_DISPATCH();
410 CHECK_ID(VALID_PDQID(pdqid));
411 CHECK_PAR(VALID_TMOUT(tmout));
412 p_pdqcb = get_pdqcb(pdqid);
413 CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
414
415 lock_cpu_dsp();
416 if (p_runtsk->raster) {
417 ercd = E_RASTER;
418 }
419 else if (send_pridata(p_pdqcb, data, datapri)) {
420 if (p_runtsk != p_schedtsk) {
421 dispatch();
422 }
423 ercd = E_OK;
424 }
425 else if (tmout == TMO_POL) {
426 ercd = E_TMOUT;
427 }
428 else {
429 winfo_spdq.data = data;
430 winfo_spdq.datapri = datapri;
431 p_runtsk->tstat = TS_WAITING_SPDQ;
432 wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq,
433 &tmevtb, tmout);
434 dispatch();
435 ercd = winfo_spdq.winfo.wercd;
436 }
437 unlock_cpu_dsp();
438
439 error_exit:
440 LOG_TSND_PDQ_LEAVE(ercd);
441 return(ercd);
442}
443
444#endif /* TOPPERS_tsnd_pdq */
445
446/*
447 * 優å…
448ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—ä¿¡
449 */
450#ifdef TOPPERS_rcv_pdq
451
452ER
453rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
454{
455 PDQCB *p_pdqcb;
456 WINFO_RPDQ winfo_rpdq;
457 ER ercd;
458
459 LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
460 CHECK_DISPATCH();
461 CHECK_ID(VALID_PDQID(pdqid));
462 p_pdqcb = get_pdqcb(pdqid);
463
464 lock_cpu_dsp();
465 if (p_runtsk->raster) {
466 ercd = E_RASTER;
467 }
468 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
469 if (p_runtsk != p_schedtsk) {
470 dispatch();
471 }
472 ercd = E_OK;
473 }
474 else {
475 p_runtsk->tstat = TS_WAITING_RPDQ;
476 make_wait(&(winfo_rpdq.winfo));
477 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
478 winfo_rpdq.p_pdqcb = p_pdqcb;
479 LOG_TSKSTAT(p_runtsk);
480 dispatch();
481 ercd = winfo_rpdq.winfo.wercd;
482 if (ercd == E_OK) {
483 *p_data = winfo_rpdq.data;
484 *p_datapri = winfo_rpdq.datapri;
485 }
486 }
487 unlock_cpu_dsp();
488
489 error_exit:
490 LOG_RCV_PDQ_LEAVE(ercd, p_data, p_datapri);
491 return(ercd);
492}
493
494#endif /* TOPPERS_rcv_pdq */
495
496/*
497 * 優å…
498ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(ポーリング)
499 */
500#ifdef TOPPERS_prcv_pdq
501
502ER
503prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
504{
505 PDQCB *p_pdqcb;
506 ER ercd;
507
508 LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
509 CHECK_TSKCTX_UNL();
510 CHECK_ID(VALID_PDQID(pdqid));
511 p_pdqcb = get_pdqcb(pdqid);
512
513 lock_cpu();
514 if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
515 if (p_runtsk != p_schedtsk) {
516 dispatch();
517 }
518 ercd = E_OK;
519 }
520 else {
521 ercd = E_TMOUT;
522 }
523 unlock_cpu();
524
525 error_exit:
526 LOG_PRCV_PDQ_LEAVE(ercd, p_data, p_datapri);
527 return(ercd);
528}
529
530#endif /* TOPPERS_prcv_pdq */
531
532/*
533 * 優å…
534ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã‹ã‚‰ã®å—信(タイムアウトあり)
535 */
536#ifdef TOPPERS_trcv_pdq
537
538ER
539trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
540{
541 PDQCB *p_pdqcb;
542 WINFO_RPDQ winfo_rpdq;
543 TMEVTB tmevtb;
544 ER ercd;
545
546 LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
547 CHECK_DISPATCH();
548 CHECK_ID(VALID_PDQID(pdqid));
549 CHECK_PAR(VALID_TMOUT(tmout));
550 p_pdqcb = get_pdqcb(pdqid);
551
552 lock_cpu_dsp();
553 if (p_runtsk->raster) {
554 ercd = E_RASTER;
555 }
556 else if (receive_pridata(p_pdqcb, p_data, p_datapri)) {
557 if (p_runtsk != p_schedtsk) {
558 dispatch();
559 }
560 ercd = E_OK;
561 }
562 else if (tmout == TMO_POL) {
563 ercd = E_TMOUT;
564 }
565 else {
566 p_runtsk->tstat = TS_WAITING_RPDQ;
567 make_wait_tmout(&(winfo_rpdq.winfo), &tmevtb, tmout);
568 queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
569 winfo_rpdq.p_pdqcb = p_pdqcb;
570 LOG_TSKSTAT(p_runtsk);
571 dispatch();
572 ercd = winfo_rpdq.winfo.wercd;
573 if (ercd == E_OK) {
574 *p_data = winfo_rpdq.data;
575 *p_datapri = winfo_rpdq.datapri;
576 }
577 }
578 unlock_cpu_dsp();
579
580 error_exit:
581 LOG_TRCV_PDQ_LEAVE(ercd, p_data, p_datapri);
582 return(ercd);
583}
584
585#endif /* TOPPERS_trcv_pdq */
586
587/*
588 * 優å…
589ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®å†åˆæœŸåŒ–
590 */
591#ifdef TOPPERS_ini_pdq
592
593ER
594ini_pdq(ID pdqid)
595{
596 PDQCB *p_pdqcb;
597 ER ercd;
598
599 LOG_INI_PDQ_ENTER(pdqid);
600 CHECK_TSKCTX_UNL();
601 CHECK_ID(VALID_PDQID(pdqid));
602 p_pdqcb = get_pdqcb(pdqid);
603
604 lock_cpu();
605 init_wait_queue(&(p_pdqcb->swait_queue));
606 init_wait_queue(&(p_pdqcb->rwait_queue));
607 p_pdqcb->count = 0U;
608 p_pdqcb->p_head = NULL;
609 p_pdqcb->unused = 0U;
610 p_pdqcb->p_freelist = NULL;
611 if (p_runtsk != p_schedtsk) {
612 dispatch();
613 }
614 ercd = E_OK;
615 unlock_cpu();
616
617 error_exit:
618 LOG_INI_PDQ_LEAVE(ercd);
619 return(ercd);
620}
621
622#endif /* TOPPERS_ini_pdq */
623
624/*
625 * 優å…
626ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã®çŠ¶æ…
627‹å‚ç…
628§
629 */
630#ifdef TOPPERS_ref_pdq
631
632ER
633ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
634{
635 PDQCB *p_pdqcb;
636 ER ercd;
637
638 LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
639 CHECK_TSKCTX_UNL();
640 CHECK_ID(VALID_PDQID(pdqid));
641 p_pdqcb = get_pdqcb(pdqid);
642
643 lock_cpu();
644 pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
645 pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
646 pk_rpdq->spdqcnt = p_pdqcb->count;
647 ercd = E_OK;
648 unlock_cpu();
649
650 error_exit:
651 LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
652 return(ercd);
653}
654
655#endif /* TOPPERS_ref_pdq */
Note: See TracBrowser for help on using the repository browser.