# 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
