blob: e6ac35514f89edd73d9250c2a618f734544a98b6 [file] [log] [blame]
// 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", NoProtocolPrefix]
protocol futexfuncs {
/// 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, 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(const_futexptr value_ptr) -> (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(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);
};