zxport_wait

总结

等待数据包到达某个端口。

声明

#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() 是阻塞系统调用,会导致调用方等待,直到至少有一个数据包可用。

返回时,如果成功,数据包将包含最早(按 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_USERzx_port_queue() 的调用方将控制 zx_port_packet_t 结构中的所有其他值。数据包数据的访问权限由用户成员提供,其类型为 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;

对于内核生成的数据包,类型可以是以下值之一:

ZX_PKT_TYPE_SIGNAL_ONE - 由通过 zx_object_wait_async() 注册的对象生成。

ZX_PKT_TYPE_GUEST_BELLZX_PKT_TYPE_GUEST_MEMZX_PKT_TYPE_GUEST_IOZX_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_OKkey 设置为提供给注册系统调用的值。如需详细了解如何解读联合,请参阅相应的注册系统调用。

权限

handle 必须为 ZX_OBJ_TYPE_PORT 类型,且具有 ZX_RIGHT_READ

返回值

如果数据包成功排出队列,zx_port_wait() 会返回 ZX_OK

错误

ZX_ERR_BAD_HANDLE 句柄不是有效的句柄。

ZX_ERR_INVALID_ARGS 数据包不是有效的指针

ZX_ERR_ACCESS_DENIED 句柄没有 ZX_RIGHT_READ,因此可能不会等待。

ZX_ERR_TIMED_OUT截止日期已过,没有可用的数据包。

另请参阅