// Copyright 2023 The IREE Authors
//
// Licensed under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#ifndef EXPERIMENTAL_CUDA2_TIMEPOINT_POOL_H_
#define EXPERIMENTAL_CUDA2_TIMEPOINT_POOL_H_

#include "experimental/cuda2/event_pool.h"
#include "iree/base/api.h"
#include "iree/base/internal/event_pool.h"
#include "iree/hal/utils/semaphore_base.h"

#ifdef __cplusplus
extern "C" {
#endif  // __cplusplus

//===----------------------------------------------------------------------===//
// iree_hal_cuda2_timepoint_t
//===----------------------------------------------------------------------===//

// Forward declaration of the timepoint pool.
typedef struct iree_hal_cuda2_timepoint_pool_t iree_hal_cuda2_timepoint_pool_t;

// An enum to identify the timepoint kind in iree_hal_cuda_timepoint_t objects.
typedef enum iree_hal_cuda2_timepoint_kind_e {
  // None; for uninitialized timepoint objects.
  IREE_HAL_CUDA_TIMEPOINT_KIND_NONE = 0,
  // A timepoint waited by the host.
  IREE_HAL_CUDA_TIMEPOINT_KIND_HOST_WAIT,
  // A timepoint signaled by the device.
  IREE_HAL_CUDA_TIMEPOINT_KIND_DEVICE_SIGNAL,
  // A timepoint waited by the device.
  IREE_HAL_CUDA_TIMEPOINT_KIND_DEVICE_WAIT,
} iree_hal_cuda2_timepoint_kind_t;

// An object that wraps a host iree_event_t or device iree_hal_cuda2_event_t to
// represent wait/signal of a timepoint on a timeline.
//
// iree_hal_cuda2_timepoint_t objects cannot be directly created; it should be
// acquired from the timeline pool and released back to the pool once done.
//
// Thread-compatible; a timepoint is typically only accessed by one thread.
typedef struct iree_hal_cuda2_timepoint_t {
  // Base timepoint structure providing intrusive linked list pointers and
  // timepoint callback mechanisms.
  iree_hal_semaphore_timepoint_t base;

  // The allocator used to create the timepoint.
  iree_allocator_t host_allocator;

  // The timepoint pool that owns this timepoint.
  iree_hal_cuda2_timepoint_pool_t* pool;

  iree_hal_cuda2_timepoint_kind_t kind;
  union {
    iree_event_t host_wait;
    iree_hal_cuda2_event_t* device_signal;
    // The device event to wait. NULL means no device event available to wait
    // for this timepoint at the moment.
    iree_hal_cuda2_event_t* device_wait;
  } timepoint;
} iree_hal_cuda2_timepoint_t;

//===----------------------------------------------------------------------===//
// iree_hal_cuda2_timepoint_pool_t
//===----------------------------------------------------------------------===//

// A simple pool of iree_hal_cuda2_timepoint_t objects to recycle.
//
// Thread-safe; multiple threads may acquire and release timepoints from the
// pool.
typedef struct iree_hal_cuda2_timepoint_pool_t iree_hal_cuda2_timepoint_pool_t;

// Allocates a new timepoint pool with up to |available_capacity| timepoints.
//
// Extra timepoint requests beyond the capability are directly created and
// destroyed without pooling.
iree_status_t iree_hal_cuda2_timepoint_pool_allocate(
    iree_event_pool_t* host_event_pool,
    iree_hal_cuda2_event_pool_t* device_event_pool,
    iree_host_size_t available_capacity, iree_allocator_t host_allocator,
    iree_hal_cuda2_timepoint_pool_t** out_timepoint_pool);

// Deallocates a timepoint pool and destroys all timepoints.
//
// All timepoints that were acquired from the pool must have already been
// released back to it prior to deallocation.
void iree_hal_cuda2_timepoint_pool_free(
    iree_hal_cuda2_timepoint_pool_t* timepoint_pool);

// Acquires one or more timepoints from the timepoint pool.
//
// |out_timepoints| are owned by the caller and must be kept live until the
// timepoints have been reached, or cancelled by the caller.
iree_status_t iree_hal_cuda2_timepoint_pool_acquire_host_wait(
    iree_hal_cuda2_timepoint_pool_t* timepoint_pool,
    iree_host_size_t timepoint_count,
    iree_hal_cuda2_timepoint_t** out_timepoints);
iree_status_t iree_hal_cuda2_timepoint_pool_acquire_device_signal(
    iree_hal_cuda2_timepoint_pool_t* timepoint_pool,
    iree_host_size_t timepoint_count,
    iree_hal_cuda2_timepoint_t** out_timepoints);
iree_status_t iree_hal_cuda2_timepoint_pool_acquire_device_wait(
    iree_hal_cuda2_timepoint_pool_t* timepoint_pool,
    iree_host_size_t timepoint_count,
    iree_hal_cuda2_timepoint_t** out_timepoints);

// Releases one or more timepoints back to the timepoint pool.
void iree_hal_cuda2_timepoint_pool_release(
    iree_hal_cuda2_timepoint_pool_t* timepoint_pool,
    iree_host_size_t timepoint_count, iree_hal_cuda2_timepoint_t** timepoints);

#ifdef __cplusplus
}  // extern "C"
#endif  // __cplusplus

#endif  // EXPERIMENTAL_CUDA2_TIMEPOINT_POOL_H_
