ER imrot_rdq(PRI tskpri, ID prcid) { ER ercd; PCB *p_pcb; PCB *my_p_pcb; LOG_IMROT_RDQ_ENTER(tskpri, prcid); CHECK_INTCTX_UNL(); CHECK_TPRI(tskpri); CHECK_PRCID(prcid); i_lock_cpu(); p_pcb = i_acquire_tsk_lock_prcid(prcid); if (rotate_ready_queue(INT_PRIORITY(tskpri), p_pcb)) { my_p_pcb = get_my_p_pcb(); my_p_pcb->reqflg = dispatch_request(p_pcb) ? true : my_p_pcb->reqflg; } ercd = E_OK; release_tsk_lock(p_pcb); i_unlock_cpu(); error_exit: LOG_IMROT_RDQ_LEAVE(ercd); return(ercd); }
ER irot_rdq(PRI tskpri) { QUEUE *p_queue; ER ercd; LOG_IROT_RDQ_ENTER(tskpri); CHECK_INTCTX_UNL(); CHECK_TPRI(tskpri); i_lock_cpu(); p_queue = &(ready_queue[INT_PRIORITY(tskpri)]); if (queue_empty(p_queue)) { ercd = E_OK; } else if ((((TCB *)(p_queue->p_next))->p_tinib->tskatr & TA_RSTR) != 0U) { ercd = E_NOSPT; } else { if (rotate_ready_queue(p_queue)) { reqflg = true; } ercd = E_OK; } i_unlock_cpu(); error_exit: LOG_IROT_RDQ_LEAVE(ercd); return(ercd); }
ER irot_rdq(PRI tskpri) { ER ercd; LOG_IROT_RDQ_ENTER(tskpri); CHECK_INTCTX_UNL(); CHECK_TPRI(tskpri); i_lock_cpu(); if (rotate_ready_queue(INT_PRIORITY(tskpri))) { reqflg = true; } ercd = E_OK; i_unlock_cpu(); error_exit: LOG_IROT_RDQ_LEAVE(ercd); return(ercd); }
ER irot_rdq(PRI tskpri) { ER ercd; PCB *my_p_pcb; LOG_IROT_RDQ_ENTER(tskpri); CHECK_INTCTX_UNL(); CHECK_TPRI(tskpri); i_lock_cpu(); my_p_pcb = i_acquire_tsk_lock_self(); if (rotate_ready_queue(INT_PRIORITY(tskpri), my_p_pcb)) { my_p_pcb->reqflg = true; } ercd = E_OK; release_tsk_lock(my_p_pcb); i_unlock_cpu(); error_exit: LOG_IROT_RDQ_LEAVE(ercd); return(ercd); }
ER_UINT acre_tsk(const T_CTSK *pk_ctsk) { ID domid; const DOMINIB *p_dominib; TCB *p_tcb; TINIB *p_tinib; ATR tskatr; SIZE sstksz, ustksz; void *sstk, *ustk; ACPTN acptn; ER ercd; LOG_ACRE_TSK_ENTER(pk_ctsk); CHECK_TSKCTX_UNL(); CHECK_MACV_READ(pk_ctsk, T_CTSK); CHECK_RSATR(pk_ctsk->tskatr, TA_ACT|TARGET_TSKATR|TA_DOMMASK); domid = get_atrdomid(pk_ctsk->tskatr); CHECK_ATRDOMID_ACTIVE(domid); CHECK_ALIGN_FUNC(pk_ctsk->task); CHECK_NONNULL_FUNC(pk_ctsk->task); CHECK_TPRI(pk_ctsk->itskpri); p_dominib = (domid == TDOM_SELF) ? p_runtsk->p_tinib->p_dominib : (domid == TDOM_KERNEL) ? &dominib_kernel : get_dominib(domid); if (p_dominib == &dominib_kernel) { /* * システムタスクの場合 */ ustksz = 0U; ustk = NULL; CHECK_PAR(pk_ctsk->sstk == NULL); CHECK_PAR(pk_ctsk->stksz > 0U); sstksz = pk_ctsk->stksz; sstk = pk_ctsk->stk; if (sstk != NULL) { CHECK_PAR(pk_ctsk->sstksz == 0U); } else { sstksz += pk_ctsk->sstksz; } } else { /* * ユーザタスクの場合 */ ustksz = pk_ctsk->stksz; ustk = pk_ctsk->stk; CHECK_PAR(ustksz >= TARGET_MIN_USTKSZ); CHECK_NOSPT(ustk != NULL); CHECK_TARGET_USTACK(ustksz, ustk, p_dominib); sstksz = pk_ctsk->sstksz; sstk = pk_ctsk->sstk; } CHECK_PAR(sstksz >= TARGET_MIN_SSTKSZ); if (sstk != NULL) { CHECK_ALIGN_STKSZ(sstksz); CHECK_ALIGN_STACK(sstk); } CHECK_ACPTN(sysstat_acvct.acptn3); tskatr = pk_ctsk->tskatr; t_lock_cpu(); if (queue_empty(&free_tcb)) { ercd = E_NOID; } else { if (sstk == NULL) { sstk = kernel_malloc(ROUND_STK_T(sstksz)); tskatr |= TA_MEMALLOC; } if (sstk == NULL) { ercd = E_NOMEM; } else { p_tcb = ((TCB *) queue_delete_next(&free_tcb)); p_tinib = (TINIB *)(p_tcb->p_tinib); p_tinib->p_dominib = p_dominib; p_tinib->tskatr = tskatr; p_tinib->exinf = pk_ctsk->exinf; p_tinib->task = pk_ctsk->task; p_tinib->ipriority = INT_PRIORITY(pk_ctsk->itskpri); #ifdef USE_TSKINICTXB init_tskinictxb(&(p_tinib->tskinictxb), p_dominib, sstksz, sstk, utsksz, ustk, pk_ctsk); #else /* USE_TSKINICTXB */ p_tinib->sstksz = sstksz; p_tinib->sstk = sstk; p_tinib->ustksz = ustksz; p_tinib->ustk = ustk; #endif /* USE_TSKINICTXB */ p_tinib->texatr = TA_NULL; p_tinib->texrtn = NULL; acptn = default_acptn(domid); p_tinib->acvct.acptn1 = acptn; p_tinib->acvct.acptn2 = acptn; p_tinib->acvct.acptn3 = acptn | rundom; p_tinib->acvct.acptn4 = acptn; p_tcb->actque = false; make_dormant(p_tcb); queue_initialize(&(p_tcb->mutex_queue)); if ((p_tcb->p_tinib->tskatr & TA_ACT) != 0U) { make_active(p_tcb); } ercd = TSKID(p_tcb); } } t_unlock_cpu(); error_exit: LOG_ACRE_TSK_LEAVE(ercd); return(ercd); }