摘要
等待数据包到达某个端口。
声明
#include <zircon/syscalls.h>
#include <zircon/syscalls/port.h>
zx_status_t zx_port_wait(zx_handle_t handle,
zx_time_t deadline,
zx_port_packet_t* packet);
说明
zx_port_wait()
是一个阻塞系统调用,这会导致调用方至少等待
有 1 个可用的数据包。
返回后,如果成功的数据包将包含最早的数据包(按 FIFO 顺序) 可用的数据包数据。
截止时间指示何时停止等待数据包(相对于
ZX_CLOCK_MONOTONIC
),则系统会根据作业的
计时器延迟政策。如果在截止时间前没有数据包送达,
ZX_ERR_TIMED_OUT
。值 ZX_TIME_INFINITE
将导致
等不了了。过去的值将导致立即超时,
(除非已有数据包可供读取)。
与 zx_object_wait_one()
和 zx_object_wait_many()
不同的是,只有一项
等待线程被释放(每个可用数据包),这使得
可以通过线程池处理。
数据包分为两类:由用户空间使用 zx_port_queue()
加入队列的数据包
以及当端口已注册且具有更改状态的对象时,内核将数据包排入队列。在
在这种情况下,数据包始终是 zx_port_packet_t
类型:
struct zx_port_packet_t {
uint64_t key;
uint32_t type;
zx_status_t status;
union {
zx_packet_user_t user;
zx_packet_signal_t signal;
zx_packet_guest_bell_t guest_bell;
zx_packet_guest_mem_t guest_mem;
zx_packet_guest_io_t guest_io;
zx_packet_guest_vcpu_t guest_vcpu;
zx_packet_interrupt_t interrupt;
zx_packet_page_request_t page_request;
};
};
对于通过 zx_port_queue()
生成的数据包,type 将设置为
ZX_PKT_TYPE_USER
,zx_port_queue()
的调用方则控制
zx_port_packet_t
结构。对数据包数据的访问权限由 user 成员提供,
类型 zx_packet_user_t
:
typedef union zx_packet_user {
uint64_t u64[4];
uint32_t u32[8];
uint16_t u16[16];
uint8_t c8[32];
} zx_packet_user_t;
对于内核生成的数据包,type 可以是以下值之一:
ZX_PKT_TYPE_SIGNAL_ONE
- 由通过
zx_object_wait_async()
。
ZX_PKT_TYPE_GUEST_BELL
、ZX_PKT_TYPE_GUEST_MEM
、ZX_PKT_TYPE_GUEST_IO
、
或 ZX_PKT_TYPE_GUEST_VCPU
- 由通过 zx_guest_set_trap()
注册的对象生成。
ZX_PKT_TYPE_INTERRUPT
- 由通过 zx_interrupt_bind()
注册的对象生成。
ZX_PKT_TYPE_PAGE_REQUEST
- 由通过 zx_pager_create_vmo()
注册的对象生成。
内核排队的所有数据包都将 status 设置为 ZX_OK
,key 设置为
值。如需详细了解如何解读并集,请参阅
相应的注册系统调用。
权限
handle 的类型必须为 ZX_OBJ_TYPE_PORT
且包含 ZX_RIGHT_READ
。
返回值
对数据包成功排队后,zx_port_wait()
会返回 ZX_OK
。
错误
ZX_ERR_BAD_HANDLE
handle 不是有效的句柄。
ZX_ERR_INVALID_ARGS
数据包不是有效的指针
ZX_ERR_ACCESS_DENIED
标识名没有 ZX_RIGHT_READ
,可能
已过 ZX_ERR_TIMED_OUT
最后期限,没有可用的数据包。