ER snd_pdq(ID pdqid, intptr_t data, PRI datapri) { PDQCB *p_pdqcb; WINFO_PDQ winfo_pdq; bool_t dspreq; ER ercd; LOG_SND_PDQ_ENTER(pdqid, data, datapri); CHECK_DISPATCH(); 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 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((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 snd_pdq(ID pdqid, intptr_t data, PRI datapri) { PDQCB *p_pdqcb; WINFO_SPDQ winfo_spdq; ER ercd; LOG_SND_PDQ_ENTER(pdqid, data, datapri); CHECK_DISPATCH(); CHECK_ID(VALID_PDQID(pdqid)); 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 { winfo_spdq.data = data; winfo_spdq.datapri = datapri; p_runtsk->tstat = TS_WAITING_SPDQ; wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_spdq); dispatch(); ercd = winfo_spdq.winfo.wercd; } unlock_cpu_dsp(); error_exit: LOG_SND_PDQ_LEAVE(ercd); return(ercd); }