blob: f939b79bbd1a6c324f53919c9db69b3bcb6ac317 [file] [log] [blame] [view]
# zx_vmar_unmap_handle_close_thread_exit
## NAME
vmar_unmap_handle_close_thread_exit - unmap memory, close handle, exit
## SYNOPSIS
```
#include <zircon/syscalls.h>
zx_status_t zx_vmar_unmap_handle_close_thread_exit(zx_handle_t vmar_handle,
uintptr_t addr, size_t len,
zx_handle_t close_handle);
```
## DESCRIPTION
**vmar_unmap_handle_close_thread_exit**() does a sequence of three operations:
1. `zx_vmar_unmap(vmar_handle, addr, len);`
2. `zx_handle_close(close_handle);`
3. `zx_thread_exit();`
The expectation is that the first operation unmaps a region including the
calling thread's own stack. (It's not required, but it's permitted.) This
is valid for this call, though it would be invalid for *zx_vmar_unmap*() or
any other call.
If the *vmar_unmap* operation is successful, then this call never returns.
If `close_handle` is an invalid handle so that the *handle_close* operation
fails, then the thread takes a trap (as if by `__builtin_trap();`).
## RETURN VALUE
**vmar_unmap_handle_close_thread_exit**() does not return on success.
## ERRORS
Same as [*zx_vmar_unmap*()](vmar_unmap.md).
## NOTES
The intended use for this is for a dying thread to unmap its own stack,
close its own thread handle, and exit. The thread handle cannot be closed
beforehand because closing the last handle to a thread kills that thread.
The stack cannot be unmapped beforehand because the thread must have some
stack space on which to make its final system calls.
This call is used for detached threads, while
[*futex_wake_handle_close_thread_exit*()](futex_wake_handle_close_thread_exit.md)
is used for joinable threads.
## SEE ALSO
[vmar_unmap](vmar_unmap.md),
[handle_close](handle_close.md),
[thread_exit](thread_exit.md),
[futex_wake_handle_close_thread_exit](futex_wake_handle_close_thread_exit.md).