1*523fa7a6SAndroid Build Coastguard Worker /* 2*523fa7a6SAndroid Build Coastguard Worker * Copyright (c) Meta Platforms, Inc. and affiliates. 3*523fa7a6SAndroid Build Coastguard Worker * All rights reserved. 4*523fa7a6SAndroid Build Coastguard Worker * 5*523fa7a6SAndroid Build Coastguard Worker * This source code is licensed under the BSD-style license found in the 6*523fa7a6SAndroid Build Coastguard Worker * LICENSE file in the root directory of this source tree. 7*523fa7a6SAndroid Build Coastguard Worker */ 8*523fa7a6SAndroid Build Coastguard Worker 9*523fa7a6SAndroid Build Coastguard Worker #pragma once 10*523fa7a6SAndroid Build Coastguard Worker 11*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/span.h> 12*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/method.h> 13*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/method_meta.h> 14*523fa7a6SAndroid Build Coastguard Worker 15*523fa7a6SAndroid Build Coastguard Worker namespace executorch { 16*523fa7a6SAndroid Build Coastguard Worker namespace extension { 17*523fa7a6SAndroid Build Coastguard Worker 18*523fa7a6SAndroid Build Coastguard Worker /** 19*523fa7a6SAndroid Build Coastguard Worker * RAII helper that frees a set of buffers when destroyed. Movable. 20*523fa7a6SAndroid Build Coastguard Worker */ 21*523fa7a6SAndroid Build Coastguard Worker class BufferCleanup final { 22*523fa7a6SAndroid Build Coastguard Worker public: 23*523fa7a6SAndroid Build Coastguard Worker /** 24*523fa7a6SAndroid Build Coastguard Worker * Takes ownership of `buffers.data()` and the elements of `buffers`, which 25*523fa7a6SAndroid Build Coastguard Worker * each will be passed to `free()` when the object is destroyed. 26*523fa7a6SAndroid Build Coastguard Worker */ BufferCleanup(executorch::runtime::Span<void * > buffers)27*523fa7a6SAndroid Build Coastguard Worker explicit BufferCleanup(executorch::runtime::Span<void*> buffers) 28*523fa7a6SAndroid Build Coastguard Worker : buffers_(buffers) {} 29*523fa7a6SAndroid Build Coastguard Worker 30*523fa7a6SAndroid Build Coastguard Worker /** 31*523fa7a6SAndroid Build Coastguard Worker * Move ctor. Takes ownership of the data previously owned by `rhs`, leaving 32*523fa7a6SAndroid Build Coastguard Worker * `rhs` with an empty list of buffers. 33*523fa7a6SAndroid Build Coastguard Worker */ BufferCleanup(BufferCleanup && rhs)34*523fa7a6SAndroid Build Coastguard Worker BufferCleanup(BufferCleanup&& rhs) noexcept : buffers_(rhs.buffers_) { 35*523fa7a6SAndroid Build Coastguard Worker rhs.buffers_ = executorch::runtime::Span<void*>(); 36*523fa7a6SAndroid Build Coastguard Worker } 37*523fa7a6SAndroid Build Coastguard Worker ~BufferCleanup()38*523fa7a6SAndroid Build Coastguard Worker ~BufferCleanup() { 39*523fa7a6SAndroid Build Coastguard Worker for (auto buffer : buffers_) { 40*523fa7a6SAndroid Build Coastguard Worker free(buffer); 41*523fa7a6SAndroid Build Coastguard Worker } 42*523fa7a6SAndroid Build Coastguard Worker free(buffers_.data()); 43*523fa7a6SAndroid Build Coastguard Worker } 44*523fa7a6SAndroid Build Coastguard Worker 45*523fa7a6SAndroid Build Coastguard Worker private: 46*523fa7a6SAndroid Build Coastguard Worker // Delete other rule-of-five methods. 47*523fa7a6SAndroid Build Coastguard Worker BufferCleanup(const BufferCleanup&) = delete; 48*523fa7a6SAndroid Build Coastguard Worker BufferCleanup& operator=(const BufferCleanup&) = delete; 49*523fa7a6SAndroid Build Coastguard Worker BufferCleanup& operator=(BufferCleanup&&) noexcept = delete; 50*523fa7a6SAndroid Build Coastguard Worker 51*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Span<void*> buffers_; 52*523fa7a6SAndroid Build Coastguard Worker }; 53*523fa7a6SAndroid Build Coastguard Worker 54*523fa7a6SAndroid Build Coastguard Worker /** 55*523fa7a6SAndroid Build Coastguard Worker * Allocates input tensors for the provided Method, filling them with ones. Does 56*523fa7a6SAndroid Build Coastguard Worker * not modify inputs that are not Tensors. 57*523fa7a6SAndroid Build Coastguard Worker * 58*523fa7a6SAndroid Build Coastguard Worker * @param[in] method The Method that owns the inputs to prepare. 59*523fa7a6SAndroid Build Coastguard Worker * 60*523fa7a6SAndroid Build Coastguard Worker * @returns On success, an object that owns any allocated tensor memory. It must 61*523fa7a6SAndroid Build Coastguard Worker * remain alive when calling `method->execute()`. 62*523fa7a6SAndroid Build Coastguard Worker * @returns An error on failure. 63*523fa7a6SAndroid Build Coastguard Worker */ 64*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Result<BufferCleanup> prepare_input_tensors( 65*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Method& method); 66*523fa7a6SAndroid Build Coastguard Worker 67*523fa7a6SAndroid Build Coastguard Worker namespace internal { 68*523fa7a6SAndroid Build Coastguard Worker /** 69*523fa7a6SAndroid Build Coastguard Worker * INTERNAL-ONLY: Creates a Tensor using the provided shape and buffer, 70*523fa7a6SAndroid Build Coastguard Worker * fills it with ones, and sets the input at `input_index`. 71*523fa7a6SAndroid Build Coastguard Worker */ 72*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Error fill_and_set_input( 73*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::Method& method, 74*523fa7a6SAndroid Build Coastguard Worker executorch::runtime::TensorInfo& tensor_meta, 75*523fa7a6SAndroid Build Coastguard Worker size_t input_index, 76*523fa7a6SAndroid Build Coastguard Worker void* data_ptr); 77*523fa7a6SAndroid Build Coastguard Worker } // namespace internal 78*523fa7a6SAndroid Build Coastguard Worker 79*523fa7a6SAndroid Build Coastguard Worker } // namespace extension 80*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch 81*523fa7a6SAndroid Build Coastguard Worker 82*523fa7a6SAndroid Build Coastguard Worker namespace torch { 83*523fa7a6SAndroid Build Coastguard Worker namespace executor { 84*523fa7a6SAndroid Build Coastguard Worker namespace util { 85*523fa7a6SAndroid Build Coastguard Worker // TODO(T197294990): Remove these deprecated aliases once all users have moved 86*523fa7a6SAndroid Build Coastguard Worker // to the new `::executorch` namespaces. 87*523fa7a6SAndroid Build Coastguard Worker using ::executorch::extension::BufferCleanup; 88*523fa7a6SAndroid Build Coastguard Worker using ::executorch::extension::prepare_input_tensors; 89*523fa7a6SAndroid Build Coastguard Worker } // namespace util 90*523fa7a6SAndroid Build Coastguard Worker } // namespace executor 91*523fa7a6SAndroid Build Coastguard Worker } // namespace torch 92