摘要
等待多个对象上的信号。
声明
#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);
说明
zx_object_wait_many() 是一个阻塞系统调用,它会导致调用方等待,直到 deadline 过去或 items 中引用的至少一个对象断言了指定的 signal。如果某个对象已断言至少一个指定信号,则等待会立即结束并返回 ZX_OK。
typedef struct {
zx_handle_t handle;
zx_signals_t waitfor;
zx_signals_t pending;
} zx_wait_item_t;
调用方必须在 items 数组中提供 count 个 zx_wait_item_t,其中包含要等待的每个项目的句柄和信号位掩码。每个项都应包含一个有效的 handle(用于引用要等待的对象)和一个位掩码 waitfor(用于指示哪些信号应唤醒调用线程)。
截止期限参数指定了相对于 ZX_CLOCK_MONOTONIC 的截止期限,并将根据作业的 timer slack 政策自动调整。ZX_TIME_INFINITE 是一个特殊值,表示永远等待。
返回时,items 的 pending 字段会填充位图,用于指示每个商品有哪些信号处于待处理状态。
可等待的最大项数为 ZX_WAIT_MANY_MAX_ITEMS,即 64。如需一次等待更多对象,请使用端口。
权限
items 的每个条目都必须具有一个值为 ZX_RIGHT_WAIT 的 handle 字段。
返回值
如果在调用时任何 waitfor 信号处于有效状态,或者在 deadline 过去之前在各自的对象上观察到这些信号,zx_object_wait_many() 会返回 ZX_OK。
如果发生 ZX_ERR_TIMED_OUT,项可能会反映在截止时间过后但在系统调用返回之前发生的状态变化。
如果发生 ZX_ERR_CANCELED,则表示一个或多个等待项的句柄已关闭,并且这些项的 pending 字段将设置 ZX_SIGNAL_HANDLE_CLOSED 位。
对于任何其他返回值,items 的 pending 字段都是未定义的。
错误
ZX_ERR_INVALID_ARGS items 不是有效的指针。
ZX_ERR_OUT_OF_RANGE count 大于 ZX_WAIT_MANY_MAX_ITEMS。
ZX_ERR_BAD_HANDLE 其中一个商品包含无效句柄。
ZX_ERR_ACCESS_DENIED 所提供的一个或多个句柄没有 ZX_RIGHT_WAIT,可能无法等待。
ZX_ERR_CANCELED 在等待期间,提供的一个或多个句柄失效(例如,已关闭)。
ZX_ERR_TIMED_OUT 在任何指定句柄上观察到任何指定信号之前,指定的截止时间已过。请注意,即使 count 为 0,调用仍会等待到 deadline 过期后才返回。
ZX_ERR_NOT_SUPPORTED 其中一个项包含无法等待的句柄(例如,端口句柄)。
ZX_ERR_NO_MEMORY 因内存不足而导致的失败。
用户空间无法妥善处理此(不太可能发生的)错误。
在未来的 build 中,此错误将不再发生。
BUG
待处理更恰当的名称应为已观测到。
备注
如需详细了解信号及其术语,请参阅信号。