# zx_port_queue ## NAME port_queue - queue a packet to an port ## SYNOPSIS ``` #include #include zx_status_t zx_port_queue(zx_handle_t handle, const zx_port_packet_t* packet); ``` ## DESCRIPTION `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; ``` ## RIGHTS *handle* must be of type **ZX_OBJ_TYPE_PORT** and have **ZX_RIGHT_WRITE**. ## RETURN VALUE `zx_port_queue()` returns **ZX_OK** on successful queue of a packet. ## ERRORS **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. Once a thread has drained some packets a new `zx_port_queue()` call will likely succeed. ## NOTES The queue is drained by calling [`zx_port_wait()`]. ## SEE ALSO - [`zx_port_create()`] - [`zx_port_wait()`] [`zx_port_create()`]: port_create.md [`zx_port_wait()`]: port_wait.md