摘要
等待多個物件的信號。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_object_wait_many(zx_wait_item_t* items,
size_t num_items,
zx_instant_mono_t deadline);
說明
zx_object_wait_many() 是封鎖系統呼叫,會導致呼叫端等待,直到期限經過,或 items 中參照的至少一個物件已判斷為指定信號。如果物件已聲明至少一個指定信號,系統會立即以 ZX_OK 結束等待。
typedef struct {
zx_handle_t handle;
zx_signals_t waitfor;
zx_signals_t pending;
} zx_wait_item_t;
呼叫端必須在 items 陣列中提供 count zx_wait_item_t,其中包含要等待每個項目的控制代碼和信號位元遮罩。每個項目都應包含參照要等待物件的有效 handle,以及指出哪些信號應喚醒呼叫執行緒的位元遮罩 waitfor。
deadline 參數會指定相對於 ZX_CLOCK_MONOTONIC 的期限,並根據工作的計時器延遲政策自動調整。ZX_TIME_INFINITE 是特殊值,代表無限期等待。
傳回時,items 的 pending 欄位會填入點陣圖,指出每個項目待處理的信號。
可等待的項目數量上限為 ZX_WAIT_MANY_MAX_ITEMS,即 64。如要一次等待更多物件,請使用「連接埠」。
權限
「items」的每個項目都必須包含「handle」欄位,且該欄位的值為 ZX_RIGHT_WAIT。
傳回值
如果呼叫時有任何 waitfor 信號處於啟用狀態,或在 deadline 經過前觀察到各自的物件,zx_object_wait_many() 會傳回 ZX_OK。
如果發生 ZX_ERR_TIMED_OUT,項目可能會反映截止日期過後,但在系統呼叫傳回前發生的狀態變更。
如果發生 ZX_ERR_CANCELED,表示一或多個等待中的項目已關閉控點,且這些項目的 pending 欄位會設為 ZX_SIGNAL_HANDLE_CLOSED 位元。
如果傳回其他值,items 的 pending 欄位會是未定義。
錯誤
ZX_ERR_INVALID_ARGS items 不是有效的指標。
ZX_ERR_OUT_OF_RANGE count 大於 ZX_WAIT_MANY_MAX_ITEMS。
ZX_ERR_BAD_HANDLE 其中一個項目含有無效控制代碼。
ZX_ERR_ACCESS_DENIED 一或多個提供的控制代碼沒有 ZX_RIGHT_WAIT,可能無法等待。
ZX_ERR_CANCELED 等待期間,您提供的一或多個控制代碼已失效 (例如已關閉)。
ZX_ERR_TIMED_OUT 在任何指定控制代碼上觀察到任何指定信號之前,指定的期限已過。請注意,即使 count 為 0,呼叫仍會等到 deadline 經過後才傳回。
ZX_ERR_NOT_SUPPORTED 其中一個項目包含無法等待的控制代碼 (例如 Port 控制代碼)。
ZX_ERR_NO_MEMORY 記憶體不足,因此失敗。
使用者空間無法妥善處理這項 (不太可能發生的) 錯誤。
這個錯誤不會出現在日後的版本中。
BUGS
待處理更適合稱為已觀察。
附註
如要進一步瞭解信號和相關術語,請參閱信號。