摘要
等待封包送達通訊埠。
宣告
#include <zircon/syscalls.h>
#include <zircon/syscalls/port.h>
zx_status_t zx_port_wait(zx_handle_t handle,
                         zx_instant_mono_t deadline,
                         zx_port_packet_t* packet);
說明
zx_port_wait() 是阻斷的系統呼叫,會讓呼叫端等待至少
有一個封包
傳回後,如果成功的 packet 會包含最早的 (依 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;
如為核心產生的封包,請輸入下列其中一個值:
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() 註冊的物件產生。
所有核心已排入佇列的封包都會狀態設為 ZX_OK,金鑰則設為
提供給註冊 syscall 的值。如要進一步瞭解如何解讀聯集,請參閱
相應的註冊系統呼叫
權限
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 期限,且沒有可用的封包。