| // 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. |
| library zx; |
| |
| // TODO(scottmg): This is approximately right, but will need to match the |
| // current definition of zx_futex_t (atomic_int in some #if branches). |
| alias 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") |
| @no_protocol_prefix |
| protocol futexfuncs { |
| /// Wait on a futex. |
| /// Rights: None. |
| @blocking |
| futex_wait(resource struct { |
| value_ptr const_futexptr; |
| current_value Futex; |
| new_futex_owner handle; |
| deadline time; |
| }) -> (struct { |
| status status; |
| }); |
| |
| /// Wake some number of threads waiting on a futex, and set the ownership of the futex to nothing. |
| /// Rights: None. |
| futex_wake(struct { |
| value_ptr const_futexptr; |
| wake_count uint32; |
| }) -> (struct { |
| status status; |
| }); |
| |
| /// Wake some number of threads waiting on a futex, and move more waiters to another wait queue. |
| /// Rights: None. |
| futex_requeue(resource struct { |
| value_ptr const_futexptr; |
| wake_count uint32; |
| current_value Futex; |
| requeue_ptr const_futexptr; |
| requeue_count uint32; |
| new_requeue_owner handle; |
| }) -> (struct { |
| status status; |
| }); |
| |
| /// Wake one thread waiting on a futex, and set the ownership of the futex to that thread. |
| /// 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(struct { |
| value_ptr const_futexptr; |
| }) -> (struct { |
| status status; |
| }); |
| |
| /// Wake one thread waiting on a futex, and requeue more waiters to another futex wait queue. |
| /// Ownership is transferred to the woken thread, or cancelled, |
| /// as with |futex_wake_single_owner|. |
| /// Rights: None. |
| futex_requeue_single_owner(resource struct { |
| value_ptr const_futexptr; |
| current_value Futex; |
| requeue_ptr const_futexptr; |
| requeue_count uint32; |
| new_requeue_owner handle; |
| }) -> (struct { |
| status status; |
| }); |
| |
| /// Fetch the koid current owner of a futex, if any. |
| /// Rights: None. |
| futex_get_owner(struct { |
| value_ptr const_futexptr; |
| }) -> (struct { |
| status status; |
| koid optional_koid; |
| }); |
| }; |