From 29f712d3b55b9ce5d0d9397e276dd50aafc33c7e Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 7 Jul 2026 20:17:29 +0200 Subject: [PATCH] [core/device_memory_manager] use more pointer/iterator stable std::vector<> instead of deque<> for multi address scatter/gather (#4098) this SHOULD fix a specific issue where a deque can be reallocated causing spurious crashes Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4098 Reviewed-by: CamilleLaVey Reviewed-by: MaranBr --- src/core/device_memory_manager.inc | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/core/device_memory_manager.inc b/src/core/device_memory_manager.inc index 15e3a1ad52..43a480cfef 100644 --- a/src/core/device_memory_manager.inc +++ b/src/core/device_memory_manager.inc @@ -11,6 +11,8 @@ #include #include +#include + #include "common/address_space.h" #include "common/address_space.inc" #include "common/alignment.h" @@ -33,21 +35,23 @@ public: void GatherValues(u32 start_entry, Common::ScratchBuffer& buffer) { buffer.resize(8); - buffer.resize(0); - size_t index = 0; - const auto add_value = [&](u32 value) { - buffer.resize(index + 1); + const auto add_value = [&buffer](u32 value, size_t index) { + if (buffer.size() < index + 1) + buffer.resize(index + 8); buffer[index++] = value; + return index; }; + size_t index = 0; u32 iter_entry = start_entry; Entry* current = &storage[iter_entry - 1]; - add_value(current->value); + index = add_value(current->value, index); while (current->next_entry != 0) { iter_entry = current->next_entry; current = &storage[iter_entry - 1]; - add_value(current->value); + index = add_value(current->value, index); } + buffer.resize(index); } u32 Register(u32 value) { @@ -124,8 +128,8 @@ private: u32 value{}; }; - std::deque storage; - std::deque free_entries; + std::vector storage; + boost::container::deque free_entries; }; struct EmptyAllocator { @@ -619,7 +623,7 @@ template void DeviceMemoryManager::UpdatePagesCachedCount(DAddr addr, size_t size, s32 delta) { Common::ScopedRangeLock lk(counter_guard, addr, size); UpdatePagesCachedCountNoLock(addr, size, delta); -} +} template void DeviceMemoryManager::UpdatePagesCachedBatch(std::span> ranges, s32 delta) {