| <!-- |
| Copyright 2023 The Fuchsia Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| |
| DO NOT EDIT. Generated from FIDL library zx by zither, a Fuchsia platform tool. |
| |
| See //docs/reference/syscalls/README.md#documentation-generation for |
| regeneration instructions. |
| --> |
| |
| # zx_object_wait_many |
| |
| ## Summary |
| |
| Wait for signals on multiple objects. |
| |
| ## Declaration |
| |
| ```c |
| #include <zircon/syscalls.h> |
| |
| zx_status_t zx_object_wait_many(zx_wait_item_t* items, |
| size_t num_items, |
| zx_instant_mono_t deadline); |
| ``` |
| |
| ## Description |
| |
| `zx_object_wait_many()` is a blocking syscall that causes the caller to wait |
| until either the *deadline* passes or at least one object referred to in |
| *items* has a specified [signal][signals] asserted. If an object is already |
| asserting at least one of the specified signals, the wait ends immediately with |
| `ZX_OK`. |
| |
| ```c |
| typedef struct { |
| zx_handle_t handle; |
| zx_signals_t waitfor; |
| zx_signals_t pending; |
| } zx_wait_item_t; |
| ``` |
| |
| The caller must provide *count* `zx_wait_item_t`s in the *items* array, |
| containing the handle and signals bitmask to wait for for each item. |
| Each item should contain a valid *handle* referring to an object to |
| wait for, and a bitmask *waitfor* indicating which signals should wake |
| the calling thread. |
| |
| The *deadline* parameter specifies a deadline with respect to |
| `ZX_CLOCK_MONOTONIC` and will be automatically adjusted according to the job's |
| [timer slack] policy. `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 maximum number of items that may be waited upon is `ZX_WAIT_MANY_MAX_ITEMS`, |
| which is 64. To wait on more objects at once use [Ports](/docs/reference/kernel_objects/port.md). |
| |
| ## Rights |
| |
| Every entry of *items* must have a *handle* field with `ZX_RIGHT_WAIT`. |
| |
| ## Return value |
| |
| `zx_object_wait_many()` returns `ZX_OK` if any of *waitfor* signals were |
| active when the call was made, or 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 passed, 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. Note that calls with a |
| *count* of 0 will still wait until *deadline* has passed before returning. |
| |
| `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` Failure due to lack of memory. |
| There is no good way for userspace to handle this (unlikely) error. |
| In a future build this error will no longer occur. |
| |
| ## BUGS |
| |
| *pending* more properly should be called *observed*. |
| |
| ## Notes |
| |
| See [signals] for more information about signals and their terminology. |
| |
| ## See also |
| |
| - [signals] |
| - [timer slack] |
| - [`zx_object_wait_async()`] |
| - [`zx_object_wait_one()`] |
| |
| [signals]: /docs/concepts/kernel/signals.md |
| [timer slack]: /docs/concepts/kernel/timer_slack.md |
| [`zx_object_wait_async()`]: object_wait_async.md |
| [`zx_object_wait_one()`]: object_wait_one.md |