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