// 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.

// !!! THIS FILE IS NOT YET USED !!!
// See //zircon/system/public/zircon/syscalls.banjo.
// !!! THIS FILE IS NOT YET USED !!!

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).
// This is called FutexData rather than simply Futex, because aliases and
// protocol share a namespace, and the protocol needs to be named Futex to make
// the syscall name be correct.
using FutexData = 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. box<FutexData> in
// modifications is necessary for these to make sense.

[Transport="Syscall"]
protocol Futex {
    /// Wait on a futex.
    [Blocking,
     In0="box<FutexData>"]
    Wait(FutexData value_ptr, FutexData current_value, handle new_futex_owner, time deadline) ->
        (status status);

    /// Wake some number of threads waiting on a futex, optionally transferring ownership to the thread which was woken in the process.
    [In0="box<FutexData>"]
    Wake(FutexData value_ptr, uint32 wake_count) -> (status status);

    /// Wake some number of threads waiting on a futex, and move more waiters to another wait queue.
    [In0="box<FutexData>",
     In3="box<FutexData>"]
    Requeue(FutexData value_ptr,
            uint32 wake_count,
            FutexData current_value,
            FutexData requeue_ptr,
            uint32 requeue_count,
            handle new_requeue_owner) ->
        (status status);

    /// Wake some number of threads waiting on a futex, optionally transferring ownership to the thread which was woken in the process.
    [In0="box<FutexData>"]
    WakeSingleOwner(FutexData value_ptr) -> (status status);

    /// Wake some number of threads waiting on a futex, and move more waiters to another wait queue.
    [In0="box<FutexData>",
     In2="box<FutexData>"]
    RequeueSingleOwner(FutexData value_ptr,
                       FutexData current_value,
                       FutexData requeue_ptr,
                       uint32 requeue_count,
                       handle new_requeue_owner) ->
        (status status);

    /// Fetch the koid current owner of a futex, if any.
    [In0="box<FutexData>"]
    GetOwner(FutexData value_ptr) -> (status status, koid koid);
};
