blob: 12811bd113d6332b0ebc1eb39fefc236a5fdb693 [file] [log] [blame]
// Copyright 2022 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 IREE_BASE_LOOP_SYNC_H_
#define IREE_BASE_LOOP_SYNC_H_
#include "iree/base/api.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
//===----------------------------------------------------------------------===//
// iree_loop_sync_t
//===----------------------------------------------------------------------===//
// Configuration options for the synchronous loop implementation.
typedef struct iree_loop_sync_options_t {
// Specifies the maximum operation queue depth in number of operations.
// Growth is not currently supported and if the capacity is reached during
// execution then IREE_STATUS_RESOURCE_EXHAUSTED will be returned when new
// operations are enqueued.
iree_host_size_t max_queue_depth;
// Specifies how many pending waits are allowed at the same time.
// Growth is not currently supported and if the capacity is reached during
// execution then IREE_STATUS_RESOURCE_EXHAUSTED will be returned when new
// waits are enqueued.
iree_host_size_t max_wait_count;
} iree_loop_sync_options_t;
// A lightweight loop that greedily runs operations as they are available.
// This does not require any system threading support and has deterministic
// behavior unless multi-waits are used.
//
// Thread-compatible: the loop only performs work when iree_loop_drain is
// called and must not be used from multiple threads concurrently.
typedef struct iree_loop_sync_t iree_loop_sync_t;
// Allocates a synchronous loop using |allocator| stored into |out_loop_sync|.
IREE_API_EXPORT iree_status_t iree_loop_sync_allocate(
iree_loop_sync_options_t options, iree_allocator_t allocator,
iree_loop_sync_t** out_loop_sync);
// Frees a synchronous |loop_sync|, aborting all pending operations.
IREE_API_EXPORT void iree_loop_sync_free(iree_loop_sync_t* loop_sync);
// Waits until the loop is idle (all operations in all scopes have retired).
// Returns IREE_STATUS_DEADLINE_EXCEEDED if |timeout| is reached before the
// loop is idle.
IREE_API_EXPORT iree_status_t
iree_loop_sync_wait_idle(iree_loop_sync_t* loop_sync, iree_timeout_t timeout);
// Handles scope errors returned from loop callback operations.
// Ownership of |status| is passed to the handler and must be freed.
// All operations of the same scope will be aborted.
typedef void(IREE_API_PTR* iree_loop_sync_error_fn_t)(void* user_data,
iree_status_t status);
// A scope of execution within a loop.
// Each scope has a dedicated error handler that is notified when an error
// propagates from a loop operation scheduled against the scope. When an error
// arises all other operations in the same scope will be aborted.
typedef struct iree_loop_sync_scope_t {
// Target loop for execution.
iree_loop_sync_t* loop_sync;
// Total number of pending operations in the scope.
// When 0 the scope is considered idle.
int32_t pending_count;
// Optional function used to report errors that occur during execution.
iree_loop_sync_error_fn_t error_fn;
void* error_user_data;
} iree_loop_sync_scope_t;
// Initializes a loop scope that runs operations against |loop_sync|.
IREE_API_EXPORT void iree_loop_sync_scope_initialize(
iree_loop_sync_t* loop_sync, iree_loop_sync_error_fn_t error_fn,
void* error_user_data, iree_loop_sync_scope_t* out_scope);
// Deinitializes a loop |scope| and aborts any pending operations.
IREE_API_EXPORT void iree_loop_sync_scope_deinitialize(
iree_loop_sync_scope_t* scope);
IREE_API_EXPORT iree_status_t iree_loop_sync_ctl(void* self,
iree_loop_command_t command,
const void* params,
void** inout_ptr);
// Returns a loop that schedules operations against |scope|.
// The scope must remain valid until all operations scheduled against it have
// completed.
static inline iree_loop_t iree_loop_sync_scope(iree_loop_sync_scope_t* scope) {
iree_loop_t loop = {
scope,
iree_loop_sync_ctl,
};
return loop;
}
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // IREE_BASE_LOOP_SYNC_H_