Receive a pulse on a channel
#include <sys/neutrino.h> int MsgReceivePulsev( int chid, const iov_t * piov, int parts, struct _msg_info * info ); int MsgReceivePulsev_r( int chid, const iov_t * piov, int parts, struct _msg_info * info );
Use the -l c option to qcc to link against this library. This library is usually included automatically.
The MsgReceivePulsev() and MsgReceivePulsev_r() kernel calls wait for a pulse to arrive on the channel identified by chid and places the received data in the array of buffers pointed to by piov.
These functions are identical, except in the way they indicate errors; see the Returns section for details.
The number of bytes transferred is the minimum of that specified by both the sender and the receiver. The received data isn't allowed to overflow the receive buffer area provided.
|The first buffer of the IOV (input/output vector) must be big enough to contain a pulse. If it isn't, the functions indicate an error of EFAULT.|
If a pulse is waiting on the channel when you call MsgReceivePulsev(), the calling thread doesn't block, and the pulse is immediately copied. If a pulse isn't waiting, the calling thread enters the RECEIVE-blocked state until a pulse arrives.
If multiple pulses are sent to a channel without a thread waiting to receive them, the pulses are queued in priority order.
|The thread's effective priority might change when it receives a pulse. For more information, see “Priority inheritance and messages” in the Interprocess Communication (IPC) chapter of the System Architecture guide.|
On success, MsgReceivePulsev() and MsgReceivePulsev_r() return 0 to indicate that they received a pulse. When a pulse is received:
|STATE_RECEIVE||There's no pulse waiting.|
The only difference between MsgReceivePulsev() and MsgReceivePulsev_r() is the way they indicate errors. On success, they both return 0.
If an error occurs:
MsgDeliverEvent(), MsgReceive(), MsgReceivePulse(), MsgReceivev(), MsgSendPulse(), _pulse, TimerTimeout()