zx_object_wait_async

摘要

訂閱物件的信號。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_object_wait_async(zx_handle_t handle,
                                 zx_handle_t port,
                                 uint64_t key,
                                 zx_signals_t signals,
                                 uint32_t options);

說明

zx_object_wait_async() 是非阻塞的系統呼叫,當處理常式指定的物件具有一或多個指定的信號時,會導致封包在 port 上排入佇列。使用 zx_port_wait() 擷取封包。

handle 指向要監控變更的物件,而且必須是可等候的物件。

options 引數可以是 0,也可以是一或多個

  • ZX_WAIT_ASYNC_TIMESTAMP,導致系統在觸發等待事件時擷取時間戳記。
  • ZX_WAIT_ASYNC_EDGE 會導致通訊埠不要將 zx_object_wait_async() 呼叫當下已啟用的信號封包排入佇列。

signals 引數是一個位元遮罩,用於指出 handle 指定物件上有哪些信號會導致封包排入佇列。

如果沒有 ZX_WAIT_ASYNC_EDGE,當在呼叫 zx_object_wait_async() 或之後變為啟用時,信號中的 any 信號為有效狀態,系統就會在通訊埠中將封包排入佇列。

使用 ZX_WAIT_ASYNC_EDGE 時,只有在信號中的一或多個信號從停用中轉換到有效狀態之後,封包才會在通訊埠上排入佇列。使用這個選項時,應在呼叫 zx_object_wait_async() 完成前,注意閒置信號會意外啟用。在這種情況下,轉換可能會錯過,系統不會將任何封包排入通訊埠佇列。例如,通常在執行非阻塞式 I/O 之前,會一直使用到信號失效為止,確保後續從無效轉換變成使用中會導致封包排入佇列。

封包排入佇列時,會包含所有目前已宣告的信號 (而不只是 signals 引數中列出的信號)。封包排入佇列後 非同步等待就會結束。其他封包將不會排入佇列。請注意,信號為 OR 位於通訊埠維護的狀態,因此在 zx_port_wait() 傳回時,您會看到任何要求的信號組合。

每次呼叫 zx_object_wait_async() 都會建立新的非同步等待作業 (或觀測器)。系統不會以任何方式簡化這些作業。也就是說,如果使用相同引數兩次呼叫 zx_object_wait_async(),系統將建立兩項作業。此外,如果宣告的信號與這些作業相符,系統會將兩個封包排入佇列,且每項作業各一個。

每個通訊埠可執行的作業數量有限。如果超過限制,工作政策例外狀況 (ZX_EXCP_POLICY_CODE_PORT_TOO_MANY_OBSERVERS) 就會由超過限制的程序提出。

zx_port_cancel() 會使用具有指定金鑰處理常式通訊埠,終止所有非同步等待作業。此外,這些作業產生的佇列中的所有封包都會從佇列中移除。

如果「處理程式」已關閉,相關聯的作業也會一併終止,但已在佇列中的封包則不受影響。

透過這個 syscall 產生的封包會將 type 設為 ZX_PKT_TYPE_SIGNAL_ONE,且聯集為 zx_packet_signal_t 類型:

typedef struct zx_packet_signal {
    zx_signals_t trigger;
    zx_signals_t observed;
    uint64_t count;
    zx_time_t timestamp;       // depends on ZX_WAIT_ASYNC_TIMESTAMP
    uint64_t reserved1;
} zx_packet_signal_t;

「trigger」是呼叫 zx_object_wait_async() 時使用的信號,「觀察」是指實際觀察的信號,而 timestamp 是物件狀態轉換為符合觸發條件的條件時維持時鐘單調時間。如果選項不包含 ZX_WAIT_ASYNC_TIMESTAMP,時間戳記會回報為 0。

使用 zx_port_packet_t金鑰 成員追蹤這個封包對應的物件。

權限

handle 必須具有 ZX_RIGHT_WAIT

port 必須為類型 ZX_OBJ_TYPE_PORT 且具有 ZX_RIGHT_WRITE

傳回值

如果訂閱成功,zx_object_wait_async() 會傳回 ZX_OK

錯誤

ZX_ERR_INVALID_ARGS 選項有設定 ZX_WAIT_ASYNC_TIMESTAMPZX_WAIT_ASYNC_EDGE 以外的位元。

ZX_ERR_BAD_HANDLE 帳號代碼不是有效的控制代碼,或 port 不是有效的控制代碼。

ZX_ERR_WRONG_TYPE port 不是通訊埠控制代碼。

ZX_ERR_ACCESS_DENIED 處理常式沒有 ZX_RIGHT_WAIT通訊埠沒有 ZX_RIGHT_WRITE

ZX_ERR_NOT_SUPPORTED 帳號代碼是無法等待的控制代碼。

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。使用者空間無法以任何方式處理這個錯誤 (極可能) 錯誤。日後的建構作業不會再發生這個錯誤。

附註

如要進一步瞭解信號及其術語,請參閱信號

另請參閱