ER sac_mbf(ID mbfid, const ACVCT *p_acvct) { MBFCB *p_mbfcb; MBFINIB *p_mbfinib; ER ercd; LOG_SAC_MBF_ENTER(mbfid, p_acvct); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_MBFID(mbfid)); CHECK_MACV_READ(p_acvct, ACVCT); p_mbfcb = get_mbfcb(mbfid); lock_cpu(); if (p_mbfcb->p_mbfinib->mbfatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mbfcb->p_mbfinib->acvct.acptn3)) { ercd = E_OACV; } else if (MBFID(p_mbfcb) <= tmax_smbfid) { ercd = E_OBJ; } else { p_mbfinib = (MBFINIB *)(p_mbfcb->p_mbfinib); p_mbfinib->acvct = *p_acvct; ercd = E_OK; } unlock_cpu(); error_exit: LOG_SAC_MBF_LEAVE(ercd); return(ercd); }
ER del_mbf(ID mbfid) { MBFCB *p_mbfcb; MBFINIB *p_mbfinib; const DOMINIB *p_dominib; ER ercd; LOG_DEL_MBF_ENTER(mbfid); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_MBFID(mbfid)); p_mbfcb = get_mbfcb(mbfid); lock_cpu(); if (p_mbfcb->p_mbfinib->mbfatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mbfcb->p_mbfinib->acvct.acptn3)) { ercd = E_OACV; } else if (MBFID(p_mbfcb) <= tmax_smbfid) { ercd = E_OBJ; } else { init_wait_queue(&(p_mbfcb->swait_queue)); init_wait_queue(&(p_mbfcb->rwait_queue)); p_mbfinib = (MBFINIB *)(p_mbfcb->p_mbfinib); p_dominib = get_atrdominib(p_mbfinib->mbfatr); if ((p_mbfinib->mbfatr & TA_MBALLOC) != 0U) { free_mpk(p_mbfinib->mbfmb, p_dominib); } p_mbfinib->mbfatr = TA_NOEXS; queue_insert_prev(&(p_dominib->p_domcb->free_mbfcb), &(p_mbfcb->swait_queue)); if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } unlock_cpu(); error_exit: LOG_DEL_MBF_LEAVE(ercd); return(ercd); }
ER ref_tsk(ID tskid, T_RTSK *pk_rtsk) { TCB *p_tcb; uint_t tstat; ER ercd; LOG_REF_TSK_ENTER(tskid, pk_rtsk); CHECK_TSKCTX_UNL(); CHECK_TSKID_SELF(tskid); CHECK_MACV_WRITE(pk_rtsk, T_RTSK); p_tcb = get_tcb_self(tskid); CHECK_ACPTN(p_tcb->p_tinib->acvct.acptn4); t_lock_cpu(); tstat = p_tcb->tstat; if (TSTAT_DORMANT(tstat)) { /* * 対象タスクが休止状態の場合 */ pk_rtsk->tskstat = TTS_DMT; } else { /* * タスク状態の取出し */ if (TSTAT_SUSPENDED(tstat)) { if (TSTAT_WAITING(tstat)) { pk_rtsk->tskstat = TTS_WAS; } else { pk_rtsk->tskstat = TTS_SUS; } } else if (TSTAT_WAITING(tstat)) { pk_rtsk->tskstat = TTS_WAI; } else if (p_tcb == p_runtsk) { pk_rtsk->tskstat = TTS_RUN; } else { pk_rtsk->tskstat = TTS_RDY; } /* * 現在優先度とベース優先度の取出し */ pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority); pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->bpriority); if (TSTAT_WAITING(tstat)) { /* * 待ち要因と待ち対象のオブジェクトのIDの取出し */ switch (tstat & TS_WAIT_MASK) { case TS_WAIT_SLP: pk_rtsk->tskwait = TTW_SLP; break; case TS_WAIT_DLY: pk_rtsk->tskwait = TTW_DLY; break; case TS_WAIT_SEM: pk_rtsk->tskwait = TTW_SEM; pk_rtsk->wobjid = SEMID(((WINFO_SEM *)(p_tcb->p_winfo)) ->p_semcb); break; case TS_WAIT_FLG: pk_rtsk->tskwait = TTW_FLG; pk_rtsk->wobjid = FLGID(((WINFO_FLG *)(p_tcb->p_winfo)) ->p_flgcb); break; case TS_WAIT_SDTQ: pk_rtsk->tskwait = TTW_SDTQ; pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo)) ->p_dtqcb); break; case TS_WAIT_RDTQ: pk_rtsk->tskwait = TTW_RDTQ; pk_rtsk->wobjid = DTQID(((WINFO_DTQ *)(p_tcb->p_winfo)) ->p_dtqcb); break; case TS_WAIT_SPDQ: pk_rtsk->tskwait = TTW_SPDQ; pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo)) ->p_pdqcb); break; case TS_WAIT_RPDQ: pk_rtsk->tskwait = TTW_RPDQ; pk_rtsk->wobjid = PDQID(((WINFO_PDQ *)(p_tcb->p_winfo)) ->p_pdqcb); break; case TS_WAIT_MTX: pk_rtsk->tskwait = TTW_MTX; pk_rtsk->wobjid = MTXID(((WINFO_MTX *)(p_tcb->p_winfo)) ->p_mtxcb); break; case TS_WAIT_SMBF: pk_rtsk->tskwait = TTW_SMBF; pk_rtsk->wobjid = MBFID(((WINFO_MBF *)(p_tcb->p_winfo)) ->p_mbfcb); break; case TS_WAIT_RMBF: pk_rtsk->tskwait = TTW_RMBF; pk_rtsk->wobjid = MBFID(((WINFO_MBF *)(p_tcb->p_winfo)) ->p_mbfcb); break; case TS_WAIT_MPF: pk_rtsk->tskwait = TTW_MPF; pk_rtsk->wobjid = MPFID(((WINFO_MPF *)(p_tcb->p_winfo)) ->p_mpfcb); break; } /* * タイムアウトするまでの時間の取出し */ if (p_tcb->p_winfo->p_tmevtb != NULL) { pk_rtsk->lefttmo = (TMO) tmevt_lefttim(p_tcb->p_winfo->p_tmevtb); } else { pk_rtsk->lefttmo = TMO_FEVR; } } /* * 起床要求キューイング数の取出し */ pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U; /* * タスク例外マスク状態か否かの取出し */ pk_rtsk->texmsk = t_sense_texmask(p_tcb); /* * 待ち禁止状態か否かの取出し */ pk_rtsk->waifbd = p_tcb->waifbd; /* * 拡張サービスコールのネストレベルの取出し */ pk_rtsk->svclevel = p_tcb->svclevel; } /* * 起動要求キューイング数の取出し */ pk_rtsk->actcnt = p_tcb->actque ? 1U : 0U; ercd = E_OK; t_unlock_cpu(); error_exit: LOG_REF_TSK_LEAVE(ercd, pk_rtsk); return(ercd); }
ER_UINT acre_mbf(const T_CMBF *pk_cmbf) { MBFCB *p_mbfcb; MBFINIB *p_mbfinib; ATR mbfatr; uint_t maxmsz; size_t mbfsz; void *mbfmb; ID domid; const DOMINIB *p_dominib; ACPTN acptn; ER ercd; LOG_ACRE_MBF_ENTER(pk_cmbf); CHECK_TSKCTX_UNL(); CHECK_MACV_READ(pk_cmbf, T_CMBF); mbfatr = pk_cmbf->mbfatr; maxmsz = pk_cmbf->maxmsz; mbfsz = pk_cmbf->mbfsz; mbfmb = pk_cmbf->mbfmb; CHECK_VALIDATR(mbfatr, TA_TPRI|TA_DOMMASK); if (mbfmb != NULL) { CHECK_PAR(MB_ALIGN(mbfmb)); CHECK_OBJ(valid_memobj_kernel(mbfmb, mbfsz)); } domid = get_atrdomid(mbfatr); if (domid == TDOM_SELF) { if (rundom == TACP_KERNEL) { domid = TDOM_KERNEL; } else { domid = p_runtsk->p_tinib->domid; } mbfatr = set_atrdomid(mbfatr, domid); } switch (domid) { case TDOM_KERNEL: p_dominib = &dominib_kernel; break; case TDOM_NONE: p_dominib = &dominib_none; break; default: CHECK_RSATR(VALID_DOMID(domid)); p_dominib = get_dominib(domid); break; } CHECK_ACPTN(p_dominib->acvct.acptn1); lock_cpu(); if (tnum_mbf == 0 || queue_empty(&(p_dominib->p_domcb->free_mbfcb))) { ercd = E_NOID; } else { if (mbfsz != 0 && mbfmb == NULL) { mbfmb = malloc_mpk(mbfsz, p_dominib); mbfatr |= TA_MBALLOC; } if (mbfsz != 0 && mbfmb == NULL) { ercd = E_NOMEM; } else { p_mbfcb = (MBFCB *) queue_delete_next(&(p_dominib->p_domcb->free_mbfcb)); p_mbfinib = (MBFINIB *)(p_mbfcb->p_mbfinib); p_mbfinib->mbfatr = mbfatr; p_mbfinib->maxmsz = maxmsz; p_mbfinib->mbfsz = mbfsz; p_mbfinib->mbfmb = mbfmb; acptn = default_acptn(domid); p_mbfinib->acvct.acptn1 = acptn; p_mbfinib->acvct.acptn2 = acptn; p_mbfinib->acvct.acptn3 = p_dominib->acvct.acptn1; p_mbfinib->acvct.acptn4 = acptn; queue_initialize(&(p_mbfcb->swait_queue)); queue_initialize(&(p_mbfcb->rwait_queue)); p_mbfcb->fmbfsz = mbfsz; p_mbfcb->head = 0U; p_mbfcb->tail = 0U; p_mbfcb->smbfcnt = 0U; ercd = MBFID(p_mbfcb); } } unlock_cpu(); error_exit: LOG_ACRE_MBF_LEAVE(ercd); return(ercd); }