ZX_port_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 期限,且沒有可用的封包。

另請參閱