ER ena_dsp(void) { ER ercd; bool_t dspreq = false; PCB *my_p_pcb; LOG_ENA_DSP_ENTER(); CHECK_TSKCTX_UNL(); t_lock_cpu(); my_p_pcb = t_acquire_tsk_lock_self_without_runnable_check(); my_p_pcb->disdsp = false; if (t_get_ipm() == TIPM_ENAALL) { my_p_pcb->dspflg = true; if (my_p_pcb->p_runtsk != my_p_pcb->p_schedtsk) { dspreq = true; } } ercd = E_OK; release_tsk_lock(my_p_pcb); if (dspreq) { dispatch(); } t_unlock_cpu(); error_exit: LOG_ENA_DSP_LEAVE(ercd); return(ercd); }
ER ext_tsk(void) { ER ercd; LOG_EXT_TSK_ENTER(); CHECK_TSKCTX(); if (t_sense_lock()) { /* * CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し * てからタスクを終了する.実装上は,サービスコール内でのCPU * ロックを省略すればよいだけ. */ } else { t_lock_cpu(); } if (disdsp) { /* * ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ * チ許可状態にしてからタスクを終了する. */ disdsp = false; } if (t_get_ipm() != TIPM_ENAALL) { /* * 割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk * が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す * る. */ t_set_ipm(TIPM_ENAALL); } dspflg = true; (void) make_non_runnable(p_runtsk); make_dormant(p_runtsk); if (p_runtsk->actque) { p_runtsk->actque = false; (void) make_active(p_runtsk); } exit_and_dispatch(); return(E_SYS); error_exit: LOG_EXT_TSK_LEAVE(ercd); return(ercd); }
ER get_ipm(PRI *p_intpri) { ER ercd; LOG_GET_IPM_ENTER(p_intpri); CHECK_TSKCTX_UNL(); t_lock_cpu(); *p_intpri = t_get_ipm(); ercd = E_OK; t_unlock_cpu(); error_exit: LOG_GET_IPM_LEAVE(ercd, *p_intpri); return(ercd); }
ER get_ipm(PRI *p_intpri) { ER ercd; LOG_GET_IPM_ENTER(p_intpri); CHECK_TSKCTX_UNL(); CHECK_MACV_WRITE(p_intpri, PRI); CHECK_ACPTN(sysstat_acvct.acptn4); t_lock_cpu(); *p_intpri = t_get_ipm(); ercd = E_OK; t_unlock_cpu(); error_exit: LOG_GET_IPM_LEAVE(ercd, *p_intpri); return(ercd); }
ER get_ipm(PRI *p_intpri) { bool_t locked; ER ercd; LOG_GET_IPM_ENTER(p_intpri); CHECK_TSKCTX(); locked = t_sense_lock(); if (!locked) { t_lock_cpu(); } *p_intpri = t_get_ipm(); ercd = E_OK; if (!locked) { t_unlock_cpu(); } error_exit: LOG_GET_IPM_LEAVE(ercd, *p_intpri); return(ercd); }