ER tloc_mtx(ID mtxid, TMO tmout) { MTXCB *p_mtxcb; WINFO_MTX winfo_mtx; TMEVTB tmevtb; ER ercd; LOG_TLOC_MTX_ENTER(mtxid, tmout); CHECK_DISPATCH(); CHECK_ID(VALID_MTXID(mtxid)); CHECK_PAR(VALID_TMOUT(tmout)); p_mtxcb = get_mtxcb(mtxid); lock_cpu_dsp(); if (p_mtxcb->p_mtxinib->mtxatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mtxcb->p_mtxinib->acvct.acptn1)) { ercd = E_OACV; } else if (MTX_CEILING(p_mtxcb) && p_mtxcb->p_mtxinib->ceilpri < p_runtsk->p_dominib->minpriority && VIOLATE_ACPTN(p_runtsk->p_dominib->acvct.acptn2)) { ercd = E_OACV; /*[NGKI5124]*/ } else if (p_runtsk->raster) { ercd = E_RASTER; } else if (MTX_CEILING(p_mtxcb) && p_runtsk->bpriority < p_mtxcb->p_mtxinib->ceilpri) { ercd = E_ILUSE; } else if (p_mtxcb->p_loctsk == NULL) { mutex_acquire(p_runtsk, p_mtxcb); /* * 優先度上限ミューテックスをロックした場合,p_runtskの優先度 * が上がる可能性があるが,ディスパッチが必要になることはない. */ assert(p_runtsk == p_schedtsk); ercd = E_OK; } else if (p_mtxcb->p_loctsk == p_runtsk) { ercd = E_OBJ; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { wobj_make_wait_tmout((WOBJCB *) p_mtxcb, TS_WAITING_MTX, (WINFO_WOBJ *) &winfo_mtx, &tmevtb, tmout); dispatch(); ercd = winfo_mtx.winfo.wercd; } unlock_cpu_dsp(); error_exit: LOG_TLOC_MTX_LEAVE(ercd); return(ercd); }
SYSCALL ER twai_sem(ID semid, TMO tmout) { SEMCB *semcb; WINFO_WOBJ winfo; TMEVTB tmevtb; ER ercd; LOG_TWAI_SEM_ENTER(semid, tmout); CHECK_DISPATCH(); CHECK_SEMID(semid); CHECK_TMOUT(tmout); semcb = get_semcb(semid); t_lock_cpu(); if (semcb->semcnt >= 1) { semcb->semcnt -= 1; ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { wobj_make_wait_tmout((WOBJCB *) semcb, &winfo, &tmevtb, tmout); dispatch(); ercd = winfo.winfo.wercd; } t_unlock_cpu(); exit: LOG_TWAI_SEM_LEAVE(ercd); return(ercd); }
ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) { FLGCB *p_flgcb; WINFO_FLG *p_winfo_flg; ER ercd; PCB *my_p_pcb; TCB *p_runtsk; LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0U); CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW); CHECK_TMOUT(tmout); p_flgcb = get_flgcb(flgid); t_lock_cpu(); my_p_pcb = get_my_p_pcb(); T_CHECK_DISPATCH(my_p_pcb); retry: t_acquire_obj_lock(&GET_OBJLOCK(p_flgcb)); if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U && !queue_empty(&(p_flgcb->wait_queue))) { release_obj_lock(&GET_OBJLOCK(p_flgcb)); ercd = E_ILUSE; } else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) { release_obj_lock(&GET_OBJLOCK(p_flgcb)); ercd = E_OK; } else if (tmout == TMO_POL) { release_obj_lock(&GET_OBJLOCK(p_flgcb)); ercd = E_TMOUT; } else { if ((my_p_pcb = t_acquire_nested_tsk_lock_self(&GET_OBJLOCK(p_flgcb))) == NULL){ goto retry; } p_runtsk = my_p_pcb->p_runtsk; p_winfo_flg = (WINFO_FLG *)(&(p_runtsk->winfo_obj)); p_winfo_flg->waiptn = waiptn; p_winfo_flg->wfmode = wfmode; p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG); wobj_make_wait_tmout((WOBJCB *) p_flgcb, tmout, p_runtsk); release_nested_tsk_lock(my_p_pcb); release_obj_lock(&GET_OBJLOCK(p_flgcb)); dispatch(); ercd = p_runtsk->wercd; if (ercd == E_OK) { *p_flgptn = p_winfo_flg->flgptn; } } t_unlock_cpu(); error_exit: LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn); return(ercd); }
ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) { FLGCB *p_flgcb; WINFO_FLG winfo_flg; TMEVTB tmevtb; ER ercd; LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout); CHECK_DISPATCH(); CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0U); CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW); CHECK_MACV_WRITE(p_flgptn, FLGPTN); CHECK_TMOUT(tmout); 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.acptn2)) { ercd = E_OACV; } else if ((p_flgcb->p_flginib->flgatr & TA_WMUL) == 0U && !queue_empty(&(p_flgcb->wait_queue))) { ercd = E_ILUSE; } else if (check_flg_cond(p_flgcb, waiptn, wfmode, p_flgptn)) { ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else if (p_runtsk->waifbd) { ercd = E_RLWAI; } else { winfo_flg.waiptn = waiptn; winfo_flg.wfmode = wfmode; p_runtsk->tstat = (TS_WAITING | TS_WAIT_FLG); wobj_make_wait_tmout((WOBJCB *) p_flgcb, (WINFO_WOBJ *) &winfo_flg, &tmevtb, tmout); dispatch(); ercd = winfo_flg.winfo.wercd; if (ercd == E_OK) { *p_flgptn = winfo_flg.flgptn; } } t_unlock_cpu(); error_exit: LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn); return(ercd); }
ER tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout) { PDQCB *p_pdqcb; WINFO_PDQ winfo_pdq; TMEVTB tmevtb; bool_t dspreq; ER ercd; LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout); CHECK_DISPATCH(); CHECK_PDQID(pdqid); CHECK_PAR(TMIN_DPRI <= datapri); CHECK_TMOUT(tmout); p_pdqcb = get_pdqcb(pdqid); t_lock_cpu(); if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_pdqcb->p_pdqinib->acvct.acptn1)) { ercd = E_OACV; } else if (!(datapri <= p_pdqcb->p_pdqinib->maxdpri)) { ercd = E_PAR; } else if (send_pridata(p_pdqcb, data, datapri, &dspreq)) { if (dspreq) { dispatch(); } ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else if (p_runtsk->waifbd) { ercd = E_RLWAI; } else { winfo_pdq.data = data; winfo_pdq.datapri = datapri; p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ); wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq, &tmevtb, tmout); dispatch(); ercd = winfo_pdq.winfo.wercd; } t_unlock_cpu(); error_exit: LOG_TSND_PDQ_LEAVE(ercd); return(ercd); }
ER tsnd_mbf(ID mbfid, const void *msg, uint_t msgsz, TMO tmout) { MBFCB *p_mbfcb; WINFO_SMBF winfo_smbf; TMEVTB tmevtb; ER ercd; LOG_TSND_MBF_ENTER(mbfid, msg, msgsz, tmout); CHECK_DISPATCH(); CHECK_ID(VALID_MBFID(mbfid)); CHECK_PAR(VALID_TMOUT(tmout)); CHECK_MACV_BUF_READ(msg, msgsz); CHECK_PAR(0 < msgsz); p_mbfcb = get_mbfcb(mbfid); lock_cpu_dsp(); if (p_mbfcb->p_mbfinib->mbfatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mbfcb->p_mbfinib->acvct.acptn1)) { ercd = E_OACV; } else if (!(msgsz <= p_mbfcb->p_mbfinib->maxmsz)) { ercd = E_PAR; } else if (p_runtsk->raster) { ercd = E_RASTER; } else if (send_message(p_mbfcb, msg, msgsz)) { if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { winfo_smbf.msg = msg; winfo_smbf.msgsz = msgsz; wobj_make_wait_tmout((WOBJCB *) p_mbfcb, TS_WAITING_SMBF, (WINFO_WOBJ *) &winfo_smbf, &tmevtb, tmout); dispatch(); ercd = winfo_smbf.winfo.wercd; } unlock_cpu_dsp(); error_exit: LOG_TSND_MBF_LEAVE(ercd); return(ercd); }
ER tloc_mtx(ID mtxid, TMO tmout) { MTXCB *p_mtxcb; WINFO_MTX winfo_mtx; TMEVTB tmevtb; ER ercd; LOG_TLOC_MTX_ENTER(mtxid, tmout); CHECK_DISPATCH(); CHECK_MTXID(mtxid); CHECK_TMOUT(tmout); p_mtxcb = get_mtxcb(mtxid); t_lock_cpu(); if (MTX_CEILING(p_mtxcb) && p_runtsk->bpriority < p_mtxcb->p_mtxinib->ceilpri) { ercd = E_ILUSE; } else if (p_mtxcb->p_loctsk == NULL) { (void) mutex_acquire(p_runtsk, p_mtxcb); /* * 優先度上限ミューテックスをロックした場合,p_runtskの優先度 * が上がる可能性があるが,ディスパッチが必要になることはない. */ assert(!(p_runtsk != p_schedtsk && dspflg)); ercd = E_OK; } else if (p_mtxcb->p_loctsk == p_runtsk) { ercd = E_OBJ; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { p_runtsk->tstat = (TS_WAITING | TS_WAIT_MTX); wobj_make_wait_tmout((WOBJCB *) p_mtxcb, (WINFO_WOBJ *) &winfo_mtx, &tmevtb, tmout); dispatch(); ercd = winfo_mtx.winfo.wercd; } t_unlock_cpu(); error_exit: LOG_TLOC_MTX_LEAVE(ercd); return(ercd); }
ER twai_sem(ID semid, TMO tmout) { SEMCB *p_semcb; WINFO_SEM winfo_sem; TMEVTB tmevtb; ER ercd; LOG_TWAI_SEM_ENTER(semid, tmout); CHECK_DISPATCH(); CHECK_SEMID(semid); CHECK_TMOUT(tmout); p_semcb = get_semcb(semid); t_lock_cpu(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_semcb->p_seminib->acvct.acptn2)) { ercd = E_OACV; } else if (p_semcb->semcnt >= 1) { p_semcb->semcnt -= 1; 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_SEM); wobj_make_wait_tmout((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem, &tmevtb, tmout); dispatch(); ercd = winfo_sem.winfo.wercd; } t_unlock_cpu(); error_exit: LOG_TWAI_SEM_LEAVE(ercd); return(ercd); }
ER tget_mpf(ID mpfid, void **p_blk, TMO tmout) { MPFCB *p_mpfcb; WINFO_MPF winfo_mpf; TMEVTB tmevtb; ER ercd; LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout); CHECK_DISPATCH(); CHECK_ID(VALID_MPFID(mpfid)); CHECK_PAR(VALID_TMOUT(tmout)); p_mpfcb = get_mpfcb(mpfid); lock_cpu_dsp(); if (p_mpfcb->p_mpfinib->mpfatr == TA_NOEXS) { ercd = E_NOEXS; } else if (p_runtsk->raster) { ercd = E_RASTER; } else if (p_mpfcb->fblkcnt > 0) { get_mpf_block(p_mpfcb, p_blk); ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { p_runtsk->tstat = TS_WAITING_MPF; wobj_make_wait_tmout((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf, &tmevtb, tmout); dispatch(); ercd = winfo_mpf.winfo.wercd; if (ercd == E_OK) { *p_blk = winfo_mpf.blk; } } unlock_cpu_dsp(); error_exit: LOG_TGET_MPF_LEAVE(ercd, p_blk); return(ercd); }
ER twai_sem(ID semid, TMO tmout) { SEMCB *p_semcb; WINFO_SEM winfo_sem; TMEVTB tmevtb; ER ercd; LOG_TWAI_SEM_ENTER(semid, tmout); CHECK_DISPATCH(); CHECK_ID(VALID_SEMID(semid)); CHECK_PAR(VALID_TMOUT(tmout)); p_semcb = get_semcb(semid); lock_cpu_dsp(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_semcb->p_seminib->acvct.acptn2)) { ercd = E_OACV; } else if (p_runtsk->raster) { ercd = E_RASTER; } else if (p_semcb->semcnt >= 1) { p_semcb->semcnt -= 1; ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { wobj_make_wait_tmout((WOBJCB *) p_semcb, TS_WAITING_SEM, (WINFO_WOBJ *) &winfo_sem, &tmevtb, tmout); dispatch(); ercd = winfo_sem.winfo.wercd; } unlock_cpu_dsp(); error_exit: LOG_TWAI_SEM_LEAVE(ercd); return(ercd); }
ER tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout) { PDQCB *p_pdqcb; WINFO_SPDQ winfo_spdq; TMEVTB tmevtb; ER ercd; LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout); CHECK_DISPATCH(); CHECK_ID(VALID_PDQID(pdqid)); CHECK_PAR(VALID_TMOUT(tmout)); p_pdqcb = get_pdqcb(pdqid); CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri); lock_cpu_dsp(); if (p_runtsk->raster) { ercd = E_RASTER; } else if (send_pridata(p_pdqcb, data, datapri)) { if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { winfo_spdq.data = data; winfo_spdq.datapri = datapri; p_runtsk->tstat = TS_WAITING_SPDQ; wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq, &tmevtb, tmout); dispatch(); ercd = winfo_spdq.winfo.wercd; } unlock_cpu_dsp(); error_exit: LOG_TSND_PDQ_LEAVE(ercd); return(ercd); }
SYSCALL ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) { FLGCB *flgcb; WINFO_FLG winfo; TMEVTB tmevtb; ER ercd; LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout); CHECK_DISPATCH(); CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0); CHECK_PAR((wfmode & ~TWF_ORW) == 0); CHECK_TMOUT(tmout); flgcb = get_flgcb(flgid); t_lock_cpu(); if (!(queue_empty(&(flgcb->wait_queue)))) { ercd = E_ILUSE; } else if (eventflag_cond(flgcb, waiptn, wfmode, p_flgptn)) { ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { winfo.waiptn = waiptn; winfo.wfmode = wfmode; wobj_make_wait_tmout((WOBJCB *) flgcb, (WINFO_WOBJ *) &winfo, &tmevtb, tmout); dispatch(); ercd = winfo.winfo.wercd; if (ercd == E_OK) { *p_flgptn = winfo.flgptn; } } t_unlock_cpu(); exit: LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn); return(ercd); }
ER tsnd_mbf(ID mbfid, const void *msg, uint_t msgsz, TMO tmout) { MBFCB *p_mbfcb; WINFO_MBF winfo_mbf; TMEVTB tmevtb; bool_t dspreq; ER ercd; LOG_TSND_MBF_ENTER(mbfid, msg, msgsz, tmout); CHECK_DISPATCH(); CHECK_MBFID(mbfid); CHECK_TMOUT(tmout); p_mbfcb = get_mbfcb(mbfid); CHECK_PAR(0 < msgsz && msgsz <= p_mbfcb->p_mbfinib->maxmsz); t_lock_cpu(); if (send_message(p_mbfcb, msg, msgsz, &dspreq)) { if (dspreq) { dispatch(); } ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { winfo_mbf.msg = (void *) msg; winfo_mbf.msgsz = msgsz; p_runtsk->tstat = (TS_WAITING | TS_WAIT_SMBF); wobj_make_wait_tmout((WOBJCB *) p_mbfcb, (WINFO_WOBJ *) &winfo_mbf, &tmevtb, tmout); dispatch(); ercd = winfo_mbf.winfo.wercd; } t_unlock_cpu(); error_exit: LOG_TSND_MBF_LEAVE(ercd); return(ercd); }
ER trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) { MBXCB *p_mbxcb; WINFO_MBX winfo_mbx; TMEVTB tmevtb; ER ercd; LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout); CHECK_DISPATCH(); CHECK_MBXID(mbxid); CHECK_TMOUT(tmout); p_mbxcb = get_mbxcb(mbxid); t_lock_cpu(); if (p_mbxcb->pk_head != NULL) { *ppk_msg = p_mbxcb->pk_head; p_mbxcb->pk_head = (*ppk_msg)->pk_next; ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX); wobj_make_wait_tmout((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx, &tmevtb, tmout); dispatch(); ercd = winfo_mbx.winfo.wercd; if (ercd == E_OK) { *ppk_msg = winfo_mbx.pk_msg; } } t_unlock_cpu(); error_exit: LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg); return(ercd); }
ER tsnd_dtq(ID dtqid, intptr_t data, TMO tmout) { DTQCB *p_dtqcb; WINFO_DTQ winfo_dtq; TMEVTB tmevtb; bool_t reqdsp; ER ercd; LOG_TSND_DTQ_ENTER(dtqid, data, tmout); CHECK_DISPATCH(); CHECK_DTQID(dtqid); CHECK_TMOUT(tmout); p_dtqcb = get_dtqcb(dtqid); t_lock_cpu(); if (send_data(p_dtqcb, data, &reqdsp)) { if (reqdsp) { dispatch(); } ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { winfo_dtq.data = data; p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ); wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq, &tmevtb, tmout); dispatch(); ercd = winfo_dtq.winfo.wercd; } t_unlock_cpu(); error_exit: LOG_TSND_DTQ_LEAVE(ercd); return(ercd); }
ER tget_mpf(ID mpfid, void **p_blk, TMO tmout) { MPFCB *p_mpfcb; WINFO_MPF winfo_mpf; TMEVTB tmevtb; ER ercd; LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout); CHECK_DISPATCH(); CHECK_MPFID(mpfid); CHECK_TMOUT(tmout); p_mpfcb = get_mpfcb(mpfid); t_lock_cpu(); if (p_mpfcb->fblkcnt > 0) { get_mpf_block(p_mpfcb, p_blk); ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF); wobj_make_wait_tmout((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf, &tmevtb, tmout); dispatch(); ercd = winfo_mpf.winfo.wercd; if (ercd == E_OK) { *p_blk = winfo_mpf.blk; } } t_unlock_cpu(); error_exit: LOG_TGET_MPF_LEAVE(ercd, *p_blk); return(ercd); }
SYSCALL ER trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout) { MBXCB *mbxcb; WINFO_MBX winfo; TMEVTB tmevtb; ER ercd; LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout); CHECK_DISPATCH(); CHECK_MBXID(mbxid); CHECK_TMOUT(tmout); mbxcb = get_mbxcb(mbxid); t_lock_cpu(); if (mbxcb->head != NULL) { *ppk_msg = mbxcb->head; mbxcb->head = (*ppk_msg)->next; ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { wobj_make_wait_tmout((WOBJCB *) mbxcb, (WINFO_WOBJ *) &winfo, &tmevtb, tmout); dispatch(); ercd = winfo.winfo.wercd; if (ercd == E_OK) { *ppk_msg = winfo.pk_msg; } } t_unlock_cpu(); exit: LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg); return(ercd); }