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() 是無阻斷的系統呼叫,當 handle 指定的物件有一個或多個指定的 signal 時,會導致封包在 port 上排入佇列。使用 zx_port_wait() 擷取封包。

handle 指向要觀察變更的物件,且必須為可等待的物件。

options 引數可以是 0,也可以是下列一或多個選項:

  • ZX_WAIT_ASYNC_TIMESTAMP,會在系統觸發等待時擷取單調時間戳記。
  • ZX_WAIT_ASYNC_BOOT_TIMESTAMP,會在等待觸發時,讓系統擷取啟動時間戳記。
  • ZX_WAIT_ASYNC_EDGE 會導致通訊埠不在 zx_object_wait_async() 呼叫期間啟用信號的封包佇列。

請注意,傳入 ZX_WAIT_ASYNC_TIMESTAMP 和 ZX_WAIT_ASYNC_BOOT_TIMESTAMP 無效,會傳回 ZX_ERR_INVALID_ARGS。

signals 引數是一個位元遮罩,指出由 handle 指定的物件上的哪些信號會將封包排入佇列。

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

ZX_WAIT_ASYNC_EDGE 中,只有在 signals 中有一或多個信號從停用轉為啟用時,封包才會排入 port 的佇列。使用這個選項時,請注意,在呼叫 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() 會終止所有非同步等待作業,這些作業使用具有指定句柄端口。此外,這些作業產生的佇列中,任何封包都會從佇列中移除。

如果「handle」關閉,與其相關聯的作業也會終止,但佇列中已存在的封包不會受到影響。

透過這個系統呼叫產生的封包會將類型設為 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_instant_mono_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 在兩種情況下會傳回此值。第一個是如果 optionsZX_WAIT_ASYNC_TIMESTAMPZX_WAIT_ASYNC_BOOT_TIMESTAMPZX_WAIT_ASYNC_EDGE 集合以外的位元,如果同時設定 ZX_WAIT_ASYNC_TIMESTAMPZX_WAIT_ASYNC_BOOT_TIMESTAMP,則秒數為秒。

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

ZX_ERR_WRONG_TYPE port 不是 Port 句柄。

ZX_ERR_ACCESS_DENIED 句柄沒有 ZX_RIGHT_WAIT,或是通訊埠沒有 ZX_RIGHT_WRITE

ZX_ERR_NOT_SUPPORTED handle 是無法等待的 handle。

ZX_ERR_NO_MEMORY 記憶體不足導致失敗。使用者空間沒有適當的方式來處理這個 (不太可能發生的) 錯誤。日後的版本將不會再發生這個錯誤。

附註

如要進一步瞭解信號和相關術語,請參閱「信號」。

另請參閱