zx_object_wait_async

摘要

订阅对象的信号。

声明

#include <zircon/syscalls.h>

zx_status_t zx_object_wait_async(zx_handle_t handle,
                                 zx_handle_t port,
                                 uint64_t key,
                                 zx_signals_t signals,
                                 uint32_t options);

说明

zx_object_wait_async() 是一个非阻塞系统调用,会导致数据包 当 handle 指定的对象具有一个或多个 断言指定的 signals。使用 zx_port_wait() 检索数据包。

handle 指向要监视更改的对象,并且必须是可等待的对象。

options 参数可以是 0,也可以是以下一个或多个参数:

  • ZX_WAIT_ASYNC_TIMESTAMP,这会导致系统在发生以下情况时捕获时间戳: 触发等待。
  • ZX_WAIT_ASYNC_EDGE 会导致端口不将有效信号的数据包加入队列 在调用 zx_object_wait_async() 时触发。

signals 参数是一个位掩码,用于指示对象上的哪些信号 handle 指定的会导致数据包加入队列。

不使用 ZX_WAIT_ASYNC_EDGE(如果信号中有 any 的信号有效) 当 zx_object_wait_async() 被调用或此后变为活动状态时,数据包将 在 port 上加入队列。

如果使用 ZX_WAIT_ASYNC_EDGE,数据包将仅在执行一个或多个其他操作之后才会在 port 上加入队列。 信号中的信号已从无效变为有效。使用此选项时 请务必注意,处于非活动状态的信号 zx_object_wait_async() 通话已完成。在这种情况下,可能会错过 任何数据包都不会排入该端口例如,这通常用于 然后再执行非阻塞 I/O,直到信号变为非活动状态, 随后从非活动状态转换为活动状态将导致数据包被排入队列。

数据包加入队列后,将包含当前声明的所有信号 (而不仅仅是 signals 参数中列出的信号)。数据包加入队列后 异步等待结束。没有其他数据包加入队列。请注意,信号 与端口所维护的状态通过“或”操作,因此,您可能会看到所请求的 在 zx_port_wait() 返回时发出信号。

每次调用 zx_object_wait_async() 都会创建一个新的异步等待操作, 即观察器。这些操作不会以任何方式删除重复信息。也就是说,如果 使用相同的参数调用 zx_object_wait_async() 两次,共两项操作 创建项目。如果断言的信号与这些操作匹配,那么两个数据包 将加入队列,每个操作一个。

每个充电桩可执行的操作数量是有限制的。当 已超出,作业政策异常 (ZX_EXCP_POLICY_CODE_PORT_TOO_MANY_OBSERVERS) 由超出限制的进程引发。

zx_port_cancel() 会通过以下方式终止所有异步等待操作: handleport此外,所有数据包 这些操作生成的队列将会从队列中移除。

如果 handle 已关闭,则与其关联的操作也将 已终止,但队列中已有的数据包不受影响。

通过此系统调用生成的数据包的 type 将设置为 ZX_PKT_TYPE_SIGNAL_ONE 且并集的类型为 zx_packet_signal_t

typedef struct zx_packet_signal {
    zx_signals_t trigger;
    zx_signals_t observed;
    uint64_t count;
    zx_time_t timestamp;       // depends on ZX_WAIT_ASYNC_TIMESTAMP
    uint64_t reserved1;
} zx_packet_signal_t;

trigger 是指在调用 zx_object_wait_async() 时使用的信号, 观察到的信号是实际观察到的信号,时间戳是时钟单调的 对象状态转换为满足触发条件的时间。如果 选项不包含 ZX_WAIT_ASYNC_TIMESTAMP,则报告为 0。

使用 zx_port_packet_tkey 成员跟踪此数据包对应的对象。

权限

handle 必须具有 ZX_RIGHT_WAIT

port 的类型必须为 ZX_OBJ_TYPE_PORT 且包含 ZX_RIGHT_WRITE

返回值

如果订阅成功,zx_object_wait_async() 会返回 ZX_OK

错误

ZX_ERR_INVALID_ARGS 选项的位不是 ZX_WAIT_ASYNC_TIMESTAMP 并设置了 ZX_WAIT_ASYNC_EDGE

ZX_ERR_BAD_HANDLE handle 不是有效的句柄,或 port 不是有效的句柄。

ZX_ERR_WRONG_TYPE port 不是端口句柄。

ZX_ERR_ACCESS_DENIED 句柄没有 ZX_RIGHT_WAITport 不包含 ZX_RIGHT_WRITE

ZX_ERR_NOT_SUPPORTED handle 是一个不能等待的句柄。

ZX_ERR_NO_MEMORY 因内存不足而失败。 用户空间没有好办法处理这种(不太可能)错误。 在将来的版本中,此错误不会再发生。

备注

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

另请参阅