ER sus_tsk(ID tskid) { TCB *p_tcb; ER ercd; LOG_SUS_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); /*[NGKI1299][NGKI1300]*/ if (tskid == TSK_SELF) { p_tcb = p_runtsk; /*[NGKI1310]*/ } else { CHECK_ID(VALID_TSKID(tskid)); /*[NGKI1302]*/ p_tcb = get_tcb(tskid); } lock_cpu(); if (p_tcb == p_runtsk && !dspflg) { /*[NGKI1311][NGKI3604]*/ ercd = E_CTX; } else if (p_tcb->p_tinib->tskatr == TA_NOEXS) { ercd = E_NOEXS; /*[NGKI1303]*/ } else if (TSTAT_DORMANT(p_tcb->tstat)) { ercd = E_OBJ; /*[NGKI1305]*/ } else if (p_tcb->raster) { ercd = E_RASTER; /*[NGKI3605]*/ } else if (TSTAT_RUNNABLE(p_tcb->tstat)) { /* * 実行できる状態から強制待ち状態への遷移[NGKI1307] */ p_tcb->tstat = TS_SUSPENDED; LOG_TSKSTAT(p_tcb); make_non_runnable(p_tcb); if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } else if (TSTAT_SUSPENDED(p_tcb->tstat)) { ercd = E_QOVR; /*[NGKI1306]*/ } else { /* * 待ち状態から二重待ち状態への遷移[NGKI1308] */ p_tcb->tstat |= TS_SUSPENDED; LOG_TSKSTAT(p_tcb); ercd = E_OK; } unlock_cpu(); error_exit: LOG_SUS_TSK_LEAVE(ercd); 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); }
SYSCALL ER sus_tsk(ID tskid) { TCB *tcb; UINT tstat; ER ercd; LOG_SUS_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); tcb = get_tcb_self(tskid); t_lock_cpu(); if (tcb == runtsk && !(enadsp)) { ercd = E_CTX; } else if (TSTAT_DORMANT(tstat = tcb->tstat)) { ercd = E_OBJ; } else if (TSTAT_RUNNABLE(tstat)) { /* * 実行できる状態から強制待ち状態への遷移 */ tcb->tstat = TS_SUSPENDED; LOG_TSKSTAT(tcb); if (make_non_runnable(tcb)) { dispatch(); } ercd = E_OK; } else if (TSTAT_SUSPENDED(tstat)) { ercd = E_QOVR; } else { /* * 待ち状態から二重待ち状態への遷移 */ tcb->tstat |= TS_SUSPENDED; LOG_TSKSTAT(tcb); ercd = E_OK; } t_unlock_cpu(); exit: LOG_SUS_TSK_LEAVE(ercd); return(ercd); }