#include "kernel_impl.h"
#include "check.h"
#include "task.h"
#include "wait.h"
#include "eventflag.h"
マクロ定義 | |
#define | LOG_SET_FLG_ENTER(flgid, setptn) |
#define | LOG_SET_FLG_LEAVE(ercd) |
#define | LOG_ISET_FLG_ENTER(flgid, setptn) |
#define | LOG_ISET_FLG_LEAVE(ercd) |
#define | LOG_CLR_FLG_ENTER(flgid, clrptn) |
#define | LOG_CLR_FLG_LEAVE(ercd) |
#define | LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn) |
#define | LOG_WAI_FLG_LEAVE(ercd, flgptn) |
#define | LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn) |
#define | LOG_POL_FLG_LEAVE(ercd, flgptn) |
#define | LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout) |
#define | LOG_TWAI_FLG_LEAVE(ercd, flgptn) |
#define | LOG_INI_FLG_ENTER(flgid) |
#define | LOG_INI_FLG_LEAVE(ercd) |
#define | LOG_REF_FLG_ENTER(flgid, pk_rflg) |
#define | LOG_REF_FLG_LEAVE(ercd, pk_rflg) |
#define | tnum_flg ((uint_t)(tmax_flgid - TMIN_FLGID + 1)) |
#define | INDEX_FLG(flgid) ((uint_t)((flgid) - TMIN_FLGID)) |
#define | get_flgcb(flgid) (&(flgcb_table[INDEX_FLG(flgid)])) |
関数 | |
void | initialize_eventflag (void) |
bool_t | check_flg_cond (FLGCB *p_flgcb, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn) |
ER | set_flg (ID flgid, FLGPTN setptn) |
ER | iset_flg (ID flgid, FLGPTN setptn) |
ER | clr_flg (ID flgid, FLGPTN clrptn) |
ER | wai_flg (ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn) |
ER | pol_flg (ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn) |
ER | twai_flg (ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) |
ER | ini_flg (ID flgid) |
ER | ref_flg (ID flgid, T_RFLG *pk_rflg) |
#define get_flgcb | ( | flgid | ) | (&(flgcb_table[INDEX_FLG(flgid)])) |
eventflag.c の 129 行で定義されています。
参照元 clr_flg(), ini_flg(), iset_flg(), pol_flg(), ref_flg(), set_flg(), twai_flg(), と wai_flg().
#define INDEX_FLG | ( | flgid | ) | ((uint_t)((flgid) - TMIN_FLGID)) |
eventflag.c の 128 行で定義されています。
#define LOG_CLR_FLG_ENTER | ( | flgid, | |||
clrptn | ) |
#define LOG_CLR_FLG_LEAVE | ( | ercd | ) |
#define LOG_INI_FLG_ENTER | ( | flgid | ) |
#define LOG_INI_FLG_LEAVE | ( | ercd | ) |
#define LOG_ISET_FLG_ENTER | ( | flgid, | |||
setptn | ) |
#define LOG_ISET_FLG_LEAVE | ( | ercd | ) |
#define LOG_POL_FLG_ENTER | ( | flgid, | |||
waiptn, | |||||
wfmode, | |||||
p_flgptn | ) |
#define LOG_POL_FLG_LEAVE | ( | ercd, | |||
flgptn | ) |
#define LOG_REF_FLG_ENTER | ( | flgid, | |||
pk_rflg | ) |
#define LOG_REF_FLG_LEAVE | ( | ercd, | |||
pk_rflg | ) |
#define LOG_SET_FLG_ENTER | ( | flgid, | |||
setptn | ) |
#define LOG_SET_FLG_LEAVE | ( | ercd | ) |
#define LOG_TWAI_FLG_ENTER | ( | flgid, | |||
waiptn, | |||||
wfmode, | |||||
p_flgptn, | |||||
tmout | ) |
#define LOG_TWAI_FLG_LEAVE | ( | ercd, | |||
flgptn | ) |
#define LOG_WAI_FLG_ENTER | ( | flgid, | |||
waiptn, | |||||
wfmode, | |||||
p_flgptn | ) |
#define LOG_WAI_FLG_LEAVE | ( | ercd, | |||
flgptn | ) |
#define tnum_flg ((uint_t)(tmax_flgid - TMIN_FLGID + 1)) |
eventflag.c の 157 行で定義されています。
参照先 eventflag_initialization_block::flgatr, eventflag_control_block::flgptn, eventflag_control_block::p_flginib, TA_CLR, と TWF_ORW.
参照元 iset_flg(), pol_flg(), set_flg(), twai_flg(), と wai_flg().
00158 { 00159 if ((wfmode & TWF_ORW) != 0U ? (p_flgcb->flgptn & waiptn) != 0U 00160 : (p_flgcb->flgptn & waiptn) == waiptn) { 00161 *p_flgptn = p_flgcb->flgptn; 00162 if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) { 00163 p_flgcb->flgptn = 0U; 00164 } 00165 return(true); 00166 } 00167 return(false); 00168 }
eventflag.c の 276 行で定義されています。
参照先 CHECK_FLGID, CHECK_TSKCTX_UNL, E_OK, eventflag_control_block::flgptn, get_flgcb, LOG_CLR_FLG_ENTER, LOG_CLR_FLG_LEAVE, t_lock_cpu, と t_unlock_cpu.
00277 { 00278 FLGCB *p_flgcb; 00279 ER ercd; 00280 00281 LOG_CLR_FLG_ENTER(flgid, clrptn); 00282 CHECK_TSKCTX_UNL(); 00283 CHECK_FLGID(flgid); 00284 p_flgcb = get_flgcb(flgid); 00285 00286 t_lock_cpu(); 00287 p_flgcb->flgptn &= clrptn; 00288 ercd = E_OK; 00289 t_unlock_cpu(); 00290 00291 error_exit: 00292 LOG_CLR_FLG_LEAVE(ercd); 00293 return(ercd); 00294 }
eventflag.c の 442 行で定義されています。
参照先 CHECK_FLGID, CHECK_TSKCTX_UNL, dispatch, E_OK, eventflag_control_block::flgptn, get_flgcb, eventflag_initialization_block::iflgptn, init_wait_queue, LOG_INI_FLG_ENTER, LOG_INI_FLG_LEAVE, eventflag_control_block::p_flginib, t_lock_cpu, t_unlock_cpu, と eventflag_control_block::wait_queue.
00443 { 00444 FLGCB *p_flgcb; 00445 bool_t dspreq; 00446 ER ercd; 00447 00448 LOG_INI_FLG_ENTER(flgid); 00449 CHECK_TSKCTX_UNL(); 00450 CHECK_FLGID(flgid); 00451 p_flgcb = get_flgcb(flgid); 00452 00453 t_lock_cpu(); 00454 dspreq = init_wait_queue(&(p_flgcb->wait_queue)); 00455 p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn; 00456 if (dspreq) { 00457 dispatch(); 00458 } 00459 ercd = E_OK; 00460 t_unlock_cpu(); 00461 00462 error_exit: 00463 LOG_INI_FLG_LEAVE(ercd); 00464 return(ercd); 00465 }
void initialize_eventflag | ( | void | ) |
eventflag.c の 137 行で定義されています。
参照先 flgcb_table, flginib_table, eventflag_control_block::flgptn, eventflag_initialization_block::iflgptn, eventflag_control_block::p_flginib, queue_initialize(), tnum_flg, と eventflag_control_block::wait_queue.
00138 { 00139 uint_t i; 00140 FLGCB *p_flgcb; 00141 00142 for (p_flgcb = flgcb_table, i = 0; i < tnum_flg; p_flgcb++, i++) { 00143 queue_initialize(&(p_flgcb->wait_queue)); 00144 p_flgcb->p_flginib = &(flginib_table[i]); 00145 p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn; 00146 } 00147 }
eventflag.c の 229 行で定義されています。
参照先 check_flg_cond(), CHECK_FLGID, CHECK_INTCTX_UNL, E_OK, eventflag_initialization_block::flgatr, eventflag_waiting_information::flgptn, eventflag_control_block::flgptn, get_flgcb, i_lock_cpu, i_unlock_cpu, LOG_ISET_FLG_ENTER, LOG_ISET_FLG_LEAVE, eventflag_control_block::p_flginib, queue::p_next, task_control_block::p_winfo, queue_delete(), reqflg, TA_CLR, task_control_block::task_queue, eventflag_waiting_information::waiptn, wait_complete, eventflag_control_block::wait_queue, と eventflag_waiting_information::wfmode.
00230 { 00231 FLGCB *p_flgcb; 00232 QUEUE *p_queue; 00233 TCB *p_tcb; 00234 WINFO_FLG *p_winfo_flg; 00235 ER ercd; 00236 00237 LOG_ISET_FLG_ENTER(flgid, setptn); 00238 CHECK_INTCTX_UNL(); 00239 CHECK_FLGID(flgid); 00240 p_flgcb = get_flgcb(flgid); 00241 00242 i_lock_cpu(); 00243 p_flgcb->flgptn |= setptn; 00244 p_queue = p_flgcb->wait_queue.p_next; 00245 while (p_queue != &(p_flgcb->wait_queue)) { 00246 p_tcb = (TCB *) p_queue; 00247 p_queue = p_queue->p_next; 00248 p_winfo_flg = (WINFO_FLG *)(p_tcb->p_winfo); 00249 if (check_flg_cond(p_flgcb, p_winfo_flg->waiptn, 00250 p_winfo_flg->wfmode, &(p_winfo_flg->flgptn))) { 00251 queue_delete(&(p_tcb->task_queue)); 00252 if (wait_complete(p_tcb)) { 00253 reqflg = true; 00254 } 00255 if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) { 00256 break; 00257 } 00258 } 00259 } 00260 ercd = E_OK; 00261 i_unlock_cpu(); 00262 00263 error_exit: 00264 LOG_ISET_FLG_LEAVE(ercd); 00265 return(ercd); 00266 }
eventflag.c の 351 行で定義されています。
参照先 check_flg_cond(), CHECK_FLGID, CHECK_PAR, CHECK_TSKCTX_UNL, E_ILUSE, E_OK, E_TMOUT, eventflag_initialization_block::flgatr, get_flgcb, LOG_POL_FLG_ENTER, LOG_POL_FLG_LEAVE, eventflag_control_block::p_flginib, queue_empty(), t_lock_cpu, t_unlock_cpu, TA_WMUL, TWF_ANDW, TWF_ORW, と eventflag_control_block::wait_queue.
00352 { 00353 FLGCB *p_flgcb; 00354 ER ercd; 00355 00356 LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn); 00357 CHECK_TSKCTX_UNL(); 00358 CHECK_FLGID(flgid); 00359 CHECK_PAR(waiptn != 0U); 00360 CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW); 00361 p_flgcb = get_flgcb(flgid); 00362 00363 t_lock_cpu(); 00364 if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U 00365 && !queue_empty(&(p_flgcb->wait_queue))) { 00366 ercd = E_ILUSE; 00367 } 00368 else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) { 00369 ercd = E_OK; 00370 } 00371 else { 00372 ercd = E_TMOUT; 00373 } 00374 t_unlock_cpu(); 00375 00376 error_exit: 00377 LOG_POL_FLG_LEAVE(ercd, *p_flgptn); 00378 return(ercd); 00379 }
eventflag.c の 475 行で定義されています。
参照先 CHECK_FLGID, CHECK_TSKCTX_UNL, E_OK, eventflag_control_block::flgptn, t_rflg::flgptn, get_flgcb, LOG_REF_FLG_ENTER, LOG_REF_FLG_LEAVE, t_lock_cpu, t_unlock_cpu, eventflag_control_block::wait_queue, wait_tskid(), と t_rflg::wtskid.
00476 { 00477 FLGCB *p_flgcb; 00478 ER ercd; 00479 00480 LOG_REF_FLG_ENTER(flgid, pk_rflg); 00481 CHECK_TSKCTX_UNL(); 00482 CHECK_FLGID(flgid); 00483 p_flgcb = get_flgcb(flgid); 00484 00485 t_lock_cpu(); 00486 pk_rflg->wtskid = wait_tskid(&(p_flgcb->wait_queue)); 00487 pk_rflg->flgptn = p_flgcb->flgptn; 00488 ercd = E_OK; 00489 t_unlock_cpu(); 00490 00491 error_exit: 00492 LOG_REF_FLG_LEAVE(ercd, pk_rflg); 00493 return(ercd); 00494 }
eventflag.c の 178 行で定義されています。
参照先 check_flg_cond(), CHECK_FLGID, CHECK_TSKCTX_UNL, dispatch, E_OK, eventflag_initialization_block::flgatr, eventflag_waiting_information::flgptn, eventflag_control_block::flgptn, get_flgcb, LOG_SET_FLG_ENTER, LOG_SET_FLG_LEAVE, eventflag_control_block::p_flginib, queue::p_next, task_control_block::p_winfo, queue_delete(), t_lock_cpu, t_unlock_cpu, TA_CLR, task_control_block::task_queue, eventflag_waiting_information::waiptn, wait_complete, eventflag_control_block::wait_queue, と eventflag_waiting_information::wfmode.
00179 { 00180 FLGCB *p_flgcb; 00181 QUEUE *p_queue; 00182 TCB *p_tcb; 00183 WINFO_FLG *p_winfo_flg; 00184 bool_t dspreq = false; 00185 ER ercd; 00186 00187 LOG_SET_FLG_ENTER(flgid, setptn); 00188 CHECK_TSKCTX_UNL(); 00189 CHECK_FLGID(flgid); 00190 p_flgcb = get_flgcb(flgid); 00191 00192 t_lock_cpu(); 00193 p_flgcb->flgptn |= setptn; 00194 p_queue = p_flgcb->wait_queue.p_next; 00195 while (p_queue != &(p_flgcb->wait_queue)) { 00196 p_tcb = (TCB *) p_queue; 00197 p_queue = p_queue->p_next; 00198 p_winfo_flg = (WINFO_FLG *)(p_tcb->p_winfo); 00199 if (check_flg_cond(p_flgcb, p_winfo_flg->waiptn, 00200 p_winfo_flg->wfmode, &(p_winfo_flg->flgptn))) { 00201 queue_delete(&(p_tcb->task_queue)); 00202 if (wait_complete(p_tcb)) { 00203 dspreq = true; 00204 } 00205 if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) { 00206 break; 00207 } 00208 } 00209 } 00210 if (dspreq) { 00211 dispatch(); 00212 } 00213 ercd = E_OK; 00214 t_unlock_cpu(); 00215 00216 error_exit: 00217 LOG_SET_FLG_LEAVE(ercd); 00218 return(ercd); 00219 }
eventflag.c の 389 行で定義されています。
参照先 CHECK_DISPATCH, check_flg_cond(), CHECK_FLGID, CHECK_PAR, CHECK_TMOUT, dispatch, E_ILUSE, E_OK, E_TMOUT, eventflag_initialization_block::flgatr, get_flgcb, LOG_TWAI_FLG_ENTER, LOG_TWAI_FLG_LEAVE, eventflag_control_block::p_flginib, p_runtsk, queue_empty(), t_lock_cpu, t_unlock_cpu, TA_WMUL, TMO_POL, TS_WAIT_FLG, TS_WAITING, TWF_ANDW, TWF_ORW, eventflag_waiting_information::waiptn, eventflag_control_block::wait_queue, waiting_information::wercd, eventflag_waiting_information::wfmode, wait_object_waiting_information::winfo, と wobj_make_wait_tmout.
00390 { 00391 FLGCB *p_flgcb; 00392 WINFO_FLG winfo_flg; 00393 TMEVTB tmevtb; 00394 ER ercd; 00395 00396 LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout); 00397 CHECK_DISPATCH(); 00398 CHECK_FLGID(flgid); 00399 CHECK_PAR(waiptn != 0U); 00400 CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW); 00401 CHECK_TMOUT(tmout); 00402 p_flgcb = get_flgcb(flgid); 00403 00404 t_lock_cpu(); 00405 if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U 00406 && !queue_empty(&(p_flgcb->wait_queue))) { 00407 ercd = E_ILUSE; 00408 } 00409 else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) { 00410 ercd = E_OK; 00411 } 00412 else if (tmout == TMO_POL) { 00413 ercd = E_TMOUT; 00414 } 00415 else { 00416 winfo_flg.waiptn = waiptn; 00417 winfo_flg.wfmode = wfmode; 00418 p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG); 00419 wobj_make_wait_tmout((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg, 00420 &tmevtb, tmout); 00421 dispatch(); 00422 ercd = winfo_flg.winfo.wercd; 00423 if (ercd == E_OK) { 00424 *p_flgptn = winfo_flg.flgptn; 00425 } 00426 } 00427 t_unlock_cpu(); 00428 00429 error_exit: 00430 LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn); 00431 return(ercd); 00432 }
eventflag.c の 304 行で定義されています。
参照先 CHECK_DISPATCH, check_flg_cond(), CHECK_FLGID, CHECK_PAR, dispatch, E_ILUSE, E_OK, eventflag_initialization_block::flgatr, get_flgcb, LOG_WAI_FLG_ENTER, LOG_WAI_FLG_LEAVE, eventflag_control_block::p_flginib, p_runtsk, queue_empty(), t_lock_cpu, t_unlock_cpu, TA_WMUL, TS_WAIT_FLG, TS_WAITING, TWF_ANDW, TWF_ORW, eventflag_waiting_information::waiptn, eventflag_control_block::wait_queue, waiting_information::wercd, eventflag_waiting_information::wfmode, wait_object_waiting_information::winfo, と wobj_make_wait.
00305 { 00306 FLGCB *p_flgcb; 00307 WINFO_FLG winfo_flg; 00308 ER ercd; 00309 00310 LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn); 00311 CHECK_DISPATCH(); 00312 CHECK_FLGID(flgid); 00313 CHECK_PAR(waiptn != 0U); 00314 CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW); 00315 p_flgcb = get_flgcb(flgid); 00316 00317 t_lock_cpu(); 00318 if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U 00319 && !queue_empty(&(p_flgcb->wait_queue))) { 00320 ercd = E_ILUSE; 00321 } 00322 else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) { 00323 ercd = E_OK; 00324 } 00325 else { 00326 winfo_flg.waiptn = waiptn; 00327 winfo_flg.wfmode = wfmode; 00328 p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG); 00329 wobj_make_wait((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg); 00330 dispatch(); 00331 ercd = winfo_flg.winfo.wercd; 00332 if (ercd == E_OK) { 00333 *p_flgptn = winfo_flg.flgptn; 00334 } 00335 } 00336 t_unlock_cpu(); 00337 00338 error_exit: 00339 LOG_WAI_FLG_LEAVE(ercd, *p_flgptn); 00340 return(ercd); 00341 }
Copyright © 2008 by Kijineko Inc.