// Copyright 2022 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #if !V8_ENABLE_WEBASSEMBLY #error This header should only be included if WebAssembly is enabled. #endif // !V8_ENABLE_WEBASSEMBLY #ifndef V8_WASM_ASSEMBLER_BUFFER_CACHE_H_ #define V8_WASM_ASSEMBLER_BUFFER_CACHE_H_ #include <memory> #include "src/wasm/wasm-code-manager.h" namespace v8::internal { class AssemblerBuffer; } namespace v8::internal::wasm { class CachedAssemblerBuffer; // Creating assembler buffers can be expensive, in particular if PKU is used, // which requires an {mmap} and {pkey_protect} system call for each new buffer. // Hence pool-allocate a larger memory region and reuse it if assembler buffers // are freed. class AssemblerBufferCache final { public: ~AssemblerBufferCache(); std::unique_ptr<AssemblerBuffer> GetAssemblerBuffer(int size); private: friend class CachedAssemblerBuffer; // Called when CachedAssemblerBuffers get destroyed, to return memory to the // cache. void Return(base::AddressRegion); DisjointAllocationPool available_memory_; int total_allocated_ = 0; }; } // namespace v8::internal::wasm #endif // V8_WASM_ASSEMBLER_BUFFER_CACHE_H_