wait.c

#include "kernel_impl.h"
#include "wait.h"

ソースコードを見る。

関数

void make_wait_tmout (WINFO *p_winfo, TMEVTB *p_tmevtb, TMO tmout)
Inline bool_t make_non_wait (TCB *p_tcb)
bool_t wait_complete (TCB *p_tcb)
void wait_tmout (TCB *p_tcb)
void wait_tmout_ok (TCB *p_tcb)
bool_t wait_release (TCB *p_tcb)
Inline void wobj_queue_insert (WOBJCB *p_wobjcb)
void wobj_make_wait (WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo_wobj)
void wobj_make_wait_tmout (WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo_wobj, TMEVTB *p_tmevtb, TMO tmout)
bool_t init_wait_queue (QUEUE *p_wait_queue)


関数

bool_t init_wait_queue ( QUEUE p_wait_queue  ) 

wait.c225 行で定義されています。

参照先 E_DLT, make_non_wait(), task_control_block::p_winfo, queue_delete_next(), queue_empty(), wait_dequeue_tmevtb(), と waiting_information::wercd.

00226 {
00227     TCB     *p_tcb;
00228     bool_t  dspreq = false;
00229 
00230     while (!queue_empty(p_wait_queue)) {
00231         p_tcb = (TCB *) queue_delete_next(p_wait_queue);
00232         wait_dequeue_tmevtb(p_tcb);
00233         p_tcb->p_winfo->wercd = E_DLT;
00234         if (make_non_wait(p_tcb)) {
00235             dspreq = true;
00236         };
00237     }
00238     return(dspreq);
00239 }

Inline bool_t make_non_wait ( TCB p_tcb  ) 

wait.c81 行で定義されています。

参照先 assert, LOG_TSKSTAT, make_runnable, TS_SUSPENDED, task_control_block::tstat, TSTAT_SUSPENDED, と TSTAT_WAITING.

参照元 init_wait_queue(), wait_complete(), wait_release(), wait_tmout(), と wait_tmout_ok().

00082 {
00083     assert(TSTAT_WAITING(p_tcb->tstat));
00084 
00085     if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
00086         /*
00087          *  待ち状態から実行できる状態への遷移
00088          */
00089         return(make_runnable(p_tcb));
00090     }
00091     else {
00092         /*
00093          *  二重待ち状態から強制待ち状態への遷移
00094          */
00095         p_tcb->tstat = TS_SUSPENDED;
00096         LOG_TSKSTAT(p_tcb);
00097         return(false);
00098     }
00099 }

void make_wait_tmout ( WINFO p_winfo,
TMEVTB p_tmevtb,
TMO  tmout 
)

wait.c56 行で定義されています。

参照先 assert, make_non_runnable, NULL, p_runtsk, waiting_information::p_tmevtb, tmevtb_enqueue(), TMO_FEVR, と wait_tmout.

00057 {
00058     (void) make_non_runnable(p_runtsk);
00059     p_runtsk->p_winfo = p_winfo;
00060     if (tmout > 0) {
00061         p_winfo->p_tmevtb = p_tmevtb;
00062         tmevtb_enqueue(p_tmevtb, (RELTIM) tmout,
00063                         (CBACK) wait_tmout, (void *) p_runtsk);
00064     }
00065     else {
00066         assert(tmout == TMO_FEVR);
00067         p_winfo->p_tmevtb = NULL;
00068     }
00069 }

bool_t wait_complete ( TCB p_tcb  ) 

wait.c107 行で定義されています。

参照先 E_OK, make_non_wait(), task_control_block::p_winfo, wait_dequeue_tmevtb(), と waiting_information::wercd.

00108 {
00109     wait_dequeue_tmevtb(p_tcb);
00110     p_tcb->p_winfo->wercd = E_OK;
00111     return(make_non_wait(p_tcb));
00112 }

bool_t wait_release ( TCB p_tcb  ) 

wait.c163 行で定義されています。

参照先 E_RLWAI, make_non_wait(), task_control_block::p_winfo, wait_dequeue_tmevtb(), wait_dequeue_wobj(), と waiting_information::wercd.

00164 {
00165     wait_dequeue_wobj(p_tcb);
00166     wait_dequeue_tmevtb(p_tcb);
00167     p_tcb->p_winfo->wercd = E_RLWAI;
00168     return(make_non_wait(p_tcb));
00169 }

void wait_tmout ( TCB p_tcb  ) 

wait.c122 行で定義されています。

参照先 E_TMOUT, i_lock_cpu, i_unlock_cpu, make_non_wait(), task_control_block::p_winfo, reqflg, wait_dequeue_wobj(), と waiting_information::wercd.

00123 {
00124     wait_dequeue_wobj(p_tcb);
00125     p_tcb->p_winfo->wercd = E_TMOUT;
00126     if (make_non_wait(p_tcb)) {
00127         reqflg = true;
00128     }
00129 
00130     /*
00131      *  ここで優先度の高い割込みを受け付ける.
00132      */
00133     i_unlock_cpu();
00134     i_lock_cpu();
00135 }

void wait_tmout_ok ( TCB p_tcb  ) 

wait.c141 行で定義されています。

参照先 E_OK, i_lock_cpu, i_unlock_cpu, make_non_wait(), task_control_block::p_winfo, reqflg, と waiting_information::wercd.

00142 {
00143     p_tcb->p_winfo->wercd = E_OK;
00144     if (make_non_wait(p_tcb)) {
00145         reqflg = true;
00146     }
00147 
00148     /*
00149      *  ここで優先度の高い割込みを受け付ける.
00150      */
00151     i_unlock_cpu();
00152     i_lock_cpu();
00153 }

void wobj_make_wait ( WOBJCB p_wobjcb,
WINFO_WOBJ p_winfo_wobj 
)

wait.c196 行で定義されています。

参照先 LOG_TSKSTAT, make_wait(), p_runtsk, と wobj_queue_insert().

00197 {
00198     make_wait((WINFO *) p_winfo_wobj);
00199     wobj_queue_insert(p_wobjcb);
00200     p_winfo_wobj->p_wobjcb = p_wobjcb;
00201     LOG_TSKSTAT(p_runtsk);
00202 }

void wobj_make_wait_tmout ( WOBJCB p_wobjcb,
WINFO_WOBJ p_winfo_wobj,
TMEVTB p_tmevtb,
TMO  tmout 
)

wait.c208 行で定義されています。

参照先 LOG_TSKSTAT, make_wait_tmout, p_runtsk, と wobj_queue_insert().

00210 {
00211     make_wait_tmout((WINFO *) p_winfo_wobj, p_tmevtb, tmout);
00212     wobj_queue_insert(p_wobjcb);
00213     p_winfo_wobj->p_wobjcb = p_wobjcb;
00214     LOG_TSKSTAT(p_runtsk);
00215 }

Inline void wobj_queue_insert ( WOBJCB p_wobjcb  ) 

wait.c180 行で定義されています。

参照先 p_runtsk, wait_object_control_block::p_wobjinib, queue_insert_prev(), queue_insert_tpri(), TA_TPRI, wait_object_control_block::wait_queue, と wait_object_initialization_block::wobjatr.

参照元 wobj_make_wait(), と wobj_make_wait_tmout().

00181 {
00182     if ((p_wobjcb->p_wobjinib->wobjatr & TA_TPRI) != 0U) {
00183         queue_insert_tpri(&(p_wobjcb->wait_queue), p_runtsk);
00184     }
00185     else {
00186         queue_insert_prev(&(p_wobjcb->wait_queue), &(p_runtsk->task_queue));
00187     }
00188 }


Copyright © 2008 by Kijineko Inc.

ホームページ制作