ER_UINT acre_flg(const T_CFLG *pk_cflg) { FLGCB *p_flgcb; FLGINIB *p_flginib; ER ercd; LOG_ACRE_FLG_ENTER(pk_cflg); CHECK_TSKCTX_UNL(); CHECK_RSATR(pk_cflg->flgatr, TA_TPRI|TA_WMUL|TA_CLR); t_lock_cpu(); if (tnum_flg == 0 || queue_empty(&free_flgcb)) { ercd = E_NOID; } else { p_flgcb = ((FLGCB *) queue_delete_next(&free_flgcb)); p_flginib = (FLGINIB *)(p_flgcb->p_flginib); p_flginib->flgatr = pk_cflg->flgatr; p_flginib->iflgptn = pk_cflg->iflgptn; queue_initialize(&(p_flgcb->wait_queue)); p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn; ercd = FLGID(p_flgcb); } t_unlock_cpu(); error_exit: LOG_ACRE_FLG_LEAVE(ercd); return(ercd); }
ER sac_flg(ID flgid, const ACVCT *p_acvct) { FLGCB *p_flgcb; FLGINIB *p_flginib; ER ercd; LOG_SAC_FLG_ENTER(flgid, p_acvct); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); CHECK_MACV_READ(p_acvct, ACVCT); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_flgcb->p_flginib->acvct.acptn3)) { ercd = E_OACV; } else if (FLGID(p_flgcb) > tmax_sflgid) { p_flginib = (FLGINIB *)(p_flgcb->p_flginib); p_flginib->acvct = *p_acvct; ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_SAC_FLG_LEAVE(ercd); return(ercd); }
ER_UINT acre_flg(const T_CFLG *pk_cflg) { ID domid; FLGCB *p_flgcb; FLGINIB *p_flginib; ACPTN acptn; ER ercd; LOG_ACRE_FLG_ENTER(pk_cflg); CHECK_TSKCTX_UNL(); CHECK_MACV_READ(pk_cflg, T_CFLG); CHECK_RSATR(pk_cflg->flgatr, TA_TPRI|TA_WMUL|TA_CLR|TA_DOMMASK); domid = get_atrdomid(pk_cflg->flgatr); CHECK_ATRDOMID_INACTIVE(domid); CHECK_ACPTN(sysstat_acvct.acptn3); t_lock_cpu(); if (tnum_flg == 0 || queue_empty(&free_flgcb)) { ercd = E_NOID; } else { p_flgcb = ((FLGCB *) queue_delete_next(&free_flgcb)); p_flginib = (FLGINIB *)(p_flgcb->p_flginib); p_flginib->flgatr = pk_cflg->flgatr; p_flginib->iflgptn = pk_cflg->iflgptn; acptn = default_acptn(domid); p_flginib->acvct.acptn1 = acptn; p_flginib->acvct.acptn2 = acptn; p_flginib->acvct.acptn3 = acptn | rundom; p_flginib->acvct.acptn4 = acptn; queue_initialize(&(p_flgcb->wait_queue)); p_flgcb->flgptn = p_flgcb->p_flginib->iflgptn; ercd = FLGID(p_flgcb); } t_unlock_cpu(); error_exit: LOG_ACRE_FLG_LEAVE(ercd); return(ercd); }
ER del_flg(ID flgid) { FLGCB *p_flgcb; FLGINIB *p_flginib; bool_t dspreq; ER ercd; LOG_DEL_FLG_ENTER(flgid); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); p_flgcb = get_flgcb(flgid); t_lock_cpu(); if (p_flgcb->p_flginib->flgatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_flgcb->p_flginib->acvct.acptn3)) { ercd = E_OACV; } else if (FLGID(p_flgcb) > tmax_sflgid) { dspreq = init_wait_queue(&(p_flgcb->wait_queue)); p_flginib = (FLGINIB *)(p_flgcb->p_flginib); p_flginib->flgatr = TA_NOEXS; queue_insert_prev(&free_flgcb, &(p_flgcb->wait_queue)); if (dspreq) { dispatch(); } ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_DEL_FLG_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); p_tcb = get_tcb_self(tskid); 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_MBX: pk_rtsk->tskwait = TTW_MBX; pk_rtsk->wobjid = MBXID(((WINFO_MBX *)(p_tcb->p_winfo)) ->p_mbxcb); 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->actcnt = p_tcb->actque ? 1U : 0U; ercd = E_OK; t_unlock_cpu(); error_exit: LOG_REF_TSK_LEAVE(ercd, pk_rtsk); 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); p_tcb = get_tcb_self(tskid); t_lock_cpu(); tstat = p_tcb->tstat; if (TSTAT_DORMANT(tstat)) { /* * when task is in dormant status */ pk_rtsk->tskstat = TTS_DMT; } else { /* * get task status */ 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; } /* * get current priority and base priority */ pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority); pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->priority); if (TSTAT_WAITING(tstat)) { /* * if the task is in waiting * get the waiting reason and wait objects 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_MBX: pk_rtsk->tskwait = TTW_MBX; pk_rtsk->wobjid = MBXID(((WINFO_MBX *)(p_tcb->p_winfo)) ->p_mbxcb); break; case TS_WAIT_MPF: pk_rtsk->tskwait = TTW_MPF; pk_rtsk->wobjid = MPFID(((WINFO_MPF *)(p_tcb->p_winfo)) ->p_mpfcb); break; } /* * get left time before timeout */ 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; } } /* * get wakeup request */ pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U; } /* * get activation request */ 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); }