blob: c4bc782c70da22c55a7388d67e70b40665b24113 [file] [log] [blame] [view]
# 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).