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

#ifndef IO_SCHEDULER_SCHEDULER_CLIENT_H_
#define IO_SCHEDULER_SCHEDULER_CLIENT_H_

#include <zircon/types.h>

#include <io-scheduler/stream-op.h>

namespace ioscheduler {

// Callback interface from Scheduler to client. Callbacks are made from within
// the Scheduler library to the client implementation. All callbacks are made
// with no locks held and are allowed to block. Any callbacks may be invoked
// simultanously, and one may be called multiple times concurrently, but never
// with the same data. Notably, Acquire(), Issue(), and Release() may be called
// multiple times after CancelAcquire() has been called.
class SchedulerClient {
 public:
  // CanReorder
  //   Compare if ops can be reordered with respect to each other. This
  // function is called for every pair of ops whose position in
  // the stream is being considered for reorder relative to each other.
  // Returns:
  //   true if it is safe to reorder |second| ahead of |first|.
  //   false otherwise.
  virtual bool CanReorder(StreamOp* first, StreamOp* second) = 0;

  // Acquire
  //   Read zero or more ops from the client for intake into the
  // Scheduler. Every op obtained through Acquire will be returned to the client
  // via the Release callback. The Scheduler will never attempt to free these pointers.
  // Args:
  //   sop_list - an empty array of op pointers to be filled.
  //   list_count - number of entries in sop_list
  //   actual_count - the number of entries filled in sop_list.
  //   wait - block until data is available if true.
  // Returns:
  //   ZX_OK if one or more ops have been added to the list.
  //   ZX_ERR_CANCELED if op source has been closed.
  //   ZX_ERR_SHOULD_WAIT if ops are currently unavailable and |wait| is
  //     false.
  virtual zx_status_t Acquire(StreamOp** sop_list, size_t list_count, size_t* actual_count,
                              bool wait) = 0;

  // Issue
  //   Deliver an op to the IO hardware for immediate execution. This
  // function may block until the op is completed. If it does not block,
  // it should return ZX_ERR_ASYNC.
  // Args:
  //   sop - op to be completed.
  // Returns:
  //   ZX_OK if the op has been completed synchronously or it has failed to
  // issue due to bad parameters in the operation. The callee should update
  // the op’s result field to reflect the success or failure status of the
  // op.
  //   ZX_ERR_ASYNC if the op has been issued for asynchronous completion.
  // Notification of completion should be delivered via the Scheduler’s
  // AsyncComplete() API.
  //   Other error status describing the internal failure that has caused
  // the issue to fail.
  virtual zx_status_t Issue(StreamOp* sop) = 0;

  // Release
  //   Yield ownership of the operation. The completion status of the op
  // is available in its |result| field. Once released, the Scheduler
  // maintains no references to the op and it can be safely deallocated or
  // reused.
  // Args:
  //   sop - op to be released.
  virtual void Release(StreamOp* sop) = 0;

  // CancelAcquire
  //   Cancels any pending blocking calls to Acquire. No further reading of
  // ops should be done. Blocked Acquire callers and any subsequent Acquire
  // calls should return ZX_ERR_CANCELED.
  virtual void CancelAcquire() = 0;

  // Fatal
  //   The Scheduler has encountered a fatal asynchronous error. All pending
  // ops have been aborted. The Scheduler should be shut down and destroyed.
  // The shutdown should be performed from a different context than that of
  // the Fatal() call or else it may deadlock.
  virtual void Fatal() = 0;
};

}  // namespace ioscheduler

#endif  // IO_SCHEDULER_SCHEDULER_CLIENT_H_
