总结
将中断对象绑定到端口。
声明
#include <zircon/syscalls.h>
zx_status_t zx_interrupt_bind(zx_handle_t handle,
zx_handle_t port_handle,
uint64_t key,
uint32_t options);
说明
zx_interrupt_bind()
可将中断对象绑定或取消绑定到端口。
一个中断对象只能绑定到一个端口,并且只能绑定一次。
中断只能绑定到使用 ZX_PORT_BIND_TO_INTERRUPT
选项创建的端口。
触发绑定的中断对象时,系统会将 ZX_PKT_TYPE_INTERRUPT
数据包传送到其所绑定的端口,并带有 zx_packet_interrupt_t
中触发中断时的时间戳(相对于 ZX_CLOCK_MONOTONIC
)。绑定中断时使用的键将显示在 zx_port_packet_t
的 key
字段中。
如果要绑定的中断处于触发状态,则系统会向要绑定中断的端口发送 ZX_PKT_TYPE_INTERRUPT
数据包,其中包含触发中断时的时间戳。此数据包需要正常处理。
如需绑定到端口,请在 options 中传递 ZX_INTERRUPT_BIND
。
如需取消绑定先前绑定的端口,请在 options 中传递 ZX_INTERRUPT_UNBIND
。解绑定需要 port_handle,但 key 会被忽略。取消绑定该端口会移除之前加入队列的数据包。
在传送其他数据包之前,必须使用 zx_interrupt_ack()
系统调用重新报警绑定的中断。(几乎在所有情况下)最好在中断数据包处理完毕后完成此操作。尤其是在多个线程从某个端口读取数据包的情况下,如果处理线程重新启动中断并已触发,数据包会立即传送到等待线程。
中断数据包通过端口上的专用队列传送,优先级高于不中断数据包。
权限
handle 必须为 ZX_OBJ_TYPE_INTERRUPT
类型,且具有 ZX_RIGHT_READ
。
port_handle 的类型必须为 ZX_OBJ_TYPE_PORT
,且具有 ZX_RIGHT_WRITE
。
返回值
zx_interrupt_bind()
会在成功时返回 ZX_OK
。如果失败,则返回负的错误值。
错误
ZX_ERR_BAD_HANDLE
handle 或 port_handle 不是有效的句柄。
ZX_ERR_WRONG_TYPE
handle 不是中断对象,或者 port_handle 不是端口对象。
对 handle 调用了 ZX_ERR_CANCELED
zx_interrupt_destroy()
。
ZX_ERR_BAD_STATE
线程正使用 zx_interrupt_wait()
等待中断
ZX_ERR_ACCESS_DENIED
,handle 句柄缺少 ZX_RIGHT_READ
或 port_handle 句柄缺少 ZX_RIGHT_WRITE
ZX_ERR_ALREADY_BOUND
:此中断对象已绑定。
ZX_ERR_INVALID_ARGS
options 不是 ZX_INTERRUPT_BIND
或 ZX_INTERRUPT_UNBIND
。
ZX_ERR_NOT_FOUND
表示 port 与绑定端口不匹配。
另请参阅
zx_handle_close()
zx_interrupt_ack()
zx_interrupt_create()
zx_interrupt_destroy()
zx_interrupt_trigger()
zx_interrupt_wait()
zx_port_wait()