zx_task_suspend

摘要

暫停指定工作。目前只能暫停執行緒或程序控制代碼。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_task_suspend(zx_handle_t handle, zx_handle_t* token);

說明

zx_task_suspend() 會導致要求的工作暫停執行。工作暫停並非同步作業,因此呼叫傳回前,工作可能不會暫停。除非工作目前在核心中遭到封鎖,否則在叫用 zx_task_suspend() 後,工作很快就會暫停;如果工作遭到封鎖,則會在解除封鎖後暫停。

工作開始前可以暫停及/或繼續執行。如果工作在暫停期間啟動,系統會先暫停工作,再執行任何程式碼。同樣地,在已暫停的程序上啟動新執行緒時,系統會先暫停執行緒,再執行任何程式碼。

在暫停的工作上叫用 zx_task_kill() 會成功終止工作。

工作無法暫停自身或任何父項工作,因為這樣一來,工作就永遠不會收到暫停權杖,也無法繼續執行。

RESUMING

如要允許工作繼續執行,請關閉暫停權杖控制代碼。只要有任何未使用的暫停權杖,工作就會維持暫停狀態。與暫停一樣,繼續作業是非同步的,因此即使沒有其他暫停權杖處於開啟狀態,當 zx_handle_close() 呼叫傳回時,執行緒可能不會處於執行狀態。

信號和例外狀況

執行緒可以判斷兩種相關信號:

  • ZX_THREAD_RUNNING
  • ZX_THREAD_SUSPENDED

在透過 zx_process_start()zx_thread_start() 啟動執行緒之前,系統不會判斷這兩者。執行緒啟動時,會判斷 ZX_THREAD_RUNNING 是否暫停,但如果暫停,則會在執行任何程式碼前切換至 ZX_THREAD_SUSPENDED

無論工作是否暫停,系統都會在啟動時傳送 ZX_EXCP_PROCESS_STARTINGZX_EXCP_THREAD_STARTING 偵錯例外狀況。

權限

handle 必須是 ZX_OBJ_TYPE_THREADZX_OBJ_TYPE_PROCESS 類型,且具有 ZX_RIGHT_WRITE

傳回值

成功時,zx_task_suspend() 會傳回 ZX_OK。 如果失敗,系統會傳回負數錯誤值。

錯誤

ZX_ERR_BAD_HANDLEhandle 不是有效的控制代碼。

ZX_ERR_WRONG_TYPE handle 不是執行緒或程序控制碼。

ZX_ERR_INVALID_ARGS token 是無效指標。

ZX_ERR_BAD_STATE 工作已終止或停止,無法暫停。

ZX_ERR_NO_MEMORY 無法分配記憶體。

ZX_ERR_NOT_SUPPORTED 呼叫執行緒嘗試暫停自身或其中一項父項工作。

限制

目前僅支援執行緒和程序控制代碼。