总结
等待多个对象的信号。
声明
#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 中引用的至少一个对象断言了指定的信号。如果某个对象已在断言至少一个指定信号,则等待会立即结束并显示 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
,其中包含每个项等待的句柄和信号位掩码。每个项目都应包含一个有效句柄(引用待等待的对象),以及一个位掩码 waitfor(用于指示哪些信号应唤醒发起调用的线程)。
deadline 参数指定相对于 ZX_CLOCK_MONOTONIC
的截止时间,它将根据作业的计时器 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
,items 可能反映了在截止时间过后,但在系统调用返回之前发生的状态更改。
在 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
,有一项 items 包含无效句柄。
ZX_ERR_ACCESS_DENIED
提供的一个或多个句柄没有 ZX_RIGHT_WAIT
,因此可能不会等待。
ZX_ERR_CANCELED
所提供的一个或多个句柄在等待期间已失效(例如,已关闭)。
ZX_ERR_TIMED_OUT
:在任何指定句柄上观察到任何指定信号之前经过的指定时限。请注意,count 为 0 的调用仍会等到 deadline 过后才会返回。
ZX_ERR_NOT_SUPPORTED
其中一个 items 包含一个无法等待的句柄(例如,端口句柄)。
ZX_ERR_NO_MEMORY
由于内存不足而失败。
用户空间没有什么方法来处理此(不太可能)错误。在以后的 build 中,此错误不会再发生。
bug
pending 更合适的称为 obified。
备注
如需详细了解信号及其术语,请参阅信号。