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_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 数组中提供 countzx_wait_item_t,其中包含要等待的每个项目的句柄和信号位掩码。每个项都应包含一个有效的 handle(用于引用要等待的对象)和一个位掩码 waitfor(用于指示哪些信号应唤醒调用线程)。

截止期限参数指定了相对于 ZX_CLOCK_MONOTONIC 的截止期限,并将根据作业的 timer 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_OUT可能会反映在截止时间过后但在系统调用返回之前发生的状态变化。

如果发生 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 其中一个商品包含无效句柄。

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

待处理更恰当的名称应为已观测到

备注

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

另请参阅