| # zx_task_suspend | 
 |  | 
 | ## NAME | 
 |  | 
 | <!-- Updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | Suspend the given task. Currently only thread or process handles may be suspended. | 
 |  | 
 | ## SYNOPSIS | 
 |  | 
 | <!-- Updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | ```c | 
 | #include <zircon/syscalls.h> | 
 |  | 
 | zx_status_t zx_task_suspend(zx_handle_t handle, zx_handle_t* token); | 
 | ``` | 
 |  | 
 | ## DESCRIPTION | 
 |  | 
 | `zx_task_suspend()` causes the requested task to suspend | 
 | execution. Task suspension is not synchronous and the task might not | 
 | be suspended before the call returns. The task will be suspended soon | 
 | after `zx_task_suspend()` is invoked, unless it is currently blocked in | 
 | the kernel, in which case it will suspend after being unblocked. | 
 |  | 
 | Tasks can be suspended and/or resumed before they are started. If a task is | 
 | started while suspended, it will enter suspension before executing any code. | 
 | Similarly, starting a new thread on a suspended process will suspend the thread | 
 | before it executes any code. | 
 |  | 
 | Invoking [`zx_task_kill()`] on a task that is suspended will successfully kill | 
 | the task. | 
 |  | 
 | A task cannot suspend itself or any of its parent tasks because it would never | 
 | receive the suspend token and would be unable to resume execution. | 
 |  | 
 | ## RESUMING | 
 |  | 
 | The allow the task to resume, close the suspend token handle. The task will | 
 | remain suspended as long as there are any open suspend tokens. Like suspending, | 
 | resuming is asynchronous so the thread may not be in a running state when the | 
 | [`zx_handle_close()`] call returns, even if no other suspend tokens | 
 | are open. | 
 |  | 
 | ## SIGNALS AND EXCEPTIONS | 
 |  | 
 | There are two relevant signals that a thread can assert: | 
 |  | 
 | - **ZX_THREAD_RUNNING** | 
 | - **ZX_THREAD_SUSPENDED** | 
 |  | 
 | Neither of these will be asserted until the thread is started via | 
 | [`zx_process_start()`] or [`zx_thread_start()`]. When | 
 | a thread starts, it will assert **ZX_THREAD_RUNNING** whether it is suspended | 
 | or not, but if it is suspended will then switch to **ZX_THREAD_SUSPENDED** | 
 | before executing any code. | 
 |  | 
 | The **ZX_EXCP_PROCESS_STARTING** and **ZX_EXCP_THREAD_STARTING** debug | 
 | exceptions will also be sent on start whether the task is suspended or not. | 
 |  | 
 | ## RIGHTS | 
 |  | 
 | <!-- Updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | *handle* must be of type **ZX_OBJ_TYPE_THREAD** or **ZX_OBJ_TYPE_PROCESS** and have **ZX_RIGHT_WRITE**. | 
 |  | 
 | ## RETURN VALUE | 
 |  | 
 | `zx_task_suspend()` returns **ZX_OK** on success. | 
 | In the event of failure, a negative error value is returned. | 
 |  | 
 | ## ERRORS | 
 |  | 
 | **ZX_ERR_BAD_HANDLE** *handle* is not a valid handle. | 
 |  | 
 | **ZX_ERR_WRONG_TYPE** *handle* is not a thread or process handle. | 
 |  | 
 | **ZX_ERR_INVALID_ARGS**  *token*  was an invalid pointer. | 
 |  | 
 | **ZX_ERR_BAD_STATE**  The task is already dying or dead and cannot be suspended. | 
 |  | 
 | **ZX_ERR_NO_MEMORY**  Failed to allocate memory. | 
 |  | 
 | **ZX_ERR_NOT_SUPPORTED**  The calling thread is attempting to suspend itself or | 
 |                           one of its parent tasks. | 
 |  | 
 | ## LIMITATIONS | 
 |  | 
 | Currently only thread and process handles are supported. | 
 |  | 
 | <!-- References updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | [`zx_handle_close()`]: handle_close.md | 
 | [`zx_process_start()`]: process_start.md | 
 | [`zx_task_kill()`]: task_kill.md | 
 | [`zx_thread_start()`]: thread_start.md |