blob: 219d7282baaf3218dc0b53589bd177df1f7f834e [file] [log] [blame] [view]
# zx_object_wait_many
## NAME
object_wait_many - wait for signals on multiple objects
## SYNOPSIS
```
#include <zircon/syscalls.h>
zx_status_t zx_object_wait_many(zx_wait_item_t* items, uint32_t count, zx_time_t deadline);
typedef struct {
zx_handle_t handle;
zx_signals_t waitfor;
zx_signals_t pending;
} zx_wait_item_t;
```
## DESCRIPTION
**object_wait_many**() is a blocking syscall which causes the caller to
wait until at least one of the specified signals is pending on one of
the specified *items*, or until *deadline* passes, whichever comes first.
The caller must provide *count* zx_wait_item_ts in the *items* array,
containing the handle and signals bitmask to wait for for each item.
The *deadline* parameter specifies a deadline with respect to
**ZX_CLOCK_MONOTONIC**. **ZX_TIME_INFINITE** is a special value meaning wait forever.
Upon return, the *pending* field of *items* is filled with bitmaps indicating
which signals are pending for each item.
The *pending* signals in *items* may not reflect the actual state of the object's
signals if the state of the object was modified by another thread or
process. (For example, a Channel ceases asserting **ZX_CHANNEL_READABLE**
once the last message in its queue is read).
The maximum number of items that may be waited upon is **ZX_WAIT_MANY_MAX_ITEMS**,
which is 8. To wait on more things at once use [Ports](../objects/port.md).
## RETURN VALUE
**object_wait_many**() returns **ZX_OK** if any of *waitfor* signals were
observed on their respective object before *deadline* passed.
In the event of **ZX_ERR_TIMED_OUT**, *items* may reflect state changes
that occurred after the deadline pased, but before the syscall returned.
In the event of **ZX_ERR_CANCELED**, one or more of the items being waited
upon have had their handles closed, and the *pending* field for those items
will have the **ZX_SIGNAL_HANDLE_CLOSED** bit set.
For any other return value, the *pending* fields of *items* are undefined.
## ERRORS
**ZX_ERR_INVALID_ARGS** *items* isn't a valid pointer.
**ZX_ERR_OUT_OF_RANGE** *count* is greater than **ZX_WAIT_MANY_MAX_ITEMS**.
**ZX_ERR_BAD_HANDLE** one of *items* contains an invalid handle.
**ZX_ERR_ACCESS_DENIED** One or more of the provided *handles* does not
have **ZX_RIGHT_WAIT** and may not be waited upon.
**ZX_ERR_CANCELED** One or more of the provided *handles* was invalidated
(e.g., closed) during the wait.
**ZX_ERR_TIMED_OUT** The specified deadline passed before any of the specified signals are
observed on any of the specified handles.
**ZX_ERR_NOT_SUPPORTED** One of the *items* contains a handle that cannot
be waited one (for example, a Port handle).
**ZX_ERR_NO_MEMORY** (Temporary) failure due to lack of memory.
## BUGS
*pending* more properly should be called *observed*.
## SEE ALSO
[object_wait_many](object_wait_many.md),
[object_wait_one](object_wait_one.md).