zx_object_wait_MANY

总结

等待多个对象的信号。

声明

#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 是一个特殊值,表示永久等待。

返回后,itemspending 字段中会填入位图,指示每件商品的哪些信号待处理。

可以等待的最大项数为 ZX_WAIT_MANY_MAX_ITEMS,即 64。如需一次等待更多对象,请使用端口

权限

每个 items 条目都必须有一个包含 ZX_RIGHT_WAIThandle 字段。

返回值

如果在调用时有任何 waitfor 信号处于活跃状态,或者在 deadline 过去之前在各自的对象上观察到任何信号,则 zx_object_wait_many() 会返回 ZX_OK

如果为 ZX_ERR_TIMED_OUTitems 可能反映了在截止时间过后,但在系统调用返回之前发生的状态更改。

ZX_ERR_CANCELED 事件中,处于等待状态的一个或多个项的句柄已关闭,并且这些项的 pending 字段将设置 ZX_SIGNAL_HANDLE_CLOSED 位。

对于任何其他返回值,itemspending 字段都未定义。

错误

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

备注

如需详细了解信号及其术语,请参阅信号

另请参阅