dataqueue.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: dataqueue.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 "dataqueue.h"
00052 
00053 /*
00054  *  トレースログマクロのデフォルト定義
00055  */
00056 #ifndef LOG_SND_DTQ_ENTER
00057 #define LOG_SND_DTQ_ENTER(dtqid, data)
00058 #endif /* LOG_SND_DTQ_ENTER */
00059 
00060 #ifndef LOG_SND_DTQ_LEAVE
00061 #define LOG_SND_DTQ_LEAVE(ercd)
00062 #endif /* LOG_SND_DTQ_LEAVE */
00063 
00064 #ifndef LOG_PSND_DTQ_ENTER
00065 #define LOG_PSND_DTQ_ENTER(dtqid, data)
00066 #endif /* LOG_PSND_DTQ_ENTER */
00067 
00068 #ifndef LOG_PSND_DTQ_LEAVE
00069 #define LOG_PSND_DTQ_LEAVE(ercd)
00070 #endif /* LOG_PSND_DTQ_LEAVE */
00071 
00072 #ifndef LOG_IPSND_DTQ_ENTER
00073 #define LOG_IPSND_DTQ_ENTER(dtqid, data)
00074 #endif /* LOG_IPSND_DTQ_ENTER */
00075 
00076 #ifndef LOG_IPSND_DTQ_LEAVE
00077 #define LOG_IPSND_DTQ_LEAVE(ercd)
00078 #endif /* LOG_IPSND_DTQ_LEAVE */
00079 
00080 #ifndef LOG_TSND_DTQ_ENTER
00081 #define LOG_TSND_DTQ_ENTER(dtqid, data, tmout)
00082 #endif /* LOG_TSND_DTQ_ENTER */
00083 
00084 #ifndef LOG_TSND_DTQ_LEAVE
00085 #define LOG_TSND_DTQ_LEAVE(ercd)
00086 #endif /* LOG_TSND_DTQ_LEAVE */
00087 
00088 #ifndef LOG_FSND_DTQ_ENTER
00089 #define LOG_FSND_DTQ_ENTER(dtqid, data)
00090 #endif /* LOG_FSND_DTQ_ENTER */
00091 
00092 #ifndef LOG_FSND_DTQ_LEAVE
00093 #define LOG_FSND_DTQ_LEAVE(ercd)
00094 #endif /* LOG_FSND_DTQ_LEAVE */
00095 
00096 #ifndef LOG_IFSND_DTQ_ENTER
00097 #define LOG_IFSND_DTQ_ENTER(dtqid, data)
00098 #endif /* LOG_IFSND_DTQ_ENTER */
00099 
00100 #ifndef LOG_IFSND_DTQ_LEAVE
00101 #define LOG_IFSND_DTQ_LEAVE(ercd)
00102 #endif /* LOG_IFSND_DTQ_LEAVE */
00103 
00104 #ifndef LOG_RCV_DTQ_ENTER
00105 #define LOG_RCV_DTQ_ENTER(dtqid, p_data)
00106 #endif /* LOG_RCV_DTQ_ENTER */
00107 
00108 #ifndef LOG_RCV_DTQ_LEAVE
00109 #define LOG_RCV_DTQ_LEAVE(ercd, data)
00110 #endif /* LOG_RCV_DTQ_LEAVE */
00111 
00112 #ifndef LOG_PRCV_DTQ_ENTER
00113 #define LOG_PRCV_DTQ_ENTER(dtqid, p_data)
00114 #endif /* LOG_PRCV_DTQ_ENTER */
00115 
00116 #ifndef LOG_PRCV_DTQ_LEAVE
00117 #define LOG_PRCV_DTQ_LEAVE(ercd, data)
00118 #endif /* LOG_PRCV_DTQ_LEAVE */
00119 
00120 #ifndef LOG_TRCV_DTQ_ENTER
00121 #define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout)
00122 #endif /* LOG_TRCV_DTQ_ENTER */
00123 
00124 #ifndef LOG_TRCV_DTQ_LEAVE
00125 #define LOG_TRCV_DTQ_LEAVE(ercd, data)
00126 #endif /* LOG_TRCV_DTQ_LEAVE */
00127 
00128 #ifndef LOG_INI_DTQ_ENTER
00129 #define LOG_INI_DTQ_ENTER(dtqid)
00130 #endif /* LOG_INI_DTQ_ENTER */
00131 
00132 #ifndef LOG_INI_DTQ_LEAVE
00133 #define LOG_INI_DTQ_LEAVE(ercd)
00134 #endif /* LOG_INI_DTQ_LEAVE */
00135 
00136 #ifndef LOG_REF_DTQ_ENTER
00137 #define LOG_REF_DTQ_ENTER(dtqid, pk_rdtq)
00138 #endif /* LOG_REF_DTQ_ENTER */
00139 
00140 #ifndef LOG_REF_DTQ_LEAVE
00141 #define LOG_REF_DTQ_LEAVE(ercd, pk_rdtq)
00142 #endif /* LOG_REF_DTQ_LEAVE */
00143 
00144 /*
00145  *  データキューの数
00146  */
00147 #define tnum_dtq    ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))
00148 
00149 /*
00150  *  データキューIDからデータキュー管理ブロックを取り出すためのマクロ
00151  */
00152 #define INDEX_DTQ(dtqid)    ((uint_t)((dtqid) - TMIN_DTQID))
00153 #define get_dtqcb(dtqid)    (&(dtqcb_table[INDEX_DTQ(dtqid)]))
00154 
00155 /*
00156  *  データキュー機能の初期化
00157  */
00158 #ifdef TOPPERS_dtqini
00159 
00160 void
00161 initialize_dataqueue(void)
00162 {
00163     uint_t  i;
00164     DTQCB   *p_dtqcb;
00165 
00166     for (p_dtqcb = dtqcb_table, i = 0; i < tnum_dtq; p_dtqcb++, i++) {
00167         queue_initialize(&(p_dtqcb->swait_queue));
00168         p_dtqcb->p_dtqinib = &(dtqinib_table[i]);
00169         queue_initialize(&(p_dtqcb->rwait_queue));
00170         p_dtqcb->count = 0U;
00171         p_dtqcb->head = 0U;
00172         p_dtqcb->tail = 0U;
00173     }
00174 }
00175 
00176 #endif /* TOPPERS_dtqini */
00177 
00178 /*
00179  *  データキュー管理領域へのデータの格納
00180  */
00181 #ifdef TOPPERS_dtqenq
00182 
00183 void
00184 enqueue_data(DTQCB *p_dtqcb, intptr_t data)
00185 {
00186     *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data;
00187     p_dtqcb->count++;
00188     p_dtqcb->tail++;
00189     if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
00190         p_dtqcb->tail = 0U;
00191     }
00192 }
00193 
00194 #endif /* TOPPERS_dtqenq */
00195 
00196 /*
00197  *  データキュー管理領域へのデータの強制格納
00198  */
00199 #ifdef TOPPERS_dtqfenq
00200 
00201 void
00202 force_enqueue_data(DTQCB *p_dtqcb, intptr_t data)
00203 {
00204     *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data;
00205     p_dtqcb->tail++;
00206     if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
00207         p_dtqcb->tail = 0U;
00208     }
00209     if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
00210         p_dtqcb->count++;
00211     }
00212     else {
00213         p_dtqcb->head = p_dtqcb->tail;
00214     }
00215 }
00216 
00217 #endif /* TOPPERS_dtqfenq */
00218 
00219 /*
00220  *  データキュー管理領域からのデータの取出し
00221  */
00222 #ifdef TOPPERS_dtqdeq
00223 
00224 void
00225 dequeue_data(DTQCB *p_dtqcb, intptr_t *p_data)
00226 {
00227     *p_data = *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head);
00228     p_dtqcb->count--;
00229     p_dtqcb->head++;
00230     if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
00231         p_dtqcb->head = 0U;
00232     }
00233 }
00234 
00235 #endif /* TOPPERS_dtqdeq */
00236 
00237 /*
00238  *  データキューへのデータ送信
00239  */
00240 #ifdef TOPPERS_dtqsnd
00241 
00242 bool_t
00243 send_data(DTQCB *p_dtqcb, intptr_t data, bool_t *p_reqdsp)
00244 {
00245     TCB     *p_tcb;
00246 
00247     if (!queue_empty(&(p_dtqcb->rwait_queue))) {
00248         p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
00249         ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
00250         *p_reqdsp = wait_complete(p_tcb);
00251         return(true);
00252     }
00253     else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
00254         enqueue_data(p_dtqcb, data);
00255         *p_reqdsp = false;
00256         return(true);
00257     }
00258     else {
00259         return(false);
00260     }
00261 }
00262 
00263 #endif /* TOPPERS_dtqsnd */
00264 
00265 /*
00266  *  データキューへのデータ強制送信
00267  */
00268 #ifdef TOPPERS_dtqfsnd
00269 
00270 bool_t
00271 force_send_data(DTQCB *p_dtqcb, intptr_t data)
00272 {
00273     TCB     *p_tcb;
00274 
00275     if (!queue_empty(&(p_dtqcb->rwait_queue))) {
00276         p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
00277         ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
00278         return(wait_complete(p_tcb));
00279     }
00280     else {
00281         force_enqueue_data(p_dtqcb, data);
00282         return(false);
00283     }
00284 }
00285 
00286 #endif /* TOPPERS_dtqfsnd */
00287 
00288 /*
00289  *  送信待ちキューの先頭タスクからのデータ受信
00290  */
00291 #ifdef TOPPERS_dtqrcv
00292 
00293 bool_t
00294 receive_data(DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_reqdsp)
00295 {
00296     TCB     *p_tcb;
00297     intptr_t data;
00298 
00299     if (p_dtqcb->count > 0U) {
00300         dequeue_data(p_dtqcb, p_data);
00301         if (!queue_empty(&(p_dtqcb->swait_queue))) {
00302             p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
00303             data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
00304             enqueue_data(p_dtqcb, data);
00305             *p_reqdsp = wait_complete(p_tcb);
00306         }
00307         else {
00308             *p_reqdsp = false;
00309         }
00310         return(true);
00311     }
00312     else if (!queue_empty(&(p_dtqcb->swait_queue))) {
00313         p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
00314         *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
00315         *p_reqdsp = wait_complete(p_tcb);
00316         return(true);
00317     }
00318     else {
00319         return(false);
00320     }
00321 }
00322 
00323 #endif /* TOPPERS_dtqrcv */
00324 
00325 /*
00326  *  データキューへの送信
00327  */
00328 #ifdef TOPPERS_snd_dtq
00329 
00330 ER
00331 snd_dtq(ID dtqid, intptr_t data)
00332 {
00333     DTQCB   *p_dtqcb;
00334     WINFO_DTQ winfo_dtq;
00335     bool_t  reqdsp;
00336     ER      ercd;
00337 
00338     LOG_SND_DTQ_ENTER(dtqid, data);
00339     CHECK_DISPATCH();
00340     CHECK_DTQID(dtqid);
00341     p_dtqcb = get_dtqcb(dtqid);
00342 
00343     t_lock_cpu();
00344     if (send_data(p_dtqcb, data, &reqdsp)) {
00345         if (reqdsp) {
00346             dispatch();
00347         }
00348         ercd = E_OK;
00349     }
00350     else {
00351         winfo_dtq.data = data;
00352         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
00353         wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq);
00354         dispatch();
00355         ercd = winfo_dtq.winfo.wercd;
00356     }
00357     t_unlock_cpu();
00358 
00359   error_exit:
00360     LOG_SND_DTQ_LEAVE(ercd);
00361     return(ercd);
00362 }
00363 
00364 #endif /* TOPPERS_snd_dtq */
00365 
00366 /*
00367  *  データキューへの送信(ポーリング)
00368  */
00369 #ifdef TOPPERS_psnd_dtq
00370 
00371 ER
00372 psnd_dtq(ID dtqid, intptr_t data)
00373 {
00374     DTQCB   *p_dtqcb;
00375     bool_t  reqdsp;
00376     ER      ercd;
00377 
00378     LOG_PSND_DTQ_ENTER(dtqid, data);
00379     CHECK_TSKCTX_UNL();
00380     CHECK_DTQID(dtqid);
00381     p_dtqcb = get_dtqcb(dtqid);
00382 
00383     t_lock_cpu();
00384     if (send_data(p_dtqcb, data, &reqdsp)) {
00385         if (reqdsp) {
00386             dispatch();
00387         }
00388         ercd = E_OK;
00389     }
00390     else {
00391         ercd = E_TMOUT;
00392     }
00393     t_unlock_cpu();
00394 
00395   error_exit:
00396     LOG_PSND_DTQ_LEAVE(ercd);
00397     return(ercd);
00398 }
00399 
00400 #endif /* TOPPERS_psnd_dtq */
00401 
00402 /*
00403  *  データキューへの送信(ポーリング,非タスクコンテキスト用)
00404  */
00405 #ifdef TOPPERS_ipsnd_dtq
00406 
00407 ER
00408 ipsnd_dtq(ID dtqid, intptr_t data)
00409 {
00410     DTQCB   *p_dtqcb;
00411     bool_t  reqdsp;
00412     ER      ercd;
00413 
00414     LOG_IPSND_DTQ_ENTER(dtqid, data);
00415     CHECK_INTCTX_UNL();
00416     CHECK_DTQID(dtqid);
00417     p_dtqcb = get_dtqcb(dtqid);
00418 
00419     i_lock_cpu();
00420     if (send_data(p_dtqcb, data, &reqdsp)) {
00421         if (reqdsp) {
00422             reqflg = true;
00423         }
00424         ercd = E_OK;
00425     }
00426     else {
00427         ercd = E_TMOUT;
00428     }
00429     i_unlock_cpu();
00430 
00431   error_exit:
00432     LOG_IPSND_DTQ_LEAVE(ercd);
00433     return(ercd);
00434 }
00435 
00436 #endif /* TOPPERS_ipsnd_dtq */
00437 
00438 /*
00439  *  データキューへの送信(タイムアウトあり)
00440  */
00441 #ifdef TOPPERS_tsnd_dtq
00442 
00443 ER
00444 tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
00445 {
00446     DTQCB   *p_dtqcb;
00447     WINFO_DTQ winfo_dtq;
00448     TMEVTB  tmevtb;
00449     bool_t  reqdsp;
00450     ER      ercd;
00451 
00452     LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
00453     CHECK_DISPATCH();
00454     CHECK_DTQID(dtqid);
00455     CHECK_TMOUT(tmout);
00456     p_dtqcb = get_dtqcb(dtqid);
00457 
00458     t_lock_cpu();
00459     if (send_data(p_dtqcb, data, &reqdsp)) {
00460         if (reqdsp) {
00461             dispatch();
00462         }
00463         ercd = E_OK;
00464     }
00465     else if (tmout == TMO_POL) {
00466         ercd = E_TMOUT;
00467     }
00468     else {
00469         winfo_dtq.data = data;
00470         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
00471         wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq,
00472                                                         &tmevtb, tmout);
00473         dispatch();
00474         ercd = winfo_dtq.winfo.wercd;
00475     }
00476     t_unlock_cpu();
00477 
00478   error_exit:
00479     LOG_TSND_DTQ_LEAVE(ercd);
00480     return(ercd);
00481 }
00482 
00483 #endif /* TOPPERS_tsnd_dtq */
00484 
00485 /*
00486  *  データキューへの強制送信
00487  */
00488 #ifdef TOPPERS_fsnd_dtq
00489 
00490 ER
00491 fsnd_dtq(ID dtqid, intptr_t data)
00492 {
00493     DTQCB   *p_dtqcb;   
00494     ER      ercd;
00495 
00496     LOG_FSND_DTQ_ENTER(dtqid, data);
00497     CHECK_TSKCTX_UNL();
00498     CHECK_DTQID(dtqid);
00499     p_dtqcb = get_dtqcb(dtqid);
00500     CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
00501 
00502     t_lock_cpu();
00503     if (force_send_data(p_dtqcb, data)) {
00504         dispatch();
00505     }
00506     ercd = E_OK;
00507     t_unlock_cpu();
00508 
00509   error_exit:
00510     LOG_FSND_DTQ_LEAVE(ercd);
00511     return(ercd);
00512 }
00513 
00514 #endif /* TOPPERS_fsnd_dtq */
00515 
00516 /*
00517  *  データキューへの強制送信(非タスクコンテキスト用)
00518  */
00519 #ifdef TOPPERS_ifsnd_dtq
00520 
00521 ER
00522 ifsnd_dtq(ID dtqid, intptr_t data)
00523 {
00524     DTQCB   *p_dtqcb;
00525     ER      ercd;
00526 
00527     LOG_IFSND_DTQ_ENTER(dtqid, data);
00528     CHECK_INTCTX_UNL();
00529     CHECK_DTQID(dtqid);
00530     p_dtqcb = get_dtqcb(dtqid);
00531     CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
00532 
00533     i_lock_cpu();
00534     if (force_send_data(p_dtqcb, data)) {
00535         reqflg = true;
00536     }
00537     ercd = E_OK;
00538     i_unlock_cpu();
00539 
00540   error_exit:
00541     LOG_IFSND_DTQ_LEAVE(ercd);
00542     return(ercd);
00543 }
00544 
00545 #endif /* TOPPERS_ifsnd_dtq */
00546 
00547 /*
00548  *  データキューからの受信
00549  */
00550 #ifdef TOPPERS_rcv_dtq
00551 
00552 ER
00553 rcv_dtq(ID dtqid, intptr_t *p_data)
00554 {
00555     DTQCB   *p_dtqcb;
00556     WINFO_DTQ winfo_dtq;
00557     bool_t  reqdsp;
00558     ER      ercd;
00559 
00560     LOG_RCV_DTQ_ENTER(dtqid, p_data);
00561     CHECK_DISPATCH();
00562     CHECK_DTQID(dtqid);
00563     p_dtqcb = get_dtqcb(dtqid);
00564 
00565     t_lock_cpu();
00566     if (receive_data(p_dtqcb, p_data, &reqdsp)) {
00567         if (reqdsp) {
00568             dispatch();
00569         }
00570         ercd = E_OK;
00571     }
00572     else {
00573         p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
00574         make_wait((WINFO *) &winfo_dtq);
00575         queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
00576         winfo_dtq.p_dtqcb = p_dtqcb;
00577         LOG_TSKSTAT(p_runtsk);
00578         dispatch();
00579         ercd = winfo_dtq.winfo.wercd;
00580         if (ercd == E_OK) {
00581             *p_data = winfo_dtq.data;
00582         }
00583     }
00584     t_unlock_cpu();
00585 
00586   error_exit:
00587     LOG_RCV_DTQ_LEAVE(ercd, *p_data);
00588     return(ercd);
00589 }
00590 
00591 #endif /* TOPPERS_rcv_dtq */
00592 
00593 /*
00594  *  データキューからの受信(ポーリング)
00595  */
00596 #ifdef TOPPERS_prcv_dtq
00597 
00598 ER
00599 prcv_dtq(ID dtqid, intptr_t *p_data)
00600 {
00601     DTQCB   *p_dtqcb;
00602     bool_t  reqdsp;
00603     ER      ercd;
00604 
00605     LOG_PRCV_DTQ_ENTER(dtqid, p_data);
00606     CHECK_TSKCTX_UNL();
00607     CHECK_DTQID(dtqid);
00608     p_dtqcb = get_dtqcb(dtqid);
00609 
00610     t_lock_cpu();
00611     if (receive_data(p_dtqcb, p_data, &reqdsp)) {
00612         if (reqdsp) {
00613             dispatch();
00614         }
00615         ercd = E_OK;
00616     }
00617     else {
00618         ercd = E_TMOUT;
00619     }
00620     t_unlock_cpu();
00621 
00622   error_exit:
00623     LOG_PRCV_DTQ_LEAVE(ercd, *p_data);
00624     return(ercd);
00625 }
00626 
00627 #endif /* TOPPERS_prcv_dtq */
00628 
00629 /*
00630  *  データキューからの受信(タイムアウトあり)
00631  */
00632 #ifdef TOPPERS_trcv_dtq
00633 
00634 ER
00635 trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
00636 {
00637     DTQCB   *p_dtqcb;
00638     WINFO_DTQ winfo_dtq;
00639     TMEVTB  tmevtb;
00640     bool_t  reqdsp;
00641     ER      ercd;
00642 
00643     LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
00644     CHECK_DISPATCH();
00645     CHECK_DTQID(dtqid);
00646     CHECK_TMOUT(tmout);
00647     p_dtqcb = get_dtqcb(dtqid);
00648 
00649     t_lock_cpu();
00650     if (receive_data(p_dtqcb, p_data, &reqdsp)) {
00651         if (reqdsp) {
00652             dispatch();
00653         }
00654         ercd = E_OK;
00655     }
00656     else if (tmout == TMO_POL) {
00657         ercd = E_TMOUT;
00658     }
00659     else {
00660         p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
00661         make_wait_tmout((WINFO *) &winfo_dtq, &tmevtb, tmout);
00662         queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
00663         winfo_dtq.p_dtqcb = p_dtqcb;
00664         LOG_TSKSTAT(p_runtsk);
00665         dispatch();
00666         ercd = winfo_dtq.winfo.wercd;
00667         if (ercd == E_OK) {
00668             *p_data = winfo_dtq.data;
00669         }
00670     }
00671     t_unlock_cpu();
00672 
00673   error_exit:
00674     LOG_TRCV_DTQ_LEAVE(ercd, *p_data);
00675     return(ercd);
00676 }
00677 
00678 #endif /* TOPPERS_trcv_dtq */
00679 
00680 /*
00681  *  データキューの再初期化
00682  */
00683 #ifdef TOPPERS_ini_dtq
00684 
00685 ER
00686 ini_dtq(ID dtqid)
00687 {
00688     DTQCB   *p_dtqcb;
00689     bool_t  dspreq;
00690     ER      ercd;
00691     
00692     LOG_INI_DTQ_ENTER(dtqid);
00693     CHECK_TSKCTX_UNL();
00694     CHECK_DTQID(dtqid);
00695     p_dtqcb = get_dtqcb(dtqid);
00696 
00697     t_lock_cpu();
00698     dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
00699     if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
00700         dspreq = true;
00701     };
00702     p_dtqcb->count = 0U;
00703     p_dtqcb->head = 0U;
00704     p_dtqcb->tail = 0U;
00705     if (dspreq) {
00706         dispatch();
00707     }
00708     ercd = E_OK;
00709     t_unlock_cpu();
00710 
00711   error_exit:
00712     LOG_INI_DTQ_LEAVE(ercd);
00713     return(ercd);
00714 }
00715 
00716 #endif /* TOPPERS_ini_dtq */
00717 
00718 /*
00719  *  データキューの状態参照
00720  */
00721 #ifdef TOPPERS_ref_dtq
00722 
00723 ER
00724 ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
00725 {
00726     DTQCB   *p_dtqcb;
00727     ER      ercd;
00728     
00729     LOG_REF_DTQ_ENTER(dtqid, pk_rdtq);
00730     CHECK_TSKCTX_UNL();
00731     CHECK_DTQID(dtqid);
00732     p_dtqcb = get_dtqcb(dtqid);
00733 
00734     t_lock_cpu();
00735     pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue));
00736     pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue));
00737     pk_rdtq->sdtqcnt = p_dtqcb->count;
00738     ercd = E_OK;
00739     t_unlock_cpu();
00740 
00741   error_exit:
00742     LOG_REF_DTQ_LEAVE(ercd, pk_rdtq);
00743     return(ercd);
00744 }
00745 
00746 #endif /* TOPPERS_ref_dtq */

Copyright © 2008 by Kijineko Inc.

ホームページ制作