ER prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) { PDQCB *p_pdqcb; ER ercd; LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_PDQID(pdqid)); p_pdqcb = get_pdqcb(pdqid); lock_cpu(); if (receive_pridata(p_pdqcb, p_data, p_datapri)) { if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } else { ercd = E_TMOUT; } unlock_cpu(); error_exit: LOG_PRCV_PDQ_LEAVE(ercd, p_data, p_datapri); return(ercd); }
ER ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) { PDQCB *p_pdqcb; ER ercd; LOG_REF_PDQ_ENTER(pdqid, pk_rpdq); CHECK_TSKCTX_UNL(); CHECK_PDQID(pdqid); p_pdqcb = get_pdqcb(pdqid); t_lock_cpu(); if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) { ercd = E_NOEXS; } else { pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue)); pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue)); pk_rpdq->spdqcnt = p_pdqcb->count; ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_REF_PDQ_LEAVE(ercd, pk_rpdq); return(ercd); }
ER sac_pdq(ID pdqid, const ACVCT *p_acvct) { PDQCB *p_pdqcb; PDQINIB *p_pdqinib; ER ercd; LOG_SAC_PDQ_ENTER(pdqid, p_acvct); CHECK_TSKCTX_UNL(); CHECK_PDQID(pdqid); CHECK_MACV_READ(p_acvct, ACVCT); 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.acptn3)) { ercd = E_OACV; } else if (PDQID(p_pdqcb) > tmax_spdqid) { p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib); p_pdqinib->acvct = *p_acvct; ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_SAC_PDQ_LEAVE(ercd); return(ercd); }
ER ini_pdq(ID pdqid) { PDQCB *p_pdqcb; ER ercd; LOG_INI_PDQ_ENTER(pdqid); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_PDQID(pdqid)); p_pdqcb = get_pdqcb(pdqid); lock_cpu(); init_wait_queue(&(p_pdqcb->swait_queue)); init_wait_queue(&(p_pdqcb->rwait_queue)); p_pdqcb->count = 0U; p_pdqcb->p_head = NULL; p_pdqcb->unused = 0U; p_pdqcb->p_freelist = NULL; if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; unlock_cpu(); error_exit: LOG_INI_PDQ_LEAVE(ercd); return(ercd); }
ER prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) { PDQCB *p_pdqcb; bool_t reqdsp; ER ercd; LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri); CHECK_TSKCTX_UNL(); CHECK_PDQID(pdqid); p_pdqcb = get_pdqcb(pdqid); t_lock_cpu(); if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) { ercd = E_NOEXS; } else if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) { if (reqdsp) { dispatch(); } ercd = E_OK; } else { ercd = E_TMOUT; } t_unlock_cpu(); error_exit: LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri); return(ercd); }
ER ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri) { PDQCB *p_pdqcb; bool_t reqdsp; ER ercd; LOG_IPSND_PDQ_ENTER(pdqid, data, datapri); CHECK_INTCTX_UNL(); CHECK_PDQID(pdqid); p_pdqcb = get_pdqcb(pdqid); CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri); i_lock_cpu(); if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) { ercd = E_NOEXS; } else if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) { if (reqdsp) { reqflg = true; } ercd = E_OK; } else { ercd = E_TMOUT; } i_unlock_cpu(); error_exit: LOG_IPSND_PDQ_LEAVE(ercd); return(ercd); }
ER psnd_pdq(ID pdqid, intptr_t data, PRI datapri) { PDQCB *p_pdqcb; ER ercd; LOG_PSND_PDQ_ENTER(pdqid, data, datapri); CHECK_UNL(); CHECK_ID(VALID_PDQID(pdqid)); p_pdqcb = get_pdqcb(pdqid); CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri); lock_cpu(); if (send_pridata(p_pdqcb, data, datapri)) { if (p_runtsk != p_schedtsk) { if (!sense_context()) { dispatch(); } else { request_dispatch(); } } ercd = E_OK; } else { ercd = E_TMOUT; } unlock_cpu(); error_exit: LOG_PSND_PDQ_LEAVE(ercd); return(ercd); }
ER trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout) { PDQCB *p_pdqcb; WINFO_PDQ winfo_pdq; TMEVTB tmevtb; bool_t dspreq; ER ercd; LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout); CHECK_DISPATCH(); CHECK_PDQID(pdqid); CHECK_MACV_WRITE(p_data, intptr_t); CHECK_MACV_WRITE(p_datapri, PRI); 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.acptn2)) { ercd = E_OACV; } else if (receive_pridata(p_pdqcb, p_data, p_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 { p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ); make_wait_tmout(&(winfo_pdq.winfo), &tmevtb, tmout); queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue)); winfo_pdq.p_pdqcb = p_pdqcb; LOG_TSKSTAT(p_runtsk); dispatch(); ercd = winfo_pdq.winfo.wercd; if (ercd == E_OK) { *p_data = winfo_pdq.data; *p_datapri = winfo_pdq.datapri; } } t_unlock_cpu(); error_exit: LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri); 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 trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout) { PDQCB *p_pdqcb; WINFO_RPDQ winfo_rpdq; TMEVTB tmevtb; ER ercd; LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout); CHECK_DISPATCH(); CHECK_ID(VALID_PDQID(pdqid)); CHECK_PAR(VALID_TMOUT(tmout)); p_pdqcb = get_pdqcb(pdqid); lock_cpu_dsp(); if (p_runtsk->raster) { ercd = E_RASTER; } else if (receive_pridata(p_pdqcb, p_data, p_datapri)) { if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { p_runtsk->tstat = TS_WAITING_RPDQ; make_wait_tmout(&(winfo_rpdq.winfo), &tmevtb, tmout); queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue)); winfo_rpdq.p_pdqcb = p_pdqcb; LOG_TSKSTAT(p_runtsk); dispatch(); ercd = winfo_rpdq.winfo.wercd; if (ercd == E_OK) { *p_data = winfo_rpdq.data; *p_datapri = winfo_rpdq.datapri; } } unlock_cpu_dsp(); error_exit: LOG_TRCV_PDQ_LEAVE(ercd, p_data, p_datapri); return(ercd); }
ER del_pdq(ID pdqid) { PDQCB *p_pdqcb; PDQINIB *p_pdqinib; bool_t dspreq; ER ercd; LOG_DEL_PDQ_ENTER(pdqid); CHECK_TSKCTX_UNL(); CHECK_PDQID(pdqid); 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.acptn3)) { ercd = E_OACV; } else if (PDQID(p_pdqcb) > tmax_spdqid) { dspreq = init_wait_queue(&(p_pdqcb->swait_queue)); if (init_wait_queue(&(p_pdqcb->rwait_queue))) { dspreq = true; } p_pdqinib = (PDQINIB *)(p_pdqcb->p_pdqinib); if ((p_pdqinib->pdqatr & TA_MBALLOC) != 0U) { kernel_free(p_pdqinib->p_pdqmb); } p_pdqinib->pdqatr = TA_NOEXS; queue_insert_prev(&free_pdqcb, &(p_pdqcb->swait_queue)); if (dspreq) { dispatch(); } ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_DEL_PDQ_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); }
ER rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) { PDQCB *p_pdqcb; WINFO_PDQ winfo_pdq; bool_t reqdsp; ER ercd; LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri); CHECK_DISPATCH(); CHECK_PDQID(pdqid); p_pdqcb = get_pdqcb(pdqid); t_lock_cpu(); if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) { ercd = E_NOEXS; } else if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) { if (reqdsp) { dispatch(); } ercd = E_OK; } else { p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ); make_wait(&(winfo_pdq.winfo)); queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue)); winfo_pdq.p_pdqcb = p_pdqcb; LOG_TSKSTAT(p_runtsk); dispatch(); ercd = winfo_pdq.winfo.wercd; if (ercd == E_OK) { *p_data = winfo_pdq.data; *p_datapri = winfo_pdq.datapri; } } t_unlock_cpu(); error_exit: LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri); return(ercd); }
ER ref_pdq(ID pdqid, T_RPDQ *pk_rpdq) { PDQCB *p_pdqcb; ER ercd; LOG_REF_PDQ_ENTER(pdqid, pk_rpdq); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_PDQID(pdqid)); p_pdqcb = get_pdqcb(pdqid); lock_cpu(); pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue)); pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue)); pk_rpdq->spdqcnt = p_pdqcb->count; ercd = E_OK; unlock_cpu(); error_exit: LOG_REF_PDQ_LEAVE(ercd, pk_rpdq); return(ercd); }
ER ini_pdq(ID pdqid) { PDQCB *p_pdqcb; bool_t dspreq; ER ercd; LOG_INI_PDQ_ENTER(pdqid); CHECK_TSKCTX_UNL(); CHECK_PDQID(pdqid); 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.acptn3)) { ercd = E_OACV; } else { dspreq = init_wait_queue(&(p_pdqcb->swait_queue)); if (init_wait_queue(&(p_pdqcb->rwait_queue))) { dspreq = true; } p_pdqcb->count = 0U; p_pdqcb->p_head = NULL; p_pdqcb->unused = 0U; p_pdqcb->p_freelist = NULL; if (dspreq) { dispatch(); } ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_INI_PDQ_LEAVE(ercd); return(ercd); }
ER snd_pdq(ID pdqid, intptr_t data, PRI datapri) { PDQCB *p_pdqcb; WINFO_PDQ winfo_pdq; bool_t reqdsp; ER ercd; LOG_SND_PDQ_ENTER(pdqid, data, datapri); CHECK_DISPATCH(); CHECK_PDQID(pdqid); p_pdqcb = get_pdqcb(pdqid); CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri); t_lock_cpu(); if (p_pdqcb->p_pdqinib->pdqatr == TA_NOEXS) { ercd = E_NOEXS; } else if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) { if (reqdsp) { dispatch(); } ercd = E_OK; } else { winfo_pdq.data = data; winfo_pdq.datapri = datapri; p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ); wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq); dispatch(); ercd = winfo_pdq.winfo.wercd; } t_unlock_cpu(); error_exit: LOG_SND_PDQ_LEAVE(ercd); return(ercd); }
ER psnd_pdq(ID pdqid, intptr_t data, PRI datapri) { PDQCB *p_pdqcb; bool_t dspreq; ER ercd; LOG_PSND_PDQ_ENTER(pdqid, data, datapri); CHECK_TSKCTX_UNL(); CHECK_PDQID(pdqid); CHECK_PAR(TMIN_DPRI <= datapri); 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 { ercd = E_TMOUT; } t_unlock_cpu(); error_exit: LOG_PSND_PDQ_LEAVE(ercd); return(ercd); }
ER prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) { PDQCB *p_pdqcb; bool_t dspreq; ER ercd; LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri); CHECK_TSKCTX_UNL(); CHECK_PDQID(pdqid); CHECK_MACV_WRITE(p_data, intptr_t); CHECK_MACV_WRITE(p_datapri, PRI); 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.acptn2)) { ercd = E_OACV; } else if (receive_pridata(p_pdqcb, p_data, p_datapri, &dspreq)) { if (dspreq) { dispatch(); } ercd = E_OK; } else { ercd = E_TMOUT; } t_unlock_cpu(); error_exit: LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri); return(ercd); }