// 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 fuchsia.sys2;

using zx;
using fuchsia.component;

const uint32 MAX_WORK_ID_LENGTH = 100;
alias WorkId = string:MAX_WORK_ID_LENGTH;

/// Different ways to specify when to schedule a work item for the first time.
flexible union Start {
    /// A non-negative delay to wait before scheduling work.
    1: zx.duration delay;
    /// A fixed point in time to start scheduling work, interpreted like `ZX_CLOCK_MONOTONIC`:
    /// number of nanoseconds since the system was powered on.
    2: zx.time monotonic_time;
};

/// Parameters for a new piece of work to be scheduled.
table WorkRequest {
    /// Time when corresponding work item should be _first_ scheduled.
    1: Start start;
    /// Delay between repeated schedulings of corresponding work item. This is left unspecified for
    /// one-shot work that should not repeat. Repeating work items are rescheduled indefinitely
    /// until it is canceled.
    2: zx.duration period;
};

/// Framework service: API for scheduling and canceling work. Each component instance can access
/// work items that it has scheduled (but not others' scheduled work items). Work items are
/// scheduled _roughly_ at the specified time and frequency; the service implementation may specify
/// its notion of _roughly_, and may provide a configuration API to tune this notion.
///
/// Each scheduled work item is identified by a client-provided `WorkId`. Each scheduled work item
/// has a `WorkId` that is unique with respect to scheduled work items belonging to the same
/// component instance.
[Discoverable]
protocol WorkScheduler {
    /// Schedule a new work item identified by `work_id`. The work item is to be scheduled roughly
    /// at the time corresponding to `work_request.start`. When `work_request.period` is specified,
    /// reschedule work roughly every `work_request.period` until the the work item is canceled.
    ScheduleWork(WorkId work_id, WorkRequest work_request) -> () error fuchsia.component.Error;

    /// Cancel the scheduled work item specified by `work_id`.
    CancelWork(WorkId work_id) -> () error fuchsia.component.Error;
};

/// Component-exposed service: Work scheduler connects to this service to invoke scheduled work item
/// callbacks. The service implementation is responsible for invoking the code that corresponds to
/// the scheduled work item identified by `work_id`.
///
/// Note: The intent of exposing this service is to expose it to the `WorkScheduler` service
/// provider (i.e., the framework) and no one else.
[Discoverable]
protocol Worker {
    DoWork(WorkId work_id) -> () error fuchsia.component.Error;
};

/// Framework service: Administrative API for controlling parameters of the `WorkScheduler`
/// framework service. So long as there are work items with deadlines in the next `batch_period`,
/// the `WorkScheduler` will sleep for `batch_period`, then wake up and immediately dispatch a batch
/// of work items: all those with past deadlines. It will repeat this process until no work items
/// would be scheduled in the next `batch_period`, at which point it will go to sleep until the next
/// deadline. This strategy ensures that each work item is dispatched approximately within
/// `batch_period` of its deadline.
[Discoverable]
protocol WorkSchedulerControl {
    /// Get the current period between `WorkScheduler` attempts to dispatch a batch of work.
    /// `batch_period` is a non-negative 64-bit integer in the range [0, 2^63-1], representing a
    /// number of nanoseconds between dispatching batches of work.
    GetBatchPeriod() -> (zx.duration batch_period) error fuchsia.component.Error;
    /// Set the current period between `WorkScheduler` attempts to batch and dispatch a batch of
    /// work. `batch_period` is a non-negative 64-bit integer in the range [0, 2^63-1], representing
    /// a number of nanoseconds between dispatching batches of work.
    SetBatchPeriod(zx.duration batch_period) -> () error fuchsia.component.Error;
};
