| # zx_futex_wake_handle_close_thread_exit | |
| ## NAME | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| Write to futex, wake futex, close handle, exit. | |
| ## SYNOPSIS | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| ```c | |
| #include <zircon/syscalls.h> | |
| [[noreturn]] void zx_futex_wake_handle_close_thread_exit( | |
| const zx_futex_t* value_ptr, | |
| uint32_t wake_count, | |
| int32_t new_value, | |
| zx_handle_t close_handle); | |
| ``` | |
| ## DESCRIPTION | |
| `zx_futex_wake_handle_close_thread_exit()` does a sequence of four operations: | |
| 1. `atomic_store_explicit(value_ptr, new_value, memory_order_release);` | |
| 2. `zx_futex_wake(value_ptr, wake_count);` | |
| 3. `zx_handle_close(close_handle);` | |
| 4. `zx_thread_exit();` | |
| The expectation is that as soon as the first operation completes, | |
| other threads may unmap or reuse the memory containing the calling | |
| thread's own stack. This is valid for this call, though it would be | |
| invalid for plain [`zx_futex_wake()`] or any other call. | |
| If any of the operations fail, then the thread takes a trap (as if by `__builtin_trap();`). | |
| ## RIGHTS | |
| <!-- Updated by update-docs-from-fidl, do not edit. --> | |
| TODO(fxbug.dev/32253) | |
| ## RETURN VALUE | |
| `zx_futex_wake_handle_close_thread_exit()` does not return. | |
| ## ERRORS | |
| None. | |
| ## NOTES | |
| The intended use for this is for a dying thread to alert another thread | |
| waiting for its completion, 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 write to *value_ptr* can't be | |
| done before this call because any time after the write, a joining thread might | |
| reuse or deallocate this thread's stack, which may cause issues with calling | |
| conventions into this function. | |
| This call is used for joinable threads, while | |
| [`zx_vmar_unmap_handle_close_thread_exit()`] | |
| is used for detached threads. | |
| ## SEE ALSO | |
| - [futex objects](/docs/reference/kernel_objects/futex.md) | |
| - [`zx_futex_wake()`] | |
| - [`zx_handle_close()`] | |
| - [`zx_thread_exit()`] | |
| - [`zx_vmar_unmap_handle_close_thread_exit()`] | |
| <!-- References updated by update-docs-from-fidl, do not edit. --> | |
| [`zx_futex_wake()`]: futex_wake.md | |
| [`zx_handle_close()`]: handle_close.md | |
| [`zx_thread_exit()`]: thread_exit.md | |
| [`zx_vmar_unmap_handle_close_thread_exit()`]: vmar_unmap_handle_close_thread_exit.md |