blob: 39323ab440bd8b75b04dbcab525230ab650c32b5 [file] [log] [blame]
// Copyright 2019 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_VM_INSTANCE_H_
#define IREE_VM_INSTANCE_H_
#include "iree/base/api.h"
#include "iree/vm/ref.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
// Default maximum registered types value for iree_vm_instance_create.
// Users wanting to conserve memory can reduce this to the minimum their
// instance requires.
#define IREE_VM_TYPE_CAPACITY_DEFAULT 32
// Shared runtime instance responsible for routing iree_vm_context_ events,
// enumerating and creating hardware device interfaces, and managing device
// resource pools.
//
// A single runtime instance can service multiple contexts and hosting
// applications should try to reuse instances as much as possible. This ensures
// that resource allocation across contexts is handled and extraneous device
// interaction is avoided. For devices that may have exclusive access
// restrictions it is mandatory to share instances, so plan accordingly.
//
// Thread-safe.
typedef struct iree_vm_instance_t iree_vm_instance_t;
// Creates a new instance. This should be shared with all contexts in an
// application to ensure that resources are tracked properly and threads are
// managed correctly.
//
// |type_capacity| specifies the maximum number of types that can be
// simultaneously registered with the instance. Callers can use
// IREE_VM_TYPE_CAPACITY_DEFAULT if they have a reasonable number of types.
//
// |out_instance| must be released by the caller.
IREE_API_EXPORT iree_status_t iree_vm_instance_create(
iree_host_size_t type_capacity, iree_allocator_t allocator,
iree_vm_instance_t** out_instance);
// Retains the given |instance| for the caller.
IREE_API_EXPORT void iree_vm_instance_retain(iree_vm_instance_t* instance);
// Releases the given |instance| from the caller.
IREE_API_EXPORT void iree_vm_instance_release(iree_vm_instance_t* instance);
// Returns the host allocator the instance was created with.
IREE_API_EXPORT iree_allocator_t
iree_vm_instance_allocator(iree_vm_instance_t* instance);
// Registers a user-defined type with the IREE C ref system.
// The provided destroy function will be used to destroy objects when their
// reference count goes to 0. NULL can be used to no-op the destruction if the
// type is not owned by the VM.
//
// Descriptors registered multiple times will be deduplicated and counted to
// ensure a matching number of unregisters are required to fully unregister
// the type. Descriptors do not need to be unregistered before instance
// destruction and are only required if the memory defining the descriptor is
// invalid (shared library unload, etc).
//
// Once registered the descriptor must stay valid until all ref types created
// using it have expired and the type is unregistered from the instance.
//
// Upon successful registration |out_registration| will be set to the canonical
// iree_vm_ref_type_t that should be used when interacting with the type.
//
// NOTE: the name is not retained and must be kept live by the caller. Ideally
// it is stored in static read-only memory in the binary.
IREE_API_EXPORT iree_status_t
iree_vm_instance_register_type(iree_vm_instance_t* instance,
const iree_vm_ref_type_descriptor_t* descriptor,
iree_vm_ref_type_t* out_registration);
// Unregisters a user-defined type with the IREE C ref system.
// No iree_vm_ref_t instances must be live in the program referencing the type.
IREE_API_EXPORT void iree_vm_instance_unregister_type(
iree_vm_instance_t* instance,
const iree_vm_ref_type_descriptor_t* descriptor);
// Returns the registered type descriptor for the given type, if found.
IREE_API_EXPORT iree_vm_ref_type_t iree_vm_instance_lookup_type(
iree_vm_instance_t* instance, iree_string_view_t full_name);
// Resolves all builtin VM types by looking them up on the instance.
// This should only be called in dynamically-loaded libraries.
IREE_API_EXPORT iree_status_t
iree_vm_resolve_builtin_types(iree_vm_instance_t* instance);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
IREE_VM_DECLARE_CC_TYPE_ADAPTERS(iree_vm_instance, iree_vm_instance_t);
#endif // IREE_VM_INSTANCE_H_