| # zx_futex_wait |
| |
| ## NAME |
| |
| <!-- Updated by update-docs-from-fidl, do not edit. --> |
| |
| Wait on a futex. |
| |
| ## SYNOPSIS |
| |
| <!-- Updated by update-docs-from-fidl, do not edit. --> |
| |
| ```c |
| #include <zircon/syscalls.h> |
| |
| zx_status_t zx_futex_wait(const zx_futex_t* value_ptr, |
| zx_futex_t current_value, |
| zx_handle_t new_futex_owner, |
| zx_time_t deadline); |
| ``` |
| |
| ## DESCRIPTION |
| |
| `zx_futex_wait()` atomically verifies that *value_ptr* still contains the value |
| *current_value* and sleeps until the futex is made available by a call to |
| `zx_futex_wake`. Optionally, the thread can also be woken up after the |
| *deadline* (with respect to **ZX_CLOCK_MONOTONIC**) passes. *deadline* may be |
| automatically adjusted according to the job's [timer slack] policy. |
| |
| ## SPURIOUS WAKEUPS |
| |
| A component that uses futexes should be prepared to handle spurious |
| wakeups. A spurious wakeup is a situation where `zx_futex_wait()` |
| returns successfully even though the component did not wake the waiter |
| by calling [`zx_futex_wake()`]. |
| |
| Zircon's implementation of futexes currently does not generate |
| spurious wakeups itself. However, commonly-used algorithms that use |
| futexes can sometimes generate spurious wakeups. For example, the |
| usual implementation of `mutex_unlock` can potentially produce a |
| [`zx_futex_wake()`] call on a memory location after the location has been |
| freed and reused for unrelated purposes. |
| |
| ## OWNERSHIP |
| |
| A successful call to `zx_futex_wait()` results in the owner of the futex being |
| set to the thread referenced by the *new_futex_owner* handle, or to nothing if |
| *new_futex_owner* is **ZX_HANDLE_INVALID**. |
| |
| See *Ownership and Priority Inheritance* in [futex](/docs/reference/kernel_objects/futex.md) for |
| details. |
| |
| ## RIGHTS |
| |
| <!-- Updated by update-docs-from-fidl, do not edit. --> |
| |
| None. |
| |
| ## RETURN VALUE |
| |
| `zx_futex_wait()` returns **ZX_OK** on success. |
| |
| ## ERRORS |
| |
| **ZX_ERR_INVALID_ARGS** One of the following is true: |
| |
| + *value_ptr* is not a valid userspace pointer |
| + *value_ptr* is not aligned to a `sizeof(zx_futex_t)` boundary. |
| + *new_futex_owner* is currently a member of the waiters for *value_ptr*. |
| + *new_futex_owner* has not been started yet. |
| |
| **ZX_ERR_BAD_HANDLE** *new_futex_owner* is not **ZX_HANDLE_INVALID**, and not a valid handle AND |
| *current_value* matches the value at *value_ptr* |
| |
| **ZX_ERR_WRONG_TYPE** *new_futex_owner* is a valid handle, but is not a handle to a thread. |
| |
| **ZX_ERR_BAD_STATE** *current_value* does not match the value at *value_ptr*. |
| |
| **ZX_ERR_TIMED_OUT** The thread was not woken before *deadline* passed. |
| |
| ## SEE ALSO |
| |
| - [futex objects](/docs/reference/kernel_objects/futex.md) |
| - [timer slack](/docs/concepts/objects/timer_slack.md) |
| - [`zx_futex_requeue()`] |
| - [`zx_futex_wake()`] |
| |
| <!-- References updated by update-docs-from-fidl, do not edit. --> |
| |
| [`zx_futex_requeue()`]: futex_requeue.md |
| [`zx_futex_wake()`]: futex_wake.md |