ER rcv_mbx(ID mbxid, T_MSG **ppk_msg) { MBXCB *p_mbxcb; WINFO_MBX winfo_mbx; ER ercd; LOG_RCV_MBX_ENTER(mbxid, ppk_msg); CHECK_DISPATCH(); CHECK_MBXID(mbxid); 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 { p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX); wobj_make_wait((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx); dispatch(); ercd = winfo_mbx.winfo.wercd; if (ercd == E_OK) { *ppk_msg = winfo_mbx.pk_msg; } } t_unlock_cpu(); error_exit: LOG_RCV_MBX_LEAVE(ercd, *ppk_msg); return(ercd); }
SYSCALL ER rcv_mbx(ID mbxid, T_MSG **ppk_msg) { MBXCB *mbxcb; WINFO_MBX winfo; ER ercd; LOG_RCV_MBX_ENTER(mbxid, ppk_msg); CHECK_DISPATCH(); CHECK_MBXID(mbxid); mbxcb = get_mbxcb(mbxid); t_lock_cpu(); if (mbxcb->head != NULL) { *ppk_msg = mbxcb->head; mbxcb->head = (*ppk_msg)->next; ercd = E_OK; } else { wobj_make_wait((WOBJCB *) mbxcb, (WINFO_WOBJ *) &winfo); dispatch(); ercd = winfo.winfo.wercd; if (ercd == E_OK) { *ppk_msg = winfo.pk_msg; } } t_unlock_cpu(); exit: LOG_RCV_MBX_LEAVE(ercd, *ppk_msg); return(ercd); }