摘要
等待多个对象上的信号。
声明
#include <zircon/syscalls.h>
zx_status_t zx_object_wait_many(zx_wait_item_t* items,
size_t num_items,
zx_time_t deadline);
说明
zx_object_wait_many()
是会导致调用方等待的阻塞系统调用
直到最后期限过后,或
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,用于指示应唤醒哪些信号
调用线程。
deadline 参数用于指定与以下日期相关的截止期限:
ZX_CLOCK_MONOTONIC
,系统会根据作业的
计时器延迟政策。ZX_TIME_INFINITE
是一个特殊值,表示等待
无限可能。
返回后,items 的 pending 字段会填充为位图,表示 各个项的待处理信号
可以等待的条目数上限为 ZX_WAIT_MANY_MAX_ITEMS
,
也就是 64如需一次等待更多对象,请使用端口。
权限
每个 items 条目都必须包含一个带有 ZX_RIGHT_WAIT
的 handle 字段。
返回值
如果任一 waitfor 信号发生以下情况,zx_object_wait_many()
会返回 ZX_OK
:
在进行调用时处于活动状态,或者之前在各自对象上观察到
截止日期已过。
如果为 ZX_ERR_TIMED_OUT
,则 items 可能会反映状态更改
发生的事件。
如果为 ZX_ERR_CANCELED
,则等待的一个或多个项目
以及这些内容的待处理字段
将设置 ZX_SIGNAL_HANDLE_CLOSED
位。
对于任何其他返回值,items 的 pending 字段均未定义。
错误
ZX_ERR_INVALID_ARGS
items 不是有效的指针。
ZX_ERR_OUT_OF_RANGE
计数大于 ZX_WAIT_MANY_MAX_ITEMS
。
ZX_ERR_BAD_HANDLE
items 中有一项包含无效的句柄。
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
因内存不足而失败。
用户空间没有好办法处理这种(不太可能)错误。
在将来的版本中,此错误不会再发生。
错误
更恰当地将 pending 称为 observ。
备注
如需详细了解信号及其术语,请参阅信号。