ER tslp_tsk(TMO tmout) { WINFO winfo; TMEVTB tmevtb; ER ercd; LOG_TSLP_TSK_ENTER(tmout); CHECK_DISPATCH(); CHECK_PAR(VALID_TMOUT(tmout)); lock_cpu_dsp(); if (p_runtsk->raster) { ercd = E_RASTER; } else if (p_runtsk->wupque) { p_runtsk->wupque = false; ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { p_runtsk->tstat = TS_WAITING_SLP; make_wait_tmout(&winfo, &tmevtb, tmout); LOG_TSKSTAT(p_runtsk); dispatch(); ercd = winfo.wercd; } unlock_cpu_dsp(); error_exit: LOG_TSLP_TSK_LEAVE(ercd); return(ercd); }
SYSCALL ER tslp_tsk(TMO tmout) { WINFO winfo; TMEVTB tmevtb; ER ercd; LOG_TSLP_TSK_ENTER(tmout); CHECK_DISPATCH(); CHECK_TMOUT(tmout); t_lock_cpu(); if (runtsk->wupcnt) { runtsk->wupcnt = FALSE; ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { runtsk->tstat = (TS_WAITING | TS_WAIT_SLEEP); make_wait_tmout(&winfo, &tmevtb, tmout); LOG_TSKSTAT(runtsk); dispatch(); ercd = winfo.wercd; } t_unlock_cpu(); exit: LOG_TSLP_TSK_LEAVE(ercd); return(ercd); }
ER tslp_tsk(TMO tmout) { WINFO winfo; TMEVTB tmevtb; ER ercd; LOG_TSLP_TSK_ENTER(tmout); CHECK_DISPATCH(); CHECK_TMOUT(tmout); t_lock_cpu(); if (p_runtsk->wupque) { p_runtsk->wupque = false; 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_SLP); make_wait_tmout(&winfo, &tmevtb, tmout); LOG_TSKSTAT(p_runtsk); dispatch(); ercd = winfo.wercd; } t_unlock_cpu(); error_exit: LOG_TSLP_TSK_LEAVE(ercd); return(ercd); }