#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) |
参照先 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 }
参照先 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 }
参照先 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 }
参照先 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 }
参照先 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 | ) |
参照先 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 | ) |
参照先 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 | |||
) |
参照先 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 | |||
) |
参照先 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 | ) |
参照先 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.