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

enum Clock : uint32 {
    MONOTONIC = 0;
    UTC = 1;
    THREAD = 2;
};

[Transport = "Syscall"]
protocol clock {
    /// Acquire the current time.
    clock_get(Clock clock_id) -> (status status, time out);

    /// Acquire the current monotonic time.
    [vdsocall]
    clock_get_monotonic() -> (time time);

    /// Rights: handle must have resource kind ZX_RSRC_KIND_ROOT.
    clock_adjust(handle<resource> handle, Clock clock_id, int64 offset) -> (status status);

    // Read clock monotonic, but demand that the read be performed using a
    // syscall, instead of a vdso call.
    //
    // See the notes for ticks_get_via_kernel; this is not a syscall meant
    // to be used by application code.
    [internal]
    clock_get_monotonic_via_kernel() -> (time time);

    // TODO: handle<clock> for all of these.

    /// Create a new clock object.
    /// Rights: None.
    clock_create(uint64 options, const_voidptr args) -> (status status, handle out);

    /// Perform a basic read of the clock.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CLOCK and have ZX_RIGHT_READ.
    clock_read(handle handle) -> (status status, time now);

    /// Fetch all of the low level details of the clock's current status.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CLOCK and have ZX_RIGHT_READ.
    clock_get_details(handle handle, uint64 options) -> (status status, voidptr details);

    /// Make adjustments to a clock object.
    /// Rights: handle must be of type ZX_OBJ_TYPE_CLOCK and have ZX_RIGHT_WRITE.
    clock_update(handle handle, uint64 options, const_voidptr args) -> (status status);
};
