#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) |
typedef struct wait_object_waiting_information WINFO_WOBJ |
typedef struct wait_object_control_block WOBJCB |
typedef struct wait_object_initialization_block WOBJINIB |
参照先 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 | ) |
参照先 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 }
参照先 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 }
参照先 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 }
参照先 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 | ) |
参照先 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 | ) |
参照先 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 }
参照先 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 }
参照先 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 }
参照先 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 | |||
) |
参照先 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 | |||
) |
参照先 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.