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

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

[Transport = "Syscall", NoProtocolPrefix]
protocol clockfuncs {
    /// 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);
};
