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

@transport("Syscall")
closed protocol Timer {
    /// ## Summary
    ///
    /// Create a timer.
    ///
    /// ## Declaration
    ///
    /// ```c
    /// #include <zircon/syscalls.h>
    ///
    /// zx_status_t zx_timer_create(uint32_t options,
    ///                             zx_clock_t clock_id,
    ///                             zx_handle_t* out);
    /// ```
    ///
    /// ## Description
    ///
    /// `zx_timer_create()` creates a timer, an object that can signal
    /// when a specified point in time has been reached. The only valid
    /// *clock_id* is `ZX_CLOCK_MONOTONIC`.
    ///
    /// The *options* value specifies the coalescing behavior, which
    /// controls whether the system can fire the time earlier or later
    /// depending on other pending timers.
    ///
    /// The possible values are:
    ///
    /// + `ZX_TIMER_SLACK_CENTER`
    /// + `ZX_TIMER_SLACK_EARLY`
    /// + `ZX_TIMER_SLACK_LATE`
    ///
    /// Passing 0 in options is equivalent to `ZX_TIMER_SLACK_CENTER`.
    ///
    /// See [timer slack](/docs/concepts/kernel/timer_slack.md) for more information.
    ///
    /// The returned handle has the `ZX_RIGHT_DUPLICATE`, `ZX_RIGHT_TRANSFER`,
    /// `ZX_RIGHT_WRITE`, `ZX_RIGHT_SIGNAL`, `ZX_RIGHT_WAIT`, and
    /// `ZX_RIGHT_INSPECT` rights.
    ///
    /// ## Rights
    ///
    /// Caller job policy must allow `ZX_POL_NEW_TIMER`.
    ///
    /// ## Return value
    ///
    /// `zx_timer_create()` returns `ZX_OK` on success. In the event
    /// of failure, a negative error value is returned.
    ///
    /// ## Errors
    ///
    /// `ZX_ERR_INVALID_ARGS`  *out* is an invalid pointer or NULL or
    /// *options* is not one of the `ZX_TIMER_SLACK` values or *clock_id* is
    /// any value other than `ZX_CLOCK_MONOTONIC`.
    ///
    /// `ZX_ERR_NO_MEMORY`  Failure due to lack of memory.
    /// There is no good way for userspace to handle this (unlikely) error.
    /// In a future build this error will no longer occur.
    ///
    /// ## See also
    ///
    ///  - [`zx_deadline_after()`]
    ///  - [`zx_handle_close()`]
    ///  - [`zx_timer_cancel()`]
    ///  - [`zx_timer_set()`]
    ///
    /// [`zx_deadline_after()`]: deadline_after.md
    /// [`zx_handle_close()`]: handle_close.md
    /// [`zx_timer_cancel()`]: timer_cancel.md
    /// [`zx_timer_set()`]: timer_set.md
    strict Create(struct {
        options uint32;
        clock_id Clock;
    }) -> (resource struct {
        out Handle:TIMER;
    }) error Status;

    /// ## Summary
    ///
    /// Start a timer.
    ///
    /// ## Declaration
    ///
    /// ```c
    /// #include <zircon/syscalls.h>
    ///
    /// zx_status_t zx_timer_set(zx_handle_t handle,
    ///                          zx_time_t deadline,
    ///                          zx_duration_t slack);
    /// ```
    ///
    /// ## Description
    ///
    /// `zx_timer_set()` starts a one-shot timer that will fire when
    /// *deadline* passes. If a previous call to `zx_timer_set()` was
    /// pending, the previous timer is canceled and
    /// `ZX_TIMER_SIGNALED` is de-asserted as needed.
    ///
    /// The *deadline* parameter specifies a deadline with respect to
    /// `ZX_CLOCK_MONOTONIC`. To wait for a relative interval,
    /// use [`zx_deadline_after()`] returned value in *deadline*.
    ///
    /// To fire the timer immediately pass a *deadline* less than or equal to `0`.
    ///
    /// When the timer fires it asserts `ZX_TIMER_SIGNALED`. To de-assert this
    /// signal call [`zx_timer_cancel()`] or `zx_timer_set()` again.
    ///
    /// The *slack* parameter specifies a range from *deadline* - *slack* to
    /// *deadline* + *slack* during which the timer is allowed to fire. The system
    /// uses this parameter as a hint to coalesce nearby timers.
    ///
    /// The precise coalescing behavior is controlled by the *options* parameter
    /// specified when the timer was created. `ZX_TIMER_SLACK_EARLY` allows only
    /// firing in the *deadline* - *slack* interval and `ZX_TIMER_SLACK_LATE`
    /// allows only firing in the *deadline* + *slack* interval. The default
    /// option value of 0 is `ZX_TIMER_SLACK_CENTER` and allows both early and
    /// late firing with an effective interval of *deadline* - *slack* to
    /// *deadline* + *slack*
    ///
    /// ## Rights
    ///
    /// *handle* must be of type `ZX_OBJ_TYPE_TIMER` and have `ZX_RIGHT_WRITE`.
    ///
    /// ## Return value
    ///
    /// `zx_timer_set()` returns `ZX_OK` on success.
    /// In the event of failure, a negative error value is returned.
    ///
    /// ## Errors
    ///
    /// `ZX_ERR_BAD_HANDLE`  *handle* is not a valid handle.
    ///
    /// `ZX_ERR_ACCESS_DENIED`  *handle* lacks the right `ZX_RIGHT_WRITE`.
    ///
    /// `ZX_ERR_OUT_OF_RANGE`  *slack* is negative.
    ///
    /// ## See also
    ///
    ///  - [`zx_deadline_after()`]
    ///  - [`zx_timer_cancel()`]
    ///  - [`zx_timer_create()`]
    ///
    /// [`zx_deadline_after()`]: deadline_after.md
    /// [`zx_timer_cancel()`]: timer_cancel.md
    /// [`zx_timer_create()`]: timer_create.md
    strict Set(resource struct {
        handle Handle:TIMER;
        deadline Time;
        slack Duration;
    }) -> () error Status;

    /// ## Summary
    ///
    /// Cancel a timer.
    ///
    /// ## Declaration
    ///
    /// ```c
    /// #include <zircon/syscalls.h>
    ///
    /// zx_status_t zx_timer_cancel(zx_handle_t handle);
    /// ```
    ///
    /// ## Description
    ///
    /// `zx_timer_cancel()` cancels a pending timer that was started with
    /// [`zx_timer_set()`].
    ///
    /// Upon success the pending timer is canceled and the `ZX_TIMER_SIGNALED`
    /// signal is de-asserted. If a new pending timer is immediately needed
    /// rather than calling `zx_timer_cancel()` first, call [`zx_timer_set()`]
    /// with the new deadline.
    ///
    /// ## Rights
    ///
    /// *handle* must be of type `ZX_OBJ_TYPE_TIMER` and have `ZX_RIGHT_WRITE`.
    ///
    /// ## Return value
    ///
    /// `zx_timer_cancel()` returns `ZX_OK` on success.
    /// In the event of failure, a negative error value is returned.
    ///
    /// ## Errors
    ///
    /// `ZX_ERR_BAD_HANDLE`  *handle* is not a valid handle.
    ///
    /// `ZX_ERR_ACCESS_DENIED`  *handle* lacks the right `ZX_RIGHT_WRITE`.
    ///
    /// ## NOTE
    ///
    /// Calling this function before [`zx_timer_set()`] has no effect.
    ///
    /// ## See also
    ///
    ///  - [`zx_timer_create()`]
    ///  - [`zx_timer_set()`]
    ///
    /// [`zx_timer_create()`]: timer_create.md
    /// [`zx_timer_set()`]: timer_set.md
    strict Cancel(resource struct {
        handle Handle:TIMER;
    }) -> () error Status;
};
