wait.h

#include "task.h"
#include "time_event.h"

ソースコードを見る。

データ構造

struct  wait_object_initialization_block
struct  wait_object_control_block
struct  wait_object_waiting_information

型定義

typedef struct
wait_object_initialization_block 
WOBJINIB
typedef struct
wait_object_control_block 
WOBJCB
typedef struct
wait_object_waiting_information 
WINFO_WOBJ

関数

Inline void queue_insert_tpri (QUEUE *p_queue, TCB *p_tcb)
Inline void make_wait (WINFO *p_winfo)
void make_wait_tmout (WINFO *p_winfo, TMEVTB *p_tmevtb, TMO tmout)
Inline void wait_dequeue_wobj (TCB *p_tcb)
Inline void wait_dequeue_tmevtb (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 ID wait_tskid (QUEUE *p_wait_queue)
void wobj_make_wait (WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo)
void wobj_make_wait_tmout (WOBJCB *p_wobjcb, WINFO_WOBJ *p_winfo, TMEVTB *p_tmevtb, TMO tmout)
Inline void wobj_change_priority (WOBJCB *p_wobjcb, TCB *p_tcb)
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 void make_wait ( WINFO p_winfo  ) 

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

参照先 make_non_runnable, NULL, p_runtsk, と waiting_information::p_tmevtb.

参照元 rcv_dtq(), rcv_pdq(), slp_tsk(), と wobj_make_wait().

00083 {
00084     (void) make_non_runnable(p_runtsk);
00085     p_runtsk->p_winfo = p_winfo;
00086     p_winfo->p_tmevtb = NULL;
00087 }

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 }

Inline void queue_insert_tpri ( QUEUE p_queue,
TCB p_tcb 
)

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

参照先 queue::p_next, task_control_block::priority, queue_insert_prev(), と task_control_block::task_queue.

参照元 wobj_change_priority(), と wobj_queue_insert().

00061 {
00062     QUEUE   *p_entry;
00063     uint_t  priority = p_tcb->priority;
00064 
00065     for (p_entry = p_queue->p_next; p_entry != p_queue;
00066                                         p_entry = p_entry->p_next) {
00067         if (priority < ((TCB *) p_entry)->priority) {
00068             break;
00069         }
00070     }
00071     queue_insert_prev(p_entry, &(p_tcb->task_queue));
00072 }

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 }

Inline void wait_dequeue_tmevtb ( TCB p_tcb  ) 

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

参照先 NULL, waiting_information::p_tmevtb, task_control_block::p_winfo, と tmevtb_dequeue().

参照元 init_wait_queue(), ter_tsk(), wait_complete(), と wait_release().

00121 {
00122     if (p_tcb->p_winfo->p_tmevtb != NULL) {
00123         tmevtb_dequeue(p_tcb->p_winfo->p_tmevtb);
00124     }
00125 }

Inline void wait_dequeue_wobj ( TCB p_tcb  ) 

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

参照先 queue_delete(), task_control_block::task_queue, task_control_block::tstat, と TSTAT_WAIT_WOBJ.

参照元 ter_tsk(), wait_release(), と wait_tmout().

00107 {
00108     if (TSTAT_WAIT_WOBJ(p_tcb->tstat)) {
00109         queue_delete(&(p_tcb->task_queue));
00110     }
00111 }

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 }

Inline ID wait_tskid ( QUEUE p_wait_queue  ) 

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

参照先 queue::p_next, queue_empty(), TSK_NONE, と TSKID.

参照元 ref_dtq(), ref_flg(), ref_mbx(), ref_mpf(), ref_pdq(), と ref_sem().

00174 {
00175     if (!queue_empty(p_wait_queue)) {
00176         return(TSKID((TCB *) p_wait_queue->p_next));
00177     }
00178     else {
00179         return(TSK_NONE);
00180     }
00181 }

Inline void wobj_change_priority ( WOBJCB p_wobjcb,
TCB p_tcb 
)

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

参照先 wait_object_control_block::p_wobjinib, queue_delete(), queue_insert_tpri(), TA_TPRI, task_control_block::task_queue, wait_object_control_block::wait_queue, と wait_object_initialization_block::wobjatr.

参照元 change_priority().

00242 {
00243     if ((p_wobjcb->p_wobjinib->wobjatr & TA_TPRI) != 0U) {
00244         queue_delete(&(p_tcb->task_queue));
00245         queue_insert_tpri(&(p_wobjcb->wait_queue), p_tcb);
00246     }
00247 }

void wobj_make_wait ( WOBJCB p_wobjcb,
WINFO_WOBJ p_winfo 
)

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,
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 }


Copyright © 2008 by Kijineko Inc.

ホームページ制作