pridataq.c

説明を見る。
00001 /*
00002  *  TOPPERS/ASP Kernel
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      Advanced Standard Profile Kernel
00005  * 
00006  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
00007  *                              Toyohashi Univ. of Technology, JAPAN
00008  *  Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
00009  *              Graduate School of Information Science, Nagoya Univ., JAPAN
00010  * 
00011  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
00012  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
00013  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
00014  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
00015  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
00016  *      スコード中に含まれていること.
00017  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
00018  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
00019  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
00020  *      の無保証規定を掲載すること.
00021  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
00022  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
00023  *      と.
00024  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
00025  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
00026  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
00027  *        報告すること.
00028  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
00029  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
00030  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
00031  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
00032  *      免責すること.
00033  * 
00034  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
00035  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
00036  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
00037  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
00038  *  の責任を負わない.
00039  * 
00040  *  @(#) $Id: pridataq.c 748 2008-03-07 17:18:06Z hiro $
00041  */
00042 
00043 /*
00044  *      優先度データキュー機能
00045  */
00046 
00047 #include "kernel_impl.h"
00048 #include "check.h"
00049 #include "task.h"
00050 #include "wait.h"
00051 #include "pridataq.h"
00052 
00053 /*
00054  *  トレースログマクロのデフォルト定義
00055  */
00056 #ifndef LOG_SND_PDQ_ENTER
00057 #define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
00058 #endif /* LOG_SND_PDQ_ENTER */
00059 
00060 #ifndef LOG_SND_PDQ_LEAVE
00061 #define LOG_SND_PDQ_LEAVE(ercd)
00062 #endif /* LOG_SND_PDQ_LEAVE */
00063 
00064 #ifndef LOG_PSND_PDQ_ENTER
00065 #define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
00066 #endif /* LOG_PSND_PDQ_ENTER */
00067 
00068 #ifndef LOG_PSND_PDQ_LEAVE
00069 #define LOG_PSND_PDQ_LEAVE(ercd)
00070 #endif /* LOG_PSND_PDQ_LEAVE */
00071 
00072 #ifndef LOG_IPSND_PDQ_ENTER
00073 #define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri)
00074 #endif /* LOG_IPSND_PDQ_ENTER */
00075 
00076 #ifndef LOG_IPSND_PDQ_LEAVE
00077 #define LOG_IPSND_PDQ_LEAVE(ercd)
00078 #endif /* LOG_IPSND_PDQ_LEAVE */
00079 
00080 #ifndef LOG_TSND_PDQ_ENTER
00081 #define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
00082 #endif /* LOG_TSND_PDQ_ENTER */
00083 
00084 #ifndef LOG_TSND_PDQ_LEAVE
00085 #define LOG_TSND_PDQ_LEAVE(ercd)
00086 #endif /* LOG_TSND_PDQ_LEAVE */
00087 
00088 #ifndef LOG_RCV_PDQ_ENTER
00089 #define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
00090 #endif /* LOG_RCV_PDQ_ENTER */
00091 
00092 #ifndef LOG_RCV_PDQ_LEAVE
00093 #define LOG_RCV_PDQ_LEAVE(ercd, data, datapri)
00094 #endif /* LOG_RCV_PDQ_LEAVE */
00095 
00096 #ifndef LOG_PRCV_PDQ_ENTER
00097 #define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
00098 #endif /* LOG_PRCV_PDQ_ENTER */
00099 
00100 #ifndef LOG_PRCV_PDQ_LEAVE
00101 #define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri)
00102 #endif /* LOG_PRCV_PDQ_LEAVE */
00103 
00104 #ifndef LOG_TRCV_PDQ_ENTER
00105 #define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
00106 #endif /* LOG_TRCV_PDQ_ENTER */
00107 
00108 #ifndef LOG_TRCV_PDQ_LEAVE
00109 #define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri)
00110 #endif /* LOG_TRCV_PDQ_LEAVE */
00111 
00112 #ifndef LOG_INI_PDQ_ENTER
00113 #define LOG_INI_PDQ_ENTER(pdqid)
00114 #endif /* LOG_INI_PDQ_ENTER */
00115 
00116 #ifndef LOG_INI_PDQ_LEAVE
00117 #define LOG_INI_PDQ_LEAVE(ercd)
00118 #endif /* LOG_INI_PDQ_LEAVE */
00119 
00120 #ifndef LOG_REF_PDQ_ENTER
00121 #define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
00122 #endif /* LOG_REF_PDQ_ENTER */
00123 
00124 #ifndef LOG_REF_PDQ_LEAVE
00125 #define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
00126 #endif /* LOG_REF_PDQ_LEAVE */
00127 
00128 /*
00129  *  優先度データキューの数
00130  */
00131 #define tnum_pdq    ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
00132 
00133 /*
00134  *  優先度データキューIDから優先度データキュー管理ブロックを取り出すた
00135  *  めのマクロ
00136  */
00137 #define INDEX_PDQ(pdqid)    ((uint_t)((pdqid) - TMIN_PDQID))
00138 #define get_pdqcb(pdqid)    (&(pdqcb_table[INDEX_PDQ(pdqid)]))
00139 
00140 /*
00141  *  優先度データキュー機能の初期化
00142  */
00143 #ifdef TOPPERS_pdqini
00144 
00145 void
00146 initialize_pridataq(void)
00147 {
00148     uint_t  i;
00149     PDQCB   *p_pdqcb;
00150 
00151     for (p_pdqcb = pdqcb_table, i = 0; i < tnum_pdq; p_pdqcb++, i++) {
00152         queue_initialize(&(p_pdqcb->swait_queue));
00153         p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
00154         queue_initialize(&(p_pdqcb->rwait_queue));
00155         p_pdqcb->count = 0U;
00156         p_pdqcb->p_head = NULL;
00157         p_pdqcb->unused = 0U;
00158         p_pdqcb->p_freelist = NULL;
00159     }
00160 }
00161 
00162 #endif /* TOPPERS_pdqini */
00163 
00164 /*
00165  *  優先度データキュー管理領域へのデータの格納
00166  */
00167 #ifdef TOPPERS_pdqenq
00168 
00169 void
00170 enqueue_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri)
00171 {
00172     PDQMB   *p_pdqmb;
00173     PDQMB   **pp_prev_next, *p_next;
00174 
00175     if (p_pdqcb->p_freelist != NULL) {
00176         p_pdqmb = p_pdqcb->p_freelist;
00177         p_pdqcb->p_freelist = p_pdqmb->p_next;
00178     }
00179     else {
00180         p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
00181         p_pdqcb->unused++;
00182     }
00183 
00184     p_pdqmb->data = data;
00185     p_pdqmb->datapri = datapri;
00186 
00187     pp_prev_next = &(p_pdqcb->p_head);
00188     while ((p_next = *pp_prev_next) != NULL) {
00189         if (p_next->datapri > datapri) {
00190             break;
00191         }
00192         pp_prev_next = &(p_next->p_next);
00193     }
00194     p_pdqmb->p_next = p_next;
00195     *pp_prev_next = p_pdqmb;
00196     p_pdqcb->count++;
00197 }
00198 
00199 #endif /* TOPPERS_pdqenq */
00200 
00201 /*
00202  *  優先度データキュー管理領域からのデータの取出し
00203  */
00204 #ifdef TOPPERS_pdqdeq
00205 
00206 void
00207 dequeue_pridata(PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
00208 {
00209     PDQMB   *p_pdqmb;
00210 
00211     p_pdqmb = p_pdqcb->p_head;
00212     p_pdqcb->p_head = p_pdqmb->p_next;
00213     p_pdqcb->count--;
00214 
00215     *p_data = p_pdqmb->data;
00216     *p_datapri = p_pdqmb->datapri;
00217 
00218     p_pdqmb->p_next = p_pdqcb->p_freelist;
00219     p_pdqcb->p_freelist = p_pdqmb;
00220 }
00221 
00222 #endif /* TOPPERS_pdqdeq */
00223 
00224 /*
00225  *  優先度データキューへのデータ送信
00226  */
00227 #ifdef TOPPERS_pdqsnd
00228 
00229 bool_t
00230 send_pridata(PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_reqdsp)
00231 {
00232     TCB     *p_tcb;
00233 
00234     if (!queue_empty(&(p_pdqcb->rwait_queue))) {
00235         p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
00236         ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data;
00237         ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
00238         *p_reqdsp = wait_complete(p_tcb);
00239         return(true);
00240     }
00241     else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
00242         enqueue_pridata(p_pdqcb, data, datapri);
00243         *p_reqdsp = false;
00244         return(true);
00245     }
00246     else {
00247         return(false);
00248     }
00249 }
00250 
00251 #endif /* TOPPERS_pdqsnd */
00252 
00253 /*
00254  *  優先度データキューからのデータ受信
00255  */
00256 #ifdef TOPPERS_pdqrcv
00257 
00258 bool_t
00259 receive_pridata(PDQCB *p_pdqcb, intptr_t *p_data,
00260                                     PRI *p_datapri, bool_t *p_reqdsp)
00261 {
00262     TCB     *p_tcb;
00263     intptr_t data;
00264     PRI     datapri;
00265 
00266     if (p_pdqcb->count > 0U) {
00267         dequeue_pridata(p_pdqcb, p_data, p_datapri);
00268         if (!queue_empty(&(p_pdqcb->swait_queue))) {
00269             p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
00270             data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
00271             datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
00272             enqueue_pridata(p_pdqcb, data, datapri);
00273             *p_reqdsp = wait_complete(p_tcb);
00274         }
00275         else {
00276             *p_reqdsp = false;
00277         }
00278         return(true);
00279     }
00280     else if (!queue_empty(&(p_pdqcb->swait_queue))) {
00281         p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
00282         *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
00283         *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
00284         *p_reqdsp = wait_complete(p_tcb);
00285         return(true);
00286     }
00287     else {
00288         return(false);
00289     }
00290 }
00291 
00292 #endif /* TOPPERS_pdqrcv */
00293 
00294 /*
00295  *  優先度データキューへの送信
00296  */
00297 #ifdef TOPPERS_snd_pdq
00298 
00299 ER
00300 snd_pdq(ID pdqid, intptr_t data, PRI datapri)
00301 {
00302     PDQCB   *p_pdqcb;
00303     WINFO_PDQ winfo_pdq;
00304     bool_t  reqdsp;
00305     ER      ercd;
00306 
00307     LOG_SND_PDQ_ENTER(pdqid, data, datapri);
00308     CHECK_DISPATCH();
00309     CHECK_PDQID(pdqid);
00310     p_pdqcb = get_pdqcb(pdqid);
00311     CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
00312 
00313     t_lock_cpu();
00314     if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
00315         if (reqdsp) {
00316             dispatch();
00317         }
00318         ercd = E_OK;
00319     }
00320     else {
00321         winfo_pdq.data = data;
00322         winfo_pdq.datapri = datapri;
00323         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
00324         wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
00325         dispatch();
00326         ercd = winfo_pdq.winfo.wercd;
00327     }
00328     t_unlock_cpu();
00329 
00330   error_exit:
00331     LOG_SND_PDQ_LEAVE(ercd);
00332     return(ercd);
00333 }
00334 
00335 #endif /* TOPPERS_snd_pdq */
00336 
00337 /*
00338  *  優先度データキューへの送信(ポーリング)
00339  */
00340 #ifdef TOPPERS_psnd_pdq
00341 
00342 ER
00343 psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
00344 {
00345     PDQCB   *p_pdqcb;
00346     bool_t  reqdsp;
00347     ER      ercd;
00348 
00349     LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
00350     CHECK_TSKCTX_UNL();
00351     CHECK_PDQID(pdqid);
00352     p_pdqcb = get_pdqcb(pdqid);
00353     CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
00354 
00355     t_lock_cpu();
00356     if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
00357         if (reqdsp) {
00358             dispatch();
00359         }
00360         ercd = E_OK;
00361     }
00362     else {
00363         ercd = E_TMOUT;
00364     }
00365     t_unlock_cpu();
00366 
00367   error_exit:
00368     LOG_PSND_PDQ_LEAVE(ercd);
00369     return(ercd);
00370 }
00371 
00372 #endif /* TOPPERS_psnd_pdq */
00373 
00374 /*
00375  *  優先度データキューへの送信(ポーリング,非タスクコンテキスト用)
00376  */
00377 #ifdef TOPPERS_ipsnd_pdq
00378 
00379 ER
00380 ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
00381 {
00382     PDQCB   *p_pdqcb;
00383     bool_t  reqdsp;
00384     ER      ercd;
00385 
00386     LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
00387     CHECK_INTCTX_UNL();
00388     CHECK_PDQID(pdqid);
00389     p_pdqcb = get_pdqcb(pdqid);
00390     CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
00391 
00392     i_lock_cpu();
00393     if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
00394         if (reqdsp) {
00395             reqflg = true;
00396         }
00397         ercd = E_OK;
00398     }
00399     else {
00400         ercd = E_TMOUT;
00401     }
00402     i_unlock_cpu();
00403 
00404   error_exit:
00405     LOG_IPSND_PDQ_LEAVE(ercd);
00406     return(ercd);
00407 }
00408 
00409 #endif /* TOPPERS_ipsnd_pdq */
00410 
00411 /*
00412  *  優先度データキューへの送信(タイムアウトあり)
00413  */
00414 #ifdef TOPPERS_tsnd_pdq
00415 
00416 ER
00417 tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
00418 {
00419     PDQCB   *p_pdqcb;
00420     WINFO_PDQ winfo_pdq;
00421     TMEVTB  tmevtb;
00422     bool_t  reqdsp;
00423     ER      ercd;
00424 
00425     LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
00426     CHECK_DISPATCH();
00427     CHECK_PDQID(pdqid);
00428     CHECK_TMOUT(tmout);
00429     p_pdqcb = get_pdqcb(pdqid);
00430     CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
00431 
00432     t_lock_cpu();
00433     if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
00434         if (reqdsp) {
00435             dispatch();
00436         }
00437         ercd = E_OK;
00438     }
00439     else if (tmout == TMO_POL) {
00440         ercd = E_TMOUT;
00441     }
00442     else {
00443         winfo_pdq.data = data;
00444         winfo_pdq.datapri = datapri;
00445         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
00446         wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
00447                                                         &tmevtb, tmout);
00448         dispatch();
00449         ercd = winfo_pdq.winfo.wercd;
00450     }
00451     t_unlock_cpu();
00452 
00453   error_exit:
00454     LOG_TSND_PDQ_LEAVE(ercd);
00455     return(ercd);
00456 }
00457 
00458 #endif /* TOPPERS_tsnd_pdq */
00459 
00460 /*
00461  *  優先度データキューからの受信
00462  */
00463 #ifdef TOPPERS_rcv_pdq
00464 
00465 ER
00466 rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
00467 {
00468     PDQCB   *p_pdqcb;
00469     WINFO_PDQ winfo_pdq;
00470     bool_t  reqdsp;
00471     ER      ercd;
00472 
00473     LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
00474     CHECK_DISPATCH();
00475     CHECK_PDQID(pdqid);
00476     p_pdqcb = get_pdqcb(pdqid);
00477 
00478     t_lock_cpu();
00479     if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
00480         if (reqdsp) {
00481             dispatch();
00482         }
00483         ercd = E_OK;
00484     }
00485     else {
00486         p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
00487         make_wait((WINFO *) &winfo_pdq);
00488         queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
00489         winfo_pdq.p_pdqcb = p_pdqcb;
00490         LOG_TSKSTAT(p_runtsk);
00491         dispatch();
00492         ercd = winfo_pdq.winfo.wercd;
00493         if (ercd == E_OK) {
00494             *p_data = winfo_pdq.data;
00495             *p_datapri = winfo_pdq.datapri;
00496         }
00497     }
00498     t_unlock_cpu();
00499 
00500   error_exit:
00501     LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
00502     return(ercd);
00503 }
00504 
00505 #endif /* TOPPERS_rcv_pdq */
00506 
00507 /*
00508  *  優先度データキューからの受信(ポーリング)
00509  */
00510 #ifdef TOPPERS_prcv_pdq
00511 
00512 ER
00513 prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
00514 {
00515     PDQCB   *p_pdqcb;
00516     bool_t  reqdsp;
00517     ER      ercd;
00518 
00519     LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
00520     CHECK_TSKCTX_UNL();
00521     CHECK_PDQID(pdqid);
00522     p_pdqcb = get_pdqcb(pdqid);
00523 
00524     t_lock_cpu();
00525     if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
00526         if (reqdsp) {
00527             dispatch();
00528         }
00529         ercd = E_OK;
00530     }
00531     else {
00532         ercd = E_TMOUT;
00533     }
00534     t_unlock_cpu();
00535 
00536   error_exit:
00537     LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
00538     return(ercd);
00539 }
00540 
00541 #endif /* TOPPERS_prcv_pdq */
00542 
00543 /*
00544  *  優先度データキューからの受信(タイムアウトあり)
00545  */
00546 #ifdef TOPPERS_trcv_pdq
00547 
00548 ER
00549 trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
00550 {
00551     PDQCB   *p_pdqcb;
00552     WINFO_PDQ winfo_pdq;
00553     TMEVTB  tmevtb;
00554     bool_t  reqdsp;
00555     ER      ercd;
00556 
00557     LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
00558     CHECK_DISPATCH();
00559     CHECK_PDQID(pdqid);
00560     CHECK_TMOUT(tmout);
00561     p_pdqcb = get_pdqcb(pdqid);
00562 
00563     t_lock_cpu();
00564     if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
00565         if (reqdsp) {
00566             dispatch();
00567         }
00568         ercd = E_OK;
00569     }
00570     else if (tmout == TMO_POL) {
00571         ercd = E_TMOUT;
00572     }
00573     else {
00574         p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
00575         make_wait_tmout((WINFO *) &winfo_pdq, &tmevtb, tmout);
00576         queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
00577         winfo_pdq.p_pdqcb = p_pdqcb;
00578         LOG_TSKSTAT(p_runtsk);
00579         dispatch();
00580         ercd = winfo_pdq.winfo.wercd;
00581         if (ercd == E_OK) {
00582             *p_data = winfo_pdq.data;
00583             *p_datapri = winfo_pdq.datapri;
00584         }
00585     }
00586     t_unlock_cpu();
00587 
00588   error_exit:
00589     LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
00590     return(ercd);
00591 }
00592 
00593 #endif /* TOPPERS_trcv_pdq */
00594 
00595 /*
00596  *  優先度データキューの再初期化
00597  */
00598 #ifdef TOPPERS_ini_pdq
00599 
00600 ER
00601 ini_pdq(ID pdqid)
00602 {
00603     PDQCB   *p_pdqcb;
00604     bool_t  dspreq;
00605     ER      ercd;
00606     
00607     LOG_INI_PDQ_ENTER(pdqid);
00608     CHECK_TSKCTX_UNL();
00609     CHECK_PDQID(pdqid);
00610     p_pdqcb = get_pdqcb(pdqid);
00611 
00612     t_lock_cpu();
00613     dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
00614     if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
00615         dspreq = true;
00616     }
00617     p_pdqcb->count = 0U;
00618     p_pdqcb->p_head = NULL;
00619     p_pdqcb->unused = 0U;
00620     p_pdqcb->p_freelist = NULL;
00621     if (dspreq) {
00622         dispatch();
00623     }
00624     ercd = E_OK;
00625     t_unlock_cpu();
00626 
00627   error_exit:
00628     LOG_INI_PDQ_LEAVE(ercd);
00629     return(ercd);
00630 }
00631 
00632 #endif /* TOPPERS_ini_pdq */
00633 
00634 /*
00635  *  優先度データキューの状態参照
00636  */
00637 #ifdef TOPPERS_ref_pdq
00638 
00639 ER
00640 ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
00641 {
00642     PDQCB   *p_pdqcb;
00643     ER      ercd;
00644     
00645     LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
00646     CHECK_TSKCTX_UNL();
00647     CHECK_PDQID(pdqid);
00648     p_pdqcb = get_pdqcb(pdqid);
00649 
00650     t_lock_cpu();
00651     pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
00652     pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
00653     pk_rpdq->spdqcnt = p_pdqcb->count;
00654     ercd = E_OK;
00655     t_unlock_cpu();
00656 
00657   error_exit:
00658     LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
00659     return(ercd);
00660 }
00661 
00662 #endif /* TOPPERS_ref_pdq */

Copyright © 2008 by Kijineko Inc.

ホームページ制作