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 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); }