Queue a packet to a port.
#include <zircon/syscalls.h> #include <zircon/syscalls/port.h> zx_status_t zx_port_queue(zx_handle_t handle, const zx_port_packet_t* packet);
zx_port_queue()
queues a packet to the port specified by handle.
typedef struct zx_port_packet { uint64_t key; uint32_t type; zx_status_t status; union { zx_packet_user_t user; zx_packet_signal_t signal; }; } zx_port_packet_t;
In packet type should be ZX_PKT_TYPE_USER and only the user union element is considered valid:
typedef union zx_packet_user { uint64_t u64[4]; uint32_t u32[8]; uint16_t u16[16]; uint8_t c8[32]; } zx_packet_user_t;
handle must be of type ZX_OBJ_TYPE_PORT and have ZX_RIGHT_WRITE.
zx_port_queue()
returns ZX_OK on successful queue of a packet.
ZX_ERR_BAD_HANDLE handle isn't a valid handle
ZX_ERR_INVALID_ARGS packet is an invalid pointer.
ZX_ERR_WRONG_TYPE handle is not a port handle.
ZX_ERR_ACCESS_DENIED handle does not have ZX_RIGHT_WRITE.
ZX_ERR_SHOULD_WAIT the port has too many pending packets. See Full Port Queue.
The queue is drained by calling zx_port_wait()
.
zx_port_queue()
may return ZX_ERR_SHOULD_WAIT indicating that there is no more space available in the queue for new port packets. It is guaranteed that there are packets in the queue available for reading when this occurs. Calling code should arrange to read packets from the queue until at least one ZX_PKT_TYPE_USER packet has been removed from the queue before attempting to enqueue another packet.