eventflag.c

#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.c129 行で定義されています。

参照元 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.c128 行で定義されています。

#define LOG_CLR_FLG_ENTER ( flgid,
clrptn   ) 

eventflag.c73 行で定義されています。

参照元 clr_flg().

#define LOG_CLR_FLG_LEAVE ( ercd   ) 

eventflag.c77 行で定義されています。

参照元 clr_flg().

#define LOG_INI_FLG_ENTER ( flgid   ) 

eventflag.c105 行で定義されています。

参照元 ini_flg().

#define LOG_INI_FLG_LEAVE ( ercd   ) 

eventflag.c109 行で定義されています。

参照元 ini_flg().

#define LOG_ISET_FLG_ENTER ( flgid,
setptn   ) 

eventflag.c65 行で定義されています。

参照元 iset_flg().

#define LOG_ISET_FLG_LEAVE ( ercd   ) 

eventflag.c69 行で定義されています。

参照元 iset_flg().

#define LOG_POL_FLG_ENTER ( flgid,
waiptn,
wfmode,
p_flgptn   ) 

eventflag.c89 行で定義されています。

参照元 pol_flg().

#define LOG_POL_FLG_LEAVE ( ercd,
flgptn   ) 

eventflag.c93 行で定義されています。

参照元 pol_flg().

#define LOG_REF_FLG_ENTER ( flgid,
pk_rflg   ) 

eventflag.c113 行で定義されています。

参照元 ref_flg().

#define LOG_REF_FLG_LEAVE ( ercd,
pk_rflg   ) 

eventflag.c117 行で定義されています。

参照元 ref_flg().

#define LOG_SET_FLG_ENTER ( flgid,
setptn   ) 

eventflag.c57 行で定義されています。

参照元 set_flg().

#define LOG_SET_FLG_LEAVE ( ercd   ) 

eventflag.c61 行で定義されています。

参照元 set_flg().

#define LOG_TWAI_FLG_ENTER ( flgid,
waiptn,
wfmode,
p_flgptn,
tmout   ) 

eventflag.c97 行で定義されています。

参照元 twai_flg().

#define LOG_TWAI_FLG_LEAVE ( ercd,
flgptn   ) 

eventflag.c101 行で定義されています。

参照元 twai_flg().

#define LOG_WAI_FLG_ENTER ( flgid,
waiptn,
wfmode,
p_flgptn   ) 

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

参照元 wai_flg().

#define LOG_WAI_FLG_LEAVE ( ercd,
flgptn   ) 

eventflag.c85 行で定義されています。

参照元 wai_flg().

#define tnum_flg   ((uint_t)(tmax_flgid - TMIN_FLGID + 1))

eventflag.c123 行で定義されています。

参照元 initialize_eventflag().


関数

bool_t check_flg_cond ( FLGCB p_flgcb,
FLGPTN  waiptn,
MODE  wfmode,
FLGPTN p_flgptn 
)

eventflag.c157 行で定義されています。

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

ER clr_flg ( ID  flgid,
FLGPTN  clrptn 
)

eventflag.c276 行で定義されています。

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

ER ini_flg ( ID  flgid  ) 

eventflag.c442 行で定義されています。

参照先 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.c137 行で定義されています。

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

ER iset_flg ( ID  flgid,
FLGPTN  setptn 
)

eventflag.c229 行で定義されています。

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

ER pol_flg ( ID  flgid,
FLGPTN  waiptn,
MODE  wfmode,
FLGPTN p_flgptn 
)

eventflag.c351 行で定義されています。

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

ER ref_flg ( ID  flgid,
T_RFLG pk_rflg 
)

eventflag.c475 行で定義されています。

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

ER set_flg ( ID  flgid,
FLGPTN  setptn 
)

eventflag.c178 行で定義されています。

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

ER twai_flg ( ID  flgid,
FLGPTN  waiptn,
MODE  wfmode,
FLGPTN p_flgptn,
TMO  tmout 
)

eventflag.c389 行で定義されています。

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

ER wai_flg ( ID  flgid,
FLGPTN  waiptn,
MODE  wfmode,
FLGPTN p_flgptn 
)

eventflag.c304 行で定義されています。

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

ホームページ制作