ER rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) { PDQCB *p_pdqcb; WINFO_PDQ winfo_pdq; bool_t dspreq; ER ercd; LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri); CHECK_DISPATCH(); 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 if (p_runtsk->waifbd) { ercd = E_RLWAI; } 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 rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri) { PDQCB *p_pdqcb; WINFO_RPDQ winfo_rpdq; ER ercd; LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri); CHECK_DISPATCH(); CHECK_ID(VALID_PDQID(pdqid)); 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 { p_runtsk->tstat = TS_WAITING_RPDQ; make_wait(&(winfo_rpdq.winfo)); 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_RCV_PDQ_LEAVE(ercd, p_data, p_datapri); return(ercd); }