摘要
等待多個物件的信號。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_object_wait_many(zx_wait_item_t* items,
size_t num_items,
zx_time_t deadline);
說明
zx_object_wait_many()
是封鎖的系統呼叫,會使呼叫端等到期限通過或項目中參照的一個物件已宣告指定的「信號」之後,再等待呼叫端。如果物件已聲明至少一個指定信號,等待作業會立即以 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
,其中包含控制代碼和信號位元遮罩,以等待每個項目。每個項目都應包含一個有效的「控制代碼」,指的參照了要等待的物件,而位元遮罩 waitfor 用於指出應喚醒呼叫執行緒的信號。
deadline 參數會指定 ZX_CLOCK_MONOTONIC
的期限,並會根據工作的計時器封裝政策自動調整。ZX_TIME_INFINITE
是一種特殊值,表示無限期等待。
傳回後,items 的「pending」欄位會填入點陣圖,指出每個項目待處理的信號。
可能等待的項目數量上限為 ZX_WAIT_MANY_MAX_ITEMS
,也就是 64 個。您可以使用「通訊埠」一次等待更多物件。
權限
每個 items 的項目都必須有包含 ZX_RIGHT_WAIT
的 handle 欄位。
傳回值
如果呼叫在呼叫時處於有效狀態,或在期限傳遞前在其個別物件上觀察到任何 waitfor,zx_object_wait_many()
會傳回 ZX_OK
。
在 ZX_ERR_TIMED_OUT
的事件中,items 可以反映在期限過後、系統傳回 syscall 之前發生的狀態變更。
在 ZX_ERR_CANCELED
事件中,一或多個等待中的項目控點已關閉,而這些項目的「pending」欄位則會設定 ZX_SIGNAL_HANDLE_CLOSED
位元。
針對其他傳回值,items 的 pending 欄位並未定義。
錯誤
ZX_ERR_INVALID_ARGS
項目不是有效的指標。
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
其中一個項目包含無法等待的控制代碼 (例如通訊埠控制代碼)。
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。使用者空間無法以任何方式處理這個錯誤 (極可能) 錯誤。日後的建構作業不會再發生這個錯誤。
錯誤
待處理應稱為「觀察到」。
附註
如要進一步瞭解信號及其術語,請參閱信號。