| # zx_object_wait_async |
| |
| ## NAME |
| |
| object_wait_async - subscribe for signals on an object |
| |
| ## SYNOPSIS |
| |
| ``` |
| #include <zircon/syscalls.h> |
| |
| zx_status_t zx_object_wait_async(zx_handle_t handle, |
| zx_handle_t port, |
| uint64_t key, |
| zx_signals_t signals, |
| uint32_t options); |
| ``` |
| |
| ## DESCRIPTION |
| |
| **object_wait_async**() is a non-blocking syscall which causes packets to be |
| enqueued on *port* when the the specified condition is met. |
| Use **port_wait**() to retrieve the packets. |
| |
| *handle* points to the object that is to be watched for changes and must be a waitable object. |
| |
| The *options* argument can be either **ZX_WAIT_ASYNC_ONCE** or **ZX_WAIT_ASYNC_REPEATING**. |
| |
| In both cases, *signals* indicates which signals on the object specified by *handle* |
| will cause a packet to be enqueued, and if **any** of those signals are active when |
| **object_wait_async**() is called, or become asserted afterwards, a packet will be |
| enqueued on *port*. |
| |
| In the case of **ZX_WAIT_ASYNC_ONCE**, once a packet has been enqueued the asynchronous |
| waiting ends. No further packets will be enqueued. |
| |
| In the case of **ZX_WAIT_ASYNC_REPEATING** the asynchronous waiting continues until |
| canceled. If any of *signals* are asserted and a packet is not currently in *port*'s |
| queue on behalf of this wait, a packet is enqueued. If a packet is already in the |
| queue, the packet's *observed* field is updated. This mode acts in an edge-triggered |
| fashion. |
| |
| In either mode, **port_cancel**() will terminate the operation and if a packet was |
| in the queue on behalf of the operation, that packet will be removed from the queue. |
| |
| If the handle is closed, the operation will also be terminated, but packets already |
| in the queue are not affected. |
| |
| See [port_wait](port_wait.md) for more information about each type |
| of packet and their semantics. |
| |
| ## RETURN VALUE |
| |
| **object_wait_async**() returns **ZX_OK** if the subscription succeeded. |
| |
| ## ERRORS |
| |
| **ZX_ERR_INVALID_ARGS** *options* is not **ZX_WAIT_ASYNC_ONCE** or **ZX_WAIT_ASYNC_REPEATING**. |
| |
| **ZX_ERR_BAD_HANDLE** *handle* is not a valid handle or *port* is not a valid handle. |
| |
| **ZX_ERR_WRONG_TYPE** *port* is not a Port handle. |
| |
| **ZX_ERR_ACCESS_DENIED** *handle* does not have **ZX_RIGHT_WAIT** or *port* |
| does not have **ZX_RIGHT_WRITE**. |
| |
| **ZX_ERR_NOT_SUPPORTED** *handle* is a handle that cannot be waited on. |
| |
| **ZX_ERR_NO_MEMORY** Temporary out of memory condition. |
| |
| ## NOTES |
| |
| See [signals](../signals.md) for more information about signals and their terminology. |
| |
| |
| ## SEE ALSO |
| |
| [port_cancel](port_cancel.md). |
| [port_queue](port_queue.md). |
| [port_wait](port_wait.md). |
| |