Browse Source

[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 <lizzie@eden-emu.dev>

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4098
Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
Reviewed-by: MaranBr <maranbr@eden-emu.dev>
lizzie/maxwell-use-params-instead-of-template
lizzie 4 days ago
committed by crueter
parent
commit
29f712d3b5
No known key found for this signature in database GPG Key ID: 425ACD2D4830EBC6
  1. 22
      src/core/device_memory_manager.inc

22
src/core/device_memory_manager.inc

@ -11,6 +11,8 @@
#include <algorithm> #include <algorithm>
#include <vector> #include <vector>
#include <boost/container/deque.hpp>
#include "common/address_space.h" #include "common/address_space.h"
#include "common/address_space.inc" #include "common/address_space.inc"
#include "common/alignment.h" #include "common/alignment.h"
@ -33,21 +35,23 @@ public:
void GatherValues(u32 start_entry, Common::ScratchBuffer<u32>& buffer) { void GatherValues(u32 start_entry, Common::ScratchBuffer<u32>& buffer) {
buffer.resize(8); 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; buffer[index++] = value;
return index;
}; };
size_t index = 0;
u32 iter_entry = start_entry; u32 iter_entry = start_entry;
Entry* current = &storage[iter_entry - 1]; Entry* current = &storage[iter_entry - 1];
add_value(current->value);
index = add_value(current->value, index);
while (current->next_entry != 0) { while (current->next_entry != 0) {
iter_entry = current->next_entry; iter_entry = current->next_entry;
current = &storage[iter_entry - 1]; current = &storage[iter_entry - 1];
add_value(current->value);
index = add_value(current->value, index);
} }
buffer.resize(index);
} }
u32 Register(u32 value) { u32 Register(u32 value) {
@ -124,8 +128,8 @@ private:
u32 value{}; u32 value{};
}; };
std::deque<Entry> storage;
std::deque<u32> free_entries;
std::vector<Entry> storage;
boost::container::deque<u32> free_entries;
}; };
struct EmptyAllocator { struct EmptyAllocator {
@ -619,7 +623,7 @@ template <typename Traits>
void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size, s32 delta) { void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size, s32 delta) {
Common::ScopedRangeLock lk(counter_guard, addr, size); Common::ScopedRangeLock lk(counter_guard, addr, size);
UpdatePagesCachedCountNoLock(addr, size, delta); UpdatePagesCachedCountNoLock(addr, size, delta);
}
}
template <typename Traits> template <typename Traits>
void DeviceMemoryManager<Traits>::UpdatePagesCachedBatch(std::span<const std::pair<DAddr, size_t>> ranges, s32 delta) { void DeviceMemoryManager<Traits>::UpdatePagesCachedBatch(std::span<const std::pair<DAddr, size_t>> ranges, s32 delta) {

Loading…
Cancel
Save