OSDN Git Service

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