From c172abfb53e664b1f1e2cd11c6dfb99e6202553e Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 28 Apr 2026 01:15:21 +0200 Subject: [hle] reuse previous pagetable when initializing new processes on the same KProcessPageTable (#3891) VirtualBuffer<> would be recreated each time due to the `operator=()` from the unique_ptr<> when initializing a new process, this change makes it so said thing doesn't happen (instead it resizes the existing buffer) this means that consecutive launches of the same process that happen to have the same process page table (or reuse it) will no longer incur a ctor/dtor path for VirtualBuffer and instead just resize the existing one Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3891 Reviewed-by: crueter Reviewed-by: CamilleLaVey --- src/common/virtual_buffer.h | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'src/common/virtual_buffer.h') diff --git a/src/common/virtual_buffer.h b/src/common/virtual_buffer.h index 4f6e3e6e5c..af96317288 100644 --- a/src/common/virtual_buffer.h +++ b/src/common/virtual_buffer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -21,7 +24,9 @@ public: // "with the current allocator"); constexpr VirtualBuffer() = default; - explicit VirtualBuffer(std::size_t count) : alloc_size{count * sizeof(T)} { + explicit VirtualBuffer(std::size_t count) noexcept + : alloc_size{count * sizeof(T)} + { base_ptr = reinterpret_cast(AllocateMemoryPages(alloc_size)); } @@ -33,8 +38,8 @@ public: VirtualBuffer& operator=(const VirtualBuffer&) = delete; VirtualBuffer(VirtualBuffer&& other) noexcept - : alloc_size{std::exchange(other.alloc_size, 0)}, base_ptr{std::exchange(other.base_ptr), - nullptr} {} + : alloc_size{std::exchange(other.alloc_size, 0)}, base_ptr{std::exchange(other.base_ptr), nullptr} + {} VirtualBuffer& operator=(VirtualBuffer&& other) noexcept { alloc_size = std::exchange(other.alloc_size, 0); @@ -42,35 +47,31 @@ public: return *this; } - void resize(std::size_t count) { - const auto new_size = count * sizeof(T); - if (new_size == alloc_size) { - return; + void resize(std::size_t count) noexcept { + if (auto const new_size = count * sizeof(T); new_size != alloc_size) { + FreeMemoryPages(base_ptr, alloc_size); + alloc_size = new_size; + base_ptr = reinterpret_cast(AllocateMemoryPages(alloc_size)); } - - FreeMemoryPages(base_ptr, alloc_size); - - alloc_size = new_size; - base_ptr = reinterpret_cast(AllocateMemoryPages(alloc_size)); } - [[nodiscard]] constexpr const T& operator[](std::size_t index) const { + [[nodiscard]] constexpr const T& operator[](std::size_t index) const noexcept { return base_ptr[index]; } - [[nodiscard]] constexpr T& operator[](std::size_t index) { + [[nodiscard]] constexpr T& operator[](std::size_t index) noexcept { return base_ptr[index]; } - [[nodiscard]] constexpr T* data() { + [[nodiscard]] constexpr T* data() noexcept { return base_ptr; } - [[nodiscard]] constexpr const T* data() const { + [[nodiscard]] constexpr const T* data() const noexcept { return base_ptr; } - [[nodiscard]] constexpr std::size_t size() const { + [[nodiscard]] constexpr std::size_t size() const noexcept { return alloc_size / sizeof(T); } -- cgit v1.2.3