ER ista_alm(ID almid, RELTIM almtim) { ALMCB *p_almcb; ER ercd; LOG_ISTA_ALM_ENTER(almid, almtim); CHECK_INTCTX_UNL(); CHECK_ALMID(almid); CHECK_PAR(almtim <= TMAX_RELTIM); p_almcb = get_almcb(almid); i_lock_cpu(); if (p_almcb->p_alminib->almatr == TA_NOEXS) { ercd = E_NOEXS; } else if (p_almcb->almsta) { tmevtb_dequeue(&(p_almcb->tmevtb)); } else { p_almcb->almsta = true; } tmevtb_enqueue(&(p_almcb->tmevtb), almtim, (CBACK) call_almhdr, (void *) p_almcb); ercd = E_OK; i_unlock_cpu(); error_exit: LOG_ISTA_ALM_LEAVE(ercd); return(ercd); }
ER istp_alm(ID almid) { ALMCB *p_almcb; ER ercd; LOG_ISTP_ALM_ENTER(almid); CHECK_INTCTX_UNL(); CHECK_ALMID(almid); p_almcb = get_almcb(almid); i_lock_cpu(); if (p_almcb->p_alminib->almatr == TA_NOEXS) { ercd = E_NOEXS; } else if (p_almcb->almsta) { p_almcb->almsta = false; tmevtb_dequeue(&(p_almcb->tmevtb)); } ercd = E_OK; i_unlock_cpu(); error_exit: LOG_ISTP_ALM_LEAVE(ercd); return(ercd); }
ER sta_alm(ID almid, RELTIM almtim) { ALMCB *p_almcb; ER ercd; LOG_STA_ALM_ENTER(almid, almtim); CHECK_UNL(); CHECK_ID(VALID_ALMID(almid)); CHECK_PAR(VALID_RELTIM(almtim)); p_almcb = get_almcb(almid); lock_cpu(); if (p_almcb->almsta) { tmevtb_dequeue(&(p_almcb->tmevtb)); } else { p_almcb->almsta = true; } tmevtb_enqueue(&(p_almcb->tmevtb), almtim); ercd = E_OK; unlock_cpu(); error_exit: LOG_STA_ALM_LEAVE(ercd); return(ercd); }
SYSCALL ER sta_cyc(ID cycid) { CYCCB *cyccb; ER ercd; LOG_STA_CYC_ENTER(cycid); CHECK_TSKCTX_UNL(); CHECK_CYCID(cycid); cyccb = get_cyccb(cycid); t_lock_cpu(); if (cyccb->cycsta) { tmevtb_dequeue(&(cyccb->tmevtb)); } else { cyccb->cycsta = TRUE; } tmevtb_enqueue_cyc(cyccb, base_time + cyccb->cycinib->cyctim); ercd = E_OK; t_unlock_cpu(); exit: LOG_STA_CYC_LEAVE(ercd); return(ercd); }
ER stp_cyc(ID cycid) { CYCCB *p_cyccb; ER ercd; LOG_STP_CYC_ENTER(cycid); CHECK_TSKCTX_UNL(); CHECK_CYCID(cycid); p_cyccb = get_cyccb(cycid); t_lock_cpu(); if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) { ercd = E_NOEXS; } else { if (p_cyccb->cycsta) { p_cyccb->cycsta = false; tmevtb_dequeue(&(p_cyccb->tmevtb)); } ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_STP_CYC_LEAVE(ercd); return(ercd); }
ER sta_cyc(ID cycid) { CYCCB *p_cyccb; ER ercd; LOG_STA_CYC_ENTER(cycid); CHECK_TSKCTX_UNL(); CHECK_CYCID(cycid); p_cyccb = get_cyccb(cycid); t_lock_cpu(); if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) { ercd = E_NOEXS; } else { if (p_cyccb->cycsta) { tmevtb_dequeue(&(p_cyccb->tmevtb)); } else { p_cyccb->cycsta = true; } tmevtb_enqueue_cyc(p_cyccb, base_time + p_cyccb->p_cycinib->cycphs); ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_STA_CYC_LEAVE(ercd); return(ercd); }
BOOL wait_complete(TCB *tcb) { if (tcb->winfo->tmevtb != NULL) { tmevtb_dequeue(tcb->winfo->tmevtb); } tcb->winfo->wercd = E_OK; return(make_non_wait(tcb)); }
void wait_cancel(TCB *tcb) { if (tcb->winfo->tmevtb != NULL) { tmevtb_dequeue(tcb->winfo->tmevtb); } if ((tcb->tstat & TS_WAIT_WOBJ) != 0) { queue_delete(&(tcb->task_queue)); } }
SYSCALL ER stp_cyc(ID cycid) { CYCCB *cyccb; ER ercd; LOG_STP_CYC_ENTER(cycid); CHECK_TSKCTX_UNL(); CHECK_CYCID(cycid); cyccb = get_cyccb(cycid); t_lock_cpu(); if (cyccb->cycsta) { cyccb->cycsta = FALSE; tmevtb_dequeue(&(cyccb->tmevtb)); } ercd = E_OK; t_unlock_cpu(); exit: LOG_STP_CYC_LEAVE(ercd); return(ercd); }
ER stp_alm(ID almid) { ALMCB *p_almcb; ER ercd; LOG_STP_ALM_ENTER(almid); CHECK_UNL(); CHECK_ID(VALID_ALMID(almid)); p_almcb = get_almcb(almid); lock_cpu(); if (p_almcb->almsta) { p_almcb->almsta = false; tmevtb_dequeue(&(p_almcb->tmevtb)); } ercd = E_OK; unlock_cpu(); error_exit: LOG_STP_ALM_LEAVE(ercd); return(ercd); }
ER del_alm(ID almid) { ALMCB *p_almcb; ALMINIB *p_alminib; ER ercd; LOG_DEL_ALM_ENTER(almid); CHECK_TSKCTX_UNL(); CHECK_ALMID(almid); p_almcb = get_almcb(almid); t_lock_cpu(); if (p_almcb->p_alminib->almatr == TA_NOEXS) { ercd = E_NOEXS; } else if (ALMID(p_almcb) > tmax_salmid) { if (p_almcb->almsta) { p_almcb->almsta = false; tmevtb_dequeue(&(p_almcb->tmevtb)); } p_alminib = (ALMINIB *)(p_almcb->p_alminib); p_alminib->almatr = TA_NOEXS; queue_insert_prev(&free_almcb, ((QUEUE *) &(p_almcb->tmevtb))); ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_DEL_ALM_LEAVE(ercd); return(ercd); }
ER del_cyc(ID cycid) { CYCCB *p_cyccb; CYCINIB *p_cycinib; ER ercd; LOG_DEL_CYC_ENTER(cycid); CHECK_TSKCTX_UNL(); CHECK_CYCID(cycid); p_cyccb = get_cyccb(cycid); t_lock_cpu(); if (p_cyccb->p_cycinib->cycatr == TA_NOEXS) { ercd = E_NOEXS; } else if (CYCID(p_cyccb) > tmax_scycid) { if (p_cyccb->cycsta) { p_cyccb->cycsta = false; tmevtb_dequeue(&(p_cyccb->tmevtb)); } p_cycinib = (CYCINIB *)(p_cyccb->p_cycinib); p_cycinib->cycatr = TA_NOEXS; queue_insert_prev(&free_cyccb, ((QUEUE *) &(p_cyccb->tmevtb))); ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_DEL_CYC_LEAVE(ercd); return(ercd); }
ER mig_tsk(ID tskid, ID prcid) { TCB *p_tcb; ER ercd = E_OK; PCB *t_p_pcb; PCB *f_p_pcb; bool_t dspreq = false; PCB *my_p_pcb; #ifdef TOPPERS_SYSTIM_LOCAL EVTTIM left_time; #endif /* TOPPERS_SYSTIM_LOCAL */ LOG_MIG_TSK_ENTER(tskid, prcid); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); CHECK_PRCID_INI(prcid); t_lock_cpu(); p_tcb = get_tcb_self(tskid, get_my_p_pcb()); prcid = (prcid == TPRC_INI)? p_tcb->p_tinib->iaffinity : prcid; T_CHECK_MIG(p_tcb->p_tinib->affinity_mask, prcid); /* 現在割り付けられているプロセッサと移動先のプロセッサのタスクロックを取得 */ t_acquire_dual_tsk_lock(p_tcb, prcid, &f_p_pcb, &t_p_pcb); my_p_pcb = get_my_p_pcb(); if (f_p_pcb != my_p_pcb) { /* * 自タスクと同じプロセッサに割り付けられているタスクでなけれ * ばエラー. mig_tsk を呼び出したタスクがシステムコール呼出し後, * マイグレートされた場合にも,ここでエラーとなる */ ercd = E_OBJ; } else if (TSTAT_RUNNABLE(p_tcb->tstat)){ /* 実行可能状態 */ if(p_tcb == my_p_pcb->p_runtsk) { /* 自タスクに対して発行 */ if (!(my_p_pcb->dspflg)) { /* ディスパッチ禁止中ならエラー */ ercd = E_CTX; } else if (t_p_pcb == my_p_pcb) { /* 同一プロセッサを指定 */ /* 優先順位を同一優先度のタスクの中で最低とする */ dspreq = set_lowest_precedence(p_tcb, my_p_pcb); ercd = E_OK; } else { /* マイグレーション要求を処理 */ LOG_TSKMIG(p_tcb, my_p_pcb->prcid, prcid); dispatch_and_migrate(prcid); /* ここに戻ってくる時にはロックは解放されている */ ercd = E_OK; t_unlock_cpu(); goto error_exit; } } else { /* 他タスクの場合 */ if (t_p_pcb == my_p_pcb) { /* 同一プロセッサを指定 */ /* * 優先順位を同一優先度のタスクの中で最低とする. * 対象のタスクは最高優先順位のタスクでないため,タ * スク切り替えは発生しない */ (void)set_lowest_precedence(p_tcb, my_p_pcb); ercd = E_OK; } else { /* 異なるプロセッサを指定 */ /* レディーキューから外す */ make_non_runnable(p_tcb); /* pcb の書き換え */ p_tcb->p_pcb = t_p_pcb; LOG_TSKMIG(p_tcb, my_p_pcb->prcid, prcid); /* 移行先のプロセッサでmake_runnable する*/ if (make_runnable(p_tcb)) { dispatch_request(t_p_pcb); } ercd = E_OK; } } } else if (TSTAT_DORMANT(p_tcb->tstat)) { /* 休止状態 */ LOG_TSKMIG(p_tcb, my_p_pcb->prcid, prcid); p_tcb->p_pcb = t_p_pcb; ercd = E_OK; } else { /* 待ち状態 */ if ((p_tcb->tmevtb).callback == NULL) { /* 時間待ちでない場合 */ LOG_TSKMIG(p_tcb, my_p_pcb->prcid, prcid); p_tcb->p_pcb = t_p_pcb; ercd = E_OK; } else { /* * 時間待ちの場合 グローバルタイマ方式 なら必要なし */ #ifdef TOPPERS_SYSTIM_LOCAL /* キューから削除 */ left_time = tmevtb_dequeue(f_p_pcb->p_tevtcb, &(p_tcb->tmevtb)); LOG_TSKMIG(p_tcb, my_p_pcb->prcid, prcid); /* 移動先のプロセッサのキューに挿入 */ tmevtb_insert(t_p_pcb->p_tevtcb, &(p_tcb->tmevtb), base_time(t_p_pcb->p_tevtcb) + left_time); #else /* TOPPERS_SYSTIM_GLOBAL */ LOG_TSKMIG(p_tcb, my_p_pcb->prcid, prcid); #endif /* TOPPERS_SYSTIM_GLOBAL */ p_tcb->p_pcb = t_p_pcb; ercd = E_OK; } } release_dual_tsk_lock(f_p_pcb, t_p_pcb); if (dspreq) { dispatch(); } t_unlock_cpu(); error_exit: LOG_MIG_TSK_LEAVE(ercd); return(ercd); }