ER clr_flg(ID flgid, FLGPTN clrptn) { FLGCB *p_flgcb; ER ercd; LOG_CLR_FLG_ENTER(flgid, clrptn); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else { p_flgcb->flgptn &= clrptn; ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_CLR_FLG_LEAVE(ercd); return(ercd); }
ER ref_flg(ID flgid, T_RFLG *pk_rflg) { FLGCB *p_flgcb; ER ercd; LOG_REF_FLG_ENTER(flgid, pk_rflg); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else { pk_rflg->wtskid = wait_tskid(&(p_flgcb->wait_queue)); pk_rflg->flgptn = p_flgcb->flgptn; ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_REF_FLG_LEAVE(ercd, pk_rflg); return(ercd); }
ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) { FLGCB *p_flgcb; WINFO_FLG *p_winfo_flg; ER ercd; PCB *my_p_pcb; TCB *p_runtsk; LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0U); CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW); CHECK_TMOUT(tmout); p_flgcb = get_flgcb(flgid); t_lock_cpu(); my_p_pcb = get_my_p_pcb(); T_CHECK_DISPATCH(my_p_pcb); retry: t_acquire_obj_lock(&GET_OBJLOCK(p_flgcb)); if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U && !queue_empty(&(p_flgcb->wait_queue))) { release_obj_lock(&GET_OBJLOCK(p_flgcb)); ercd = E_ILUSE; } else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) { release_obj_lock(&GET_OBJLOCK(p_flgcb)); ercd = E_OK; } else if (tmout == TMO_POL) { release_obj_lock(&GET_OBJLOCK(p_flgcb)); ercd = E_TMOUT; } else { if ((my_p_pcb = t_acquire_nested_tsk_lock_self(&GET_OBJLOCK(p_flgcb))) == NULL){ goto retry; } p_runtsk = my_p_pcb->p_runtsk; p_winfo_flg = (WINFO_FLG *)(&(p_runtsk->winfo_obj)); p_winfo_flg->waiptn = waiptn; p_winfo_flg->wfmode = wfmode; p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG); wobj_make_wait_tmout((WOBJCB *) p_flgcb, tmout, p_runtsk); release_nested_tsk_lock(my_p_pcb); release_obj_lock(&GET_OBJLOCK(p_flgcb)); dispatch(); ercd = p_runtsk->wercd; if (ercd == E_OK) { *p_flgptn = p_winfo_flg->flgptn; } } t_unlock_cpu(); error_exit: LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn); return(ercd); }
ER ini_flg(ID flgid) { FLGCB *p_flgcb; ER ercd; bool_t dspreq; LOG_INI_FLG_ENTER(flgid); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); t_lock_cpu(); t_acquire_obj_lock(&GET_OBJLOCK(p_flgcb)); dspreq = init_wait_queue(&(p_flgcb->wait_queue)); p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn; ercd = E_OK; release_obj_lock(&GET_OBJLOCK(p_flgcb)); if (dspreq) { dispatch(); } t_unlock_cpu(); error_exit: LOG_INI_FLG_LEAVE(ercd); return(ercd); }
SYSCALL ER pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn) { FLGCB *flgcb; ER ercd; LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0); CHECK_PAR((wfmode & ~TWF_ORW) == 0); flgcb = get_flgcb(flgid); t_lock_cpu(); if (!(queue_empty(&(flgcb->wait_queue)))) { ercd = E_ILUSE; } else if (eventflag_cond(flgcb, waiptn, wfmode, p_flgptn)) { ercd = E_OK; } else { ercd = E_TMOUT; } t_unlock_cpu(); exit: LOG_POL_FLG_LEAVE(ercd, *p_flgptn); return(ercd); }
/* * Refer event flag wait queue */ SYSCALL INT td_flg_que_impl( ID flgid, ID list[], INT nent ) { FLGCB *flgcb; QUEUE *q; ER ercd = E_OK; CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); BEGIN_DISABLE_INTERRUPT; if ( flgcb->flgid == 0 ) { ercd = E_NOEXS; } else { INT n = 0; for ( q = flgcb->wait_queue.next; q != &flgcb->wait_queue; q = q->next ) { if ( n++ < nent ) { *list++ = ((TCB*)q)->tskid; } } ercd = n; } END_DISABLE_INTERRUPT; return ercd; }
SYSCALL ER iset_flg(ID flgid, FLGPTN setptn) { FLGCB *flgcb; TCB *tcb; WINFO_FLG *winfo; ER ercd; LOG_ISET_FLG_ENTER(flgid, setptn); CHECK_INTCTX_UNL(); CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); i_lock_cpu(); flgcb->flgptn |= setptn; if (!(queue_empty(&(flgcb->wait_queue)))) { tcb = (TCB *)(flgcb->wait_queue.next); winfo = (WINFO_FLG *)(tcb->winfo); if (eventflag_cond(flgcb, winfo->waiptn, winfo->wfmode, &(winfo->flgptn))) { queue_delete(&(tcb->task_queue)); if (wait_complete(tcb)) { reqflg = TRUE; } } } ercd = E_OK; i_unlock_cpu(); exit: LOG_ISET_FLG_LEAVE(ercd); return(ercd); }
ER pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn) { FLGCB *p_flgcb; ER ercd; LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0U); CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U && !queue_empty(&(p_flgcb->wait_queue))) { ercd = E_ILUSE; } else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) { ercd = E_OK; } else { ercd = E_TMOUT; } t_unlock_cpu(); error_exit: LOG_POL_FLG_LEAVE(ercd, *p_flgptn); return(ercd); }
ER ini_flg(ID flgid) { FLGCB *p_flgcb; bool_t dspreq; ER ercd; LOG_INI_FLG_ENTER(flgid); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else { dspreq = init_wait_queue(&(p_flgcb->wait_queue)); p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn; if (dspreq) { dispatch(); } ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_INI_FLG_LEAVE(ercd); return(ercd); }
ER sac_flg(ID flgid, const ACVCT *p_acvct) { FLGCB *p_flgcb; FLGINIB *p_flginib; ER ercd; LOG_SAC_FLG_ENTER(flgid, p_acvct); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); CHECK_MACV_READ(p_acvct, ACVCT); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_flgcb->p_flginib->acvct.acptn3)) { ercd = E_OACV; } else if (FLGID(p_flgcb) > tmax_sflgid) { p_flginib = (FLGINIB *)(p_flgcb->p_flginib); p_flginib->acvct = *p_acvct; ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_SAC_FLG_LEAVE(ercd); return(ercd); }
ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) { FLGCB *p_flgcb; WINFO_FLG winfo_flg; TMEVTB tmevtb; ER ercd; LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout); CHECK_DISPATCH(); CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0U); CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW); CHECK_MACV_WRITE(p_flgptn, FLGPTN); CHECK_TMOUT(tmout); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_flgcb->p_flginib->acvct.acptn2)) { ercd = E_OACV; } else if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U && !queue_empty(&(p_flgcb->wait_queue))) { ercd = E_ILUSE; } else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) { ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else if (p_runtsk->waifbd) { ercd = E_RLWAI; } else { winfo_flg.waiptn = waiptn; winfo_flg.wfmode = wfmode; p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG); wobj_make_wait_tmout((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg, &tmevtb, tmout); dispatch(); ercd = winfo_flg.winfo.wercd; if (ercd == E_OK) { *p_flgptn = winfo_flg.flgptn; } } t_unlock_cpu(); error_exit: LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn); return(ercd); }
/* * Event flag set */ SYSCALL ER tk_set_flg_impl( ID flgid, UINT setptn ) { FLGCB *flgcb; TCB *tcb; QUEUE *queue; UINT wfmode, waiptn; ER ercd = E_OK; CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); BEGIN_CRITICAL_SECTION; if ( flgcb->flgid == 0 ) { ercd = E_NOEXS; goto error_exit; } /* Set event flag */ flgcb->flgptn |= setptn; /* Search task which should be released */ queue = flgcb->wait_queue.next; while ( queue != &flgcb->wait_queue ) { tcb = (TCB*)queue; queue = queue->next; /* Meet condition for release wait? */ waiptn = tcb->winfo.flg.waiptn; wfmode = tcb->winfo.flg.wfmode; if ( knl_eventflag_cond(flgcb, waiptn, wfmode) ) { /* Release wait */ *tcb->winfo.flg.p_flgptn = flgcb->flgptn; knl_wait_release_ok(tcb); /* Clear event flag */ if ( (wfmode & TWF_BITCLR) != 0 ) { if ( (flgcb->flgptn &= ~waiptn) == 0 ) { break; } } if ( (wfmode & TWF_CLR) != 0 ) { flgcb->flgptn = 0; break; } } } error_exit: END_CRITICAL_SECTION; return ercd; }
ER set_flg(ID flgid, FLGPTN setptn) { FLGCB *p_flgcb; QUEUE *p_queue; TCB *p_tcb; WINFO_FLG *p_winfo_flg; ER ercd; bool_t dspreq = false; PCB *p_pcb; LOG_SET_FLG_ENTER(flgid, setptn); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); t_lock_cpu(); t_acquire_obj_lock(&GET_OBJLOCK(p_flgcb)); p_flgcb->flgptn |= setptn; p_queue = p_flgcb->wait_queue.p_next; while (p_queue != &(p_flgcb->wait_queue)) { p_tcb = (TCB *) p_queue; p_queue = p_queue->p_next; /* フラグのセットを非破壊コードにできないため,リトライしない */ p_pcb = acquire_nested_tsk_lock_without_preemption(p_tcb); p_winfo_flg = (WINFO_FLG *)(&(p_tcb->winfo_obj)); if (check_flg_cond(p_flgcb, p_winfo_flg->waiptn, p_winfo_flg->wfmode, &(p_winfo_flg->flgptn))) { queue_delete(&(p_tcb->task_queue)); if (wait_complete(p_tcb)) { if (dispatch_request(p_pcb)) { dspreq = true; } } if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) { release_nested_tsk_lock(p_pcb); break; } } release_nested_tsk_lock(p_pcb); } ercd = E_OK; release_obj_lock(&GET_OBJLOCK(p_flgcb)); if (dspreq) { dispatch(); } t_unlock_cpu(); error_exit: LOG_SET_FLG_LEAVE(ercd); return(ercd); }
ER set_flg(ID flgid, FLGPTN setptn) { FLGCB *p_flgcb; QUEUE *p_queue; TCB *p_tcb; WINFO_FLG *p_winfo_flg; bool_t dspreq = false; ER ercd; LOG_SET_FLG_ENTER(flgid, setptn); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_flgcb->p_flginib->acvct.acptn1)) { ercd = E_OACV; } else { p_flgcb->flgptn |= setptn; p_queue = p_flgcb->wait_queue.p_next; while (p_queue != &(p_flgcb->wait_queue)) { p_tcb = (TCB *) p_queue; p_queue = p_queue->p_next; p_winfo_flg = (WINFO_FLG *)(p_tcb->p_winfo); if (check_flg_cond(p_flgcb, p_winfo_flg->waiptn, p_winfo_flg->wfmode, &(p_winfo_flg->flgptn))) { queue_delete(&(p_tcb->task_queue)); if (wait_complete(p_tcb)) { dspreq = true; } if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) { break; } } } if (dspreq) { dispatch(); } ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_SET_FLG_LEAVE(ercd); return(ercd); }
/* * Event flag wait */ SYSCALL ER tk_wai_flg_impl( ID flgid, UINT waiptn, UINT wfmode, UINT *p_flgptn, TMO tmout ) { FLGCB *flgcb; ER ercd = E_OK; CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0); CHECK_PAR((wfmode & ~(TWF_ORW|TWF_CLR|TWF_BITCLR)) == 0); CHECK_TMOUT(tmout); CHECK_DISPATCH(); flgcb = get_flgcb(flgid); BEGIN_CRITICAL_SECTION; if ( flgcb->flgid == 0 ) { ercd = E_NOEXS; goto error_exit; } if ( (flgcb->flgatr & TA_WMUL) == 0 && !isQueEmpty(&flgcb->wait_queue) ) { /* Disable multiple tasks wait */ ercd = E_OBJ; goto error_exit; } /* Meet condition for release wait? */ if ( knl_eventflag_cond(flgcb, waiptn, wfmode) ) { *p_flgptn = flgcb->flgptn; /* Clear event flag */ if ( (wfmode & TWF_BITCLR) != 0 ) { flgcb->flgptn &= ~waiptn; } if ( (wfmode & TWF_CLR) != 0 ) { flgcb->flgptn = 0; } } else { /* Ready for wait */ knl_ctxtsk->wspec = ( (flgcb->flgatr & TA_TPRI) != 0 )? &knl_wspec_flg_tpri: &knl_wspec_flg_tfifo; knl_ctxtsk->wercd = &ercd; knl_ctxtsk->winfo.flg.waiptn = waiptn; knl_ctxtsk->winfo.flg.wfmode = wfmode; knl_ctxtsk->winfo.flg.p_flgptn = p_flgptn; knl_gcb_make_wait((GCB*)flgcb, tmout); } error_exit: END_CRITICAL_SECTION; return ercd; }
ER iset_flg(ID flgid, FLGPTN setptn) { FLGCB *p_flgcb; QUEUE *p_queue; TCB *p_tcb; WINFO_FLG *p_winfo_flg; ER ercd; LOG_ISET_FLG_ENTER(flgid, setptn); CHECK_INTCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); i_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else { p_flgcb->flgptn |= setptn; p_queue = p_flgcb->wait_queue.p_next; while (p_queue != &(p_flgcb->wait_queue)) { p_tcb = (TCB *) p_queue; p_queue = p_queue->p_next; p_winfo_flg = (WINFO_FLG *)(p_tcb->p_winfo); if (check_flg_cond(p_flgcb, p_winfo_flg->waiptn, p_winfo_flg->wfmode, &(p_winfo_flg->flgptn))) { queue_delete(&(p_tcb->task_queue)); if (wait_complete(p_tcb)) { reqflg = true; } if ((p_flgcb->p_flginib->flgatr & TA_CLR) != 0U) { break; } } } ercd = E_OK; } i_unlock_cpu(); error_exit: LOG_ISET_FLG_LEAVE(ercd); return(ercd); }
SYSCALL ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) { FLGCB *flgcb; WINFO_FLG winfo; TMEVTB tmevtb; ER ercd; LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout); CHECK_DISPATCH(); CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0); CHECK_PAR((wfmode & ~TWF_ORW) == 0); CHECK_TMOUT(tmout); flgcb = get_flgcb(flgid); t_lock_cpu(); if (!(queue_empty(&(flgcb->wait_queue)))) { ercd = E_ILUSE; } else if (eventflag_cond(flgcb, waiptn, wfmode, p_flgptn)) { ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { winfo.waiptn = waiptn; winfo.wfmode = wfmode; wobj_make_wait_tmout((WOBJCB *) flgcb, (WINFO_WOBJ *) &winfo, &tmevtb, tmout); dispatch(); ercd = winfo.winfo.wercd; if (ercd == E_OK) { *p_flgptn = winfo.flgptn; } } t_unlock_cpu(); exit: LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn); return(ercd); }
/* * Clear event flag */ SYSCALL ER tk_clr_flg_impl( ID flgid, UINT clrptn ) { FLGCB *flgcb; ER ercd = E_OK; CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); BEGIN_CRITICAL_SECTION; if ( flgcb->flgid == 0 ) { ercd = E_NOEXS; } else { flgcb->flgptn &= clrptn; } END_CRITICAL_SECTION; return ercd; }
ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn) { FLGCB *p_flgcb; WINFO_FLG winfo_flg; ER ercd; LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn); CHECK_DISPATCH(); CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0U); CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U && !queue_empty(&(p_flgcb->wait_queue))) { ercd = E_ILUSE; } else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) { ercd = E_OK; } else { winfo_flg.waiptn = waiptn; winfo_flg.wfmode = wfmode; p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG); wobj_make_wait((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg); dispatch(); ercd = winfo_flg.winfo.wercd; if (ercd == E_OK) { *p_flgptn = winfo_flg.flgptn; } } t_unlock_cpu(); error_exit: LOG_WAI_FLG_LEAVE(ercd, *p_flgptn); return(ercd); }
SYSCALL ER clr_flg(ID flgid, FLGPTN clrptn) { FLGCB *flgcb; ER ercd; LOG_CLR_FLG_ENTER(flgid, clrptn); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); t_lock_cpu(); flgcb->flgptn &= clrptn; ercd = E_OK; t_unlock_cpu(); exit: LOG_CLR_FLG_LEAVE(ercd); return(ercd); }
/* * Check event flag state */ SYSCALL ER tk_ref_flg_impl( ID flgid, T_RFLG *pk_rflg ) { FLGCB *flgcb; ER ercd = E_OK; CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); BEGIN_CRITICAL_SECTION; if ( flgcb->flgid == 0 ) { ercd = E_NOEXS; } else { pk_rflg->exinf = flgcb->exinf; pk_rflg->wtsk = knl_wait_tskid(&flgcb->wait_queue); pk_rflg->flgptn = flgcb->flgptn; } END_CRITICAL_SECTION; return ercd; }
/* * Refer event flag state */ SYSCALL ER td_ref_flg_impl( ID flgid, TD_RFLG *pk_rflg ) { FLGCB *flgcb; ER ercd = E_OK; CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); BEGIN_DISABLE_INTERRUPT; if ( flgcb->flgid == 0 ) { ercd = E_NOEXS; } else { pk_rflg->exinf = flgcb->exinf; pk_rflg->wtsk = knl_wait_tskid(&flgcb->wait_queue); pk_rflg->flgptn = flgcb->flgptn; } END_DISABLE_INTERRUPT; return ercd; }
ER clr_flg(ID flgid, FLGPTN clrptn) { FLGCB *p_flgcb; ER ercd; LOG_CLR_FLG_ENTER(flgid, clrptn); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); t_lock_cpu(); t_acquire_obj_lock(&GET_OBJLOCK(p_flgcb)); p_flgcb->flgptn &= clrptn; ercd = E_OK; release_obj_lock(&GET_OBJLOCK(p_flgcb)); t_unlock_cpu(); error_exit: LOG_CLR_FLG_LEAVE(ercd); return(ercd); }
ER del_flg(ID flgid) { FLGCB *p_flgcb; FLGINIB *p_flginib; bool_t dspreq; ER ercd; LOG_DEL_FLG_ENTER(flgid); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_flgcb->p_flginib->acvct.acptn3)) { ercd = E_OACV; } else if (FLGID(p_flgcb) > tmax_sflgid) { dspreq = init_wait_queue(&(p_flgcb->wait_queue)); p_flginib = (FLGINIB *)(p_flgcb->p_flginib); p_flginib->flgatr = TA_NOEXS; queue_insert_prev(&free_flgcb, &(p_flgcb->wait_queue)); if (dspreq) { dispatch(); } ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_DEL_FLG_LEAVE(ercd); return(ercd); }
ER ref_flg(ID flgid, T_RFLG *pk_rflg) { FLGCB *p_flgcb; ER ercd; LOG_REF_FLG_ENTER(flgid, pk_rflg); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); t_lock_cpu(); t_acquire_obj_lock(&GET_OBJLOCK(p_flgcb)); pk_rflg->wtskid = wait_tskid(&(p_flgcb->wait_queue)); pk_rflg->flgptn = p_flgcb->flgptn; ercd = E_OK; release_obj_lock(&GET_OBJLOCK(p_flgcb)); t_unlock_cpu(); error_exit: LOG_REF_FLG_LEAVE(ercd, pk_rflg); return(ercd); }
/* * Delete event flag */ SYSCALL ER tk_del_flg_impl( ID flgid ) { FLGCB *flgcb; ER ercd = E_OK; CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); BEGIN_CRITICAL_SECTION; if ( flgcb->flgid == 0 ) { ercd = E_NOEXS; } else { /* Release wait state of task (E_DLT) */ knl_wait_delete(&flgcb->wait_queue); /* Return to FreeQue */ QueInsert(&flgcb->wait_queue, &knl_free_flgcb); flgcb->flgid = 0; } END_CRITICAL_SECTION; return ercd; }
/* * Get object name from control block */ EXPORT ER knl_eventflag_getname(ID id, UB **name) { FLGCB *flgcb; ER ercd = E_OK; CHECK_FLGID(id); BEGIN_DISABLE_INTERRUPT; flgcb = get_flgcb(id); if ( flgcb->flgid == 0 ) { ercd = E_NOEXS; goto error_exit; } if ( (flgcb->flgatr & TA_DSNAME) == 0 ) { ercd = E_OBJ; goto error_exit; } *name = flgcb->name; error_exit: END_DISABLE_INTERRUPT; return ercd; }