ER tloc_mtx(ID mtxid, TMO tmout) { MTXCB *p_mtxcb; WINFO_MTX winfo_mtx; TMEVTB tmevtb; ER ercd; LOG_TLOC_MTX_ENTER(mtxid, tmout); CHECK_DISPATCH(); CHECK_ID(VALID_MTXID(mtxid)); CHECK_PAR(VALID_TMOUT(tmout)); p_mtxcb = get_mtxcb(mtxid); lock_cpu_dsp(); if (p_mtxcb->p_mtxinib->mtxatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mtxcb->p_mtxinib->acvct.acptn1)) { ercd = E_OACV; } else if (MTX_CEILING(p_mtxcb) && p_mtxcb->p_mtxinib->ceilpri < p_runtsk->p_dominib->minpriority && VIOLATE_ACPTN(p_runtsk->p_dominib->acvct.acptn2)) { ercd = E_OACV; /*[NGKI5124]*/ } else if (p_runtsk->raster) { ercd = E_RASTER; } else if (MTX_CEILING(p_mtxcb) && p_runtsk->bpriority < p_mtxcb->p_mtxinib->ceilpri) { ercd = E_ILUSE; } else if (p_mtxcb->p_loctsk == NULL) { mutex_acquire(p_runtsk, p_mtxcb); /* * 優先度上限ミューテックスをロックした場合,p_runtskの優先度 * が上がる可能性があるが,ディスパッチが必要になることはない. */ assert(p_runtsk == p_schedtsk); ercd = E_OK; } else if (p_mtxcb->p_loctsk == p_runtsk) { ercd = E_OBJ; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { wobj_make_wait_tmout((WOBJCB *) p_mtxcb, TS_WAITING_MTX, (WINFO_WOBJ *) &winfo_mtx, &tmevtb, tmout); dispatch(); ercd = winfo_mtx.winfo.wercd; } unlock_cpu_dsp(); error_exit: LOG_TLOC_MTX_LEAVE(ercd); return(ercd); }
ER ploc_mtx(ID mtxid) { MTXCB *p_mtxcb; ER ercd; LOG_PLOC_MTX_ENTER(mtxid); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_MTXID(mtxid)); p_mtxcb = get_mtxcb(mtxid); lock_cpu(); if (p_mtxcb->p_mtxinib->mtxatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mtxcb->p_mtxinib->acvct.acptn1)) { ercd = E_OACV; } else if (MTX_CEILING(p_mtxcb) && p_mtxcb->p_mtxinib->ceilpri < p_runtsk->p_dominib->minpriority && VIOLATE_ACPTN(p_runtsk->p_dominib->acvct.acptn2)) { ercd = E_OACV; /*[NGKI5124]*/ } else if (MTX_CEILING(p_mtxcb) && p_runtsk->bpriority < p_mtxcb->p_mtxinib->ceilpri) { ercd = E_ILUSE; } else if (p_mtxcb->p_loctsk == NULL) { mutex_acquire(p_runtsk, p_mtxcb); /* * 優先度上限ミューテックスをロックした場合,p_runtskの優先度 * が上がる可能性があるが,ディスパッチが必要になることはない. */ assert(p_runtsk == p_schedtsk); ercd = E_OK; } else if (p_mtxcb->p_loctsk == p_runtsk) { ercd = E_OBJ; } else { ercd = E_TMOUT; } unlock_cpu(); error_exit: LOG_PLOC_MTX_LEAVE(ercd); return(ercd); }
ER ref_sem(ID semid, T_RSEM *pk_rsem) { SEMCB *p_semcb; ER ercd; LOG_REF_SEM_ENTER(semid, pk_rsem); CHECK_TSKCTX_UNL(); CHECK_SEMID(semid); CHECK_MACV_WRITE(pk_rsem, T_RSEM); p_semcb = get_semcb(semid); t_lock_cpu(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_semcb->p_seminib->acvct.acptn4)) { ercd = E_OACV; } else { pk_rsem->wtskid = wait_tskid(&(p_semcb->wait_queue)); pk_rsem->semcnt = p_semcb->semcnt; ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_REF_SEM_LEAVE(ercd, pk_rsem); return(ercd); }
ER ini_sem(ID semid) { SEMCB *p_semcb; bool_t dspreq; ER ercd; LOG_INI_SEM_ENTER(semid); CHECK_TSKCTX_UNL(); CHECK_SEMID(semid); p_semcb = get_semcb(semid); t_lock_cpu(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_semcb->p_seminib->acvct.acptn3)) { ercd = E_OACV; } else { dspreq = init_wait_queue(&(p_semcb->wait_queue)); p_semcb->semcnt = p_semcb->p_seminib->isemcnt; if (dspreq) { dispatch(); } ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_INI_SEM_LEAVE(ercd); return(ercd); }
ER pol_sem(ID semid) { SEMCB *p_semcb; ER ercd; LOG_POL_SEM_ENTER(semid); CHECK_TSKCTX_UNL(); CHECK_SEMID(semid); p_semcb = get_semcb(semid); t_lock_cpu(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_semcb->p_seminib->acvct.acptn2)) { ercd = E_OACV; } else if (p_semcb->semcnt >= 1) { p_semcb->semcnt -= 1; ercd = E_OK; } else { ercd = E_TMOUT; } t_unlock_cpu(); error_exit: LOG_POL_SEM_LEAVE(ercd); return(ercd); }
ER sac_sem(ID semid, const ACVCT *p_acvct) { SEMCB *p_semcb; SEMINIB *p_seminib; ER ercd; LOG_SAC_SEM_ENTER(semid, p_acvct); CHECK_TSKCTX_UNL(); CHECK_SEMID(semid); CHECK_MACV_READ(p_acvct, ACVCT); p_semcb = get_semcb(semid); t_lock_cpu(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_semcb->p_seminib->acvct.acptn3)) { ercd = E_OACV; } else if (SEMID(p_semcb) > tmax_ssemid) { p_seminib = (SEMINIB *)(p_semcb->p_seminib); p_seminib->acvct = *p_acvct; ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_SAC_SEM_LEAVE(ercd); return(ercd); }
ER stp_ovr(ID tskid) { TCB *p_tcb; ER ercd; LOG_STP_OVR_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_OBJ(ovrinib.ovrhdr != NULL); CHECK_TSKID_SELF(tskid); p_tcb = get_tcb_self(tskid); t_lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn2)) { ercd = E_OACV; } else { if (p_tcb->leftotm > 0U) { if (p_tcb == p_runtsk) { (void) target_ovrtimer_stop(); ovrtimer_flag = false; } p_tcb->leftotm = 0U; } ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_STP_OVR_LEAVE(ercd); return(ercd); }
ER ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) { PDQCB *p_pdqcb; ER ercd; LOG_REF_PDQ_ENTER(pdqid, pk_rpdq); CHECK_TSKCTX_UNL(); CHECK_PDQID(pdqid); CHECK_MACV_WRITE(pk_rpdq, T_RPDQ); p_pdqcb = get_pdqcb(pdqid); t_lock_cpu(); if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_pdqcb->p_pdqinib->acvct.acptn4)) { ercd = E_OACV; } else { pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue)); pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue)); pk_rpdq->spdqcnt = p_pdqcb->count; ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_REF_PDQ_LEAVE(ercd, pk_rpdq); return(ercd); }
ER sac_tsk(ID tskid, const ACVCT *p_acvct) { TCB *p_tcb; TINIB *p_tinib; ER ercd; LOG_SAC_TSK_ENTER(tskid, p_acvct); CHECK_TSKCTX_UNL(); CHECK_TSKID(tskid); CHECK_MACV_READ(p_acvct, ACVCT); p_tcb = get_tcb(tskid); t_lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn3)) { ercd = E_OACV; } else if (TSKID(p_tcb) > tmax_stskid) { p_tinib = (TINIB *)(p_tcb->p_tinib); p_tinib->acvct = *p_acvct; ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_SAC_TSK_LEAVE(ercd); return(ercd); }
ER ref_mtx(ID mtxid, T_RMTX *pk_rmtx) { MTXCB *p_mtxcb; ER ercd; LOG_REF_MTX_ENTER(mtxid, pk_rmtx); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_MTXID(mtxid)); CHECK_MACV_WRITE(pk_rmtx, T_RMTX); p_mtxcb = get_mtxcb(mtxid); lock_cpu(); if (p_mtxcb->p_mtxinib->mtxatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mtxcb->p_mtxinib->acvct.acptn4)) { ercd = E_OACV; } else { pk_rmtx->htskid = (p_mtxcb->p_loctsk != NULL) ? TSKID(p_mtxcb->p_loctsk) : TSK_NONE; pk_rmtx->wtskid = wait_tskid(&(p_mtxcb->wait_queue)); ercd = E_OK; } unlock_cpu(); error_exit: LOG_REF_MTX_LEAVE(ercd, pk_rmtx); return(ercd); }
ER ini_sem(ID semid) { SEMCB *p_semcb; ER ercd; LOG_INI_SEM_ENTER(semid); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_SEMID(semid)); p_semcb = get_semcb(semid); lock_cpu(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_semcb->p_seminib->acvct.acptn3)) { ercd = E_OACV; } else { init_wait_queue(&(p_semcb->wait_queue)); p_semcb->semcnt = p_semcb->p_seminib->isemcnt; if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } unlock_cpu(); error_exit: LOG_INI_SEM_LEAVE(ercd); return(ercd); }
ER del_isr(ID isrid) { ISRCB *p_isrcb; ISRINIB *p_isrinib; ER ercd; LOG_DEL_ISR_ENTER(isrid); CHECK_TSKCTX_UNL(); CHECK_ISRID(isrid); p_isrcb = get_isrcb(isrid); t_lock_cpu(); if (p_isrcb->p_isrinib->isratr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_isrcb->p_isrinib->acvct.acptn3)) { ercd = E_OACV; } else { queue_delete(&(p_isrcb->isr_queue)); p_isrinib = (ISRINIB *)(p_isrcb->p_isrinib); p_isrinib->isratr = TA_NOEXS; queue_insert_prev(&free_isrcb, &(p_isrcb->isr_queue)); ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_DEL_ISR_LEAVE(ercd); return(ercd); }
ER ena_wai(ID tskid) { TCB *p_tcb; ER ercd; LOG_ENA_WAI_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); p_tcb = get_tcb_self(tskid); t_lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn2)) { ercd = E_OACV; } else if (TSTAT_DORMANT(p_tcb->tstat) || !(p_tcb->waifbd)) { ercd = E_OBJ; } else { p_tcb->waifbd = false; ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_ENA_WAI_LEAVE(ercd); return(ercd); }
ER get_pri(ID tskid, PRI *p_tskpri) { TCB *p_tcb; ER ercd; LOG_GET_PRI_ENTER(tskid, p_tskpri); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); CHECK_MACV_WRITE(p_tskpri, PRI); p_tcb = get_tcb_self(tskid); t_lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn4)) { ercd = E_OACV; } else if (TSTAT_DORMANT(p_tcb->tstat)) { ercd = E_OBJ; } else { *p_tskpri = EXT_TSKPRI(p_tcb->priority); ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_GET_PRI_LEAVE(ercd, *p_tskpri); return(ercd); }
ER rel_wai(ID tskid) { TCB *p_tcb; ER ercd; LOG_REL_WAI_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID(tskid); p_tcb = get_tcb(tskid); t_lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn2)) { ercd = E_OACV; } else if (!TSTAT_WAITING(p_tcb->tstat)) { ercd = E_OBJ; } else { if (wait_release(p_tcb)) { dispatch(); } ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_REL_WAI_LEAVE(ercd); return(ercd); }
ER sac_mtx(ID mtxid, const ACVCT *p_acvct) { MTXCB *p_mtxcb; MTXINIB *p_mtxinib; ER ercd; LOG_SAC_MTX_ENTER(mtxid, p_acvct); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_MTXID(mtxid)); CHECK_MACV_READ(p_acvct, ACVCT); p_mtxcb = get_mtxcb(mtxid); lock_cpu(); if (p_mtxcb->p_mtxinib->mtxatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mtxcb->p_mtxinib->acvct.acptn3)) { ercd = E_OACV; } else if (MTXID(p_mtxcb) <= tmax_smtxid) { ercd = E_OBJ; } else { p_mtxinib = (MTXINIB *)(p_mtxcb->p_mtxinib); p_mtxinib->acvct = *p_acvct; ercd = E_OK; } unlock_cpu(); error_exit: LOG_SAC_MTX_LEAVE(ercd); return(ercd); }
ER ref_mbf(ID mbfid, T_RMBF *pk_rmbf) { MBFCB *p_mbfcb; ER ercd; LOG_REF_MBF_ENTER(mbfid, pk_rmbf); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_MBFID(mbfid)); CHECK_MACV_WRITE(pk_rmbf, T_RMBF); p_mbfcb = get_mbfcb(mbfid); lock_cpu(); if (p_mbfcb->p_mbfinib->mbfatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mbfcb->p_mbfinib->acvct.acptn4)) { ercd = E_OACV; } else { pk_rmbf->stskid = wait_tskid(&(p_mbfcb->swait_queue)); pk_rmbf->rtskid = wait_tskid(&(p_mbfcb->rwait_queue)); pk_rmbf->smbfcnt = p_mbfcb->smbfcnt; pk_rmbf->fmbfsz = p_mbfcb->fmbfsz; ercd = E_OK; } unlock_cpu(); error_exit: LOG_REF_MBF_LEAVE(ercd, pk_rmbf); 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 if (VIOLATE_ACPTN(p_flgcb->p_flginib->acvct.acptn3)) { ercd = E_OACV; } 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 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); CHECK_MACV_WRITE(pk_rflg, T_RFLG); 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.acptn4)) { ercd = E_OACV; } 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 sac_pdq(ID pdqid, const ACVCT *p_acvct) { PDQCB *p_pdqcb; PDQINIB *p_pdqinib; ER ercd; LOG_SAC_PDQ_ENTER(pdqid, p_acvct); CHECK_TSKCTX_UNL(); CHECK_PDQID(pdqid); CHECK_MACV_READ(p_acvct, ACVCT); p_pdqcb = get_pdqcb(pdqid); t_lock_cpu(); if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_pdqcb->p_pdqinib->acvct.acptn3)) { ercd = E_OACV; } else if (PDQID(p_pdqcb) > tmax_spdqid) { p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib); p_pdqinib->acvct = *p_acvct; ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_SAC_PDQ_LEAVE(ercd); 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(); 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 &= clrptn; ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_CLR_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 sac_isr(ID isrid, const ACVCT *p_acvct) { ISRCB *p_isrcb; ISRINIB *p_isrinib; ER ercd; LOG_SAC_ISR_ENTER(isrid, p_acvct); CHECK_TSKCTX_UNL(); CHECK_ISRID(isrid); CHECK_MACV_READ(p_acvct, ACVCT); p_isrcb = get_isrcb(isrid); t_lock_cpu(); if (p_isrcb->p_isrinib->isratr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_isrcb->p_isrinib->acvct.acptn3)) { ercd = E_OACV; } else { p_isrinib = (ISRINIB *)(p_isrcb->p_isrinib); p_isrinib->acvct = *p_acvct; ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_SAC_ISR_LEAVE(ercd); return(ercd); }
ER_UINT can_wup(ID tskid) { TCB *p_tcb; ER_UINT ercd; LOG_CAN_WUP_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); p_tcb = get_tcb_self(tskid); t_lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn1)) { ercd = E_OACV; } else if (TSTAT_DORMANT(p_tcb->tstat)) { ercd = E_OBJ; } else { ercd = p_tcb->wupque ? 1 : 0; p_tcb->wupque = false; } t_unlock_cpu(); error_exit: LOG_CAN_WUP_LEAVE(ercd); return(ercd); }
ER ter_tsk(ID tskid) { TCB *p_tcb; bool_t dspreq = false; ER ercd; LOG_TER_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID(tskid); p_tcb = get_tcb(tskid); CHECK_NONSELF(p_tcb); t_lock_cpu(); if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn2)) { ercd = E_OACV; } else if (TSTAT_DORMANT(p_tcb->tstat)) { ercd = E_OBJ; } else { if (TSTAT_RUNNABLE(p_tcb->tstat)) { /* * p_tcbは自タスクでないため,(シングルプロセッサでは)実 * 行状態でなく,make_non_runnable(p_tcb)でタスクディスパッ * チが必要になることはない. */ (void) make_non_runnable(p_tcb); } else if (TSTAT_WAITING(p_tcb->tstat)) { wait_dequeue_wobj(p_tcb); wait_dequeue_tmevtb(p_tcb); } if (!queue_empty(&(p_tcb->mutex_queue))) { if ((*mtxhook_release_all)(p_tcb)) { dspreq = true; } } make_dormant(p_tcb); if (p_tcb->actque) { p_tcb->actque = false; if (make_active(p_tcb)) { dspreq = true; } } if (dspreq) { dispatch(); } ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_TER_TSK_LEAVE(ercd); return(ercd); }
ER trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout) { PDQCB *p_pdqcb; WINFO_PDQ winfo_pdq; TMEVTB tmevtb; bool_t dspreq; ER ercd; LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout); CHECK_DISPATCH(); CHECK_PDQID(pdqid); CHECK_MACV_WRITE(p_data, intptr_t); CHECK_MACV_WRITE(p_datapri, PRI); CHECK_TMOUT(tmout); p_pdqcb = get_pdqcb(pdqid); t_lock_cpu(); if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_pdqcb->p_pdqinib->acvct.acptn2)) { ercd = E_OACV; } else if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) { if (dspreq) { dispatch(); } ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else if (p_runtsk->waifbd) { ercd = E_RLWAI; } else { p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ); make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout); queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue)); winfo_pdq.p_pdqcb = p_pdqcb; LOG_TSKSTAT(p_runtsk); dispatch(); ercd = winfo_pdq.winfo.wercd; if (ercd == E_OK) { *p_data = winfo_pdq.data; *p_datapri = winfo_pdq.datapri; } } t_unlock_cpu(); error_exit: LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri); 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); }
ER tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout) { PDQCB *p_pdqcb; WINFO_PDQ winfo_pdq; TMEVTB tmevtb; bool_t dspreq; ER ercd; LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout); CHECK_DISPATCH(); CHECK_PDQID(pdqid); CHECK_PAR(TMIN_DPRI <= datapri); CHECK_TMOUT(tmout); p_pdqcb = get_pdqcb(pdqid); t_lock_cpu(); if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_pdqcb->p_pdqinib->acvct.acptn1)) { ercd = E_OACV; } else if (!(datapri <= p_pdqcb->p_pdqinib->maxdpri)) { ercd = E_PAR; } else if (send_pridata(p_pdqcb, data, datapri, &dspreq)) { if (dspreq) { dispatch(); } ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else if (p_runtsk->waifbd) { ercd = E_RLWAI; } else { winfo_pdq.data = data; winfo_pdq.datapri = datapri; p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ); wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq, &tmevtb, tmout); dispatch(); ercd = winfo_pdq.winfo.wercd; } t_unlock_cpu(); error_exit: LOG_TSND_PDQ_LEAVE(ercd); return(ercd); }
ER trcv_mbf(ID mbfid, void *msg, TMO tmout) { MBFCB *p_mbfcb; WINFO_RMBF winfo_rmbf; TMEVTB tmevtb; uint_t msgsz; ER_UINT ercd; LOG_TRCV_MBF_ENTER(mbfid, msg, tmout); CHECK_DISPATCH(); CHECK_ID(VALID_MBFID(mbfid)); CHECK_PAR(VALID_TMOUT(tmout)); p_mbfcb = get_mbfcb(mbfid); lock_cpu_dsp(); if (p_mbfcb->p_mbfinib->mbfatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mbfcb->p_mbfinib->acvct.acptn2)) { ercd = E_OACV; } else if (!KERNEL_PROBE_BUF_WRITE(msg, p_mbfcb->p_mbfinib->maxmsz)) { ercd = E_MACV; } else if (p_runtsk->raster) { ercd = E_RASTER; } else if ((msgsz = receive_message(p_mbfcb, msg)) > 0U) { if (p_runtsk != p_schedtsk) { dispatch(); } ercd = (ER_UINT) msgsz; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { make_wait_tmout(TS_WAITING_RMBF, &(winfo_rmbf.winfo), &tmevtb, tmout); queue_insert_prev(&(p_mbfcb->rwait_queue), &(p_runtsk->task_queue)); winfo_rmbf.p_mbfcb = p_mbfcb; winfo_rmbf.msg = msg; LOG_TSKSTAT(p_runtsk); dispatch(); ercd = winfo_rmbf.winfo.wercd; } unlock_cpu_dsp(); error_exit: LOG_TRCV_MBF_LEAVE(ercd, msg); return(ercd); }
ER sus_tsk(ID tskid) { TCB *p_tcb; ER ercd; LOG_SUS_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); p_tcb = get_tcb_self(tskid); t_lock_cpu(); if (p_tcb == p_runtsk && !dspflg) { ercd = E_CTX; } else if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_tcb->p_tinib->acvct.acptn2)) { ercd = E_OACV; } else if (TSTAT_DORMANT(p_tcb->tstat)) { ercd = E_OBJ; } else if (TSTAT_RUNNABLE(p_tcb->tstat)) { /* * 実行できる状態から強制待ち状態への遷移 */ p_tcb->tstat = TS_SUSPENDED; LOG_TSKSTAT(p_tcb); if (make_non_runnable(p_tcb)) { dispatch(); } ercd = E_OK; } else if (TSTAT_SUSPENDED(p_tcb->tstat)) { ercd = E_QOVR; } else { /* * 待ち状態から二重待ち状態への遷移 */ p_tcb->tstat |= TS_SUSPENDED; LOG_TSKSTAT(p_tcb); ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_SUS_TSK_LEAVE(ercd); return(ercd); }