| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // TODO(fxb/39732): This should be read as "library zx". |
| library zz; |
| |
| // TODO(scottmg): This is approximately right, but will need to match the |
| // current definition of zx_futex_t (atomic_int in some #if branches). |
| using Futex = int32; |
| |
| // TODO(scottmg): The futex is unusual in that by virtue of being an int, |
| // sometimes it's passed by pointer, and sometimes by value. |
| |
| [Transport = "Syscall"] |
| protocol futex { |
| /// Wait on a futex. |
| /// Rights: None. |
| [blocking] |
| futex_wait(const_futexptr value_ptr, Futex current_value, handle new_futex_owner, time deadline) |
| -> (status status); |
| |
| /// Wake some number of threads waiting on a futex, and set the ownership of the futex to nothing. |
| /// Rights: None. |
| futex_wake(const_futexptr value_ptr, uint32 wake_count) -> (status status); |
| |
| /// Wake some number of threads waiting on a futex, and move more waiters to another wait queue. |
| /// Rights: None. |
| futex_requeue(const_futexptr value_ptr, |
| uint32 wake_count, |
| Futex current_value, |
| const_futexptr requeue_ptr, |
| uint32 requeue_count, |
| handle new_requeue_owner) |
| -> (status status); |
| |
| /// Wake one thread waiting on a futex. If a thread is woken, |
| /// ownership of the futex is transferred to that thread. If no |
| /// thread is woken (because none are waiting), ownership of the |
| /// futex is set to none. |
| /// Rights: None. |
| futex_wake_single_owner(const_futexptr value_ptr) -> (status status); |
| |
| /// Wake one thread waiting on a futex, and move more waiters to |
| /// another wait queue. Ownership is transferred to the woken thread, |
| /// or cancelled, as with |futex_wake_single_owner|. |
| /// Rights: None. |
| futex_requeue_single_owner(const_futexptr value_ptr, |
| Futex current_value, |
| const_futexptr requeue_ptr, |
| uint32 requeue_count, |
| handle new_requeue_owner) |
| -> (status status); |
| |
| /// Fetch the koid current owner of a futex, if any. |
| /// Rights: None. |
| futex_get_owner(const_futexptr value_ptr) -> (status status, optional_koid koid); |
| }; |