Browse Source
[heap_tracker] fix map ordering violations
Signed-off-by: lizzie <lizzie@eden-emu.dev>
liz-heaptrack-fix
lizzie
4 months ago
No known key found for this signature in database
GPG Key ID: 287378CADCAB13
2 changed files with
7 additions and
6 deletions
-
src/common/heap_tracker.cpp
-
src/common/heap_tracker.h
|
|
|
@ -168,8 +168,7 @@ void HeapTracker::SplitHeapMap(VAddr offset, size_t size) { |
|
|
|
} |
|
|
|
|
|
|
|
void HeapTracker::SplitHeapMapLocked(VAddr offset) { |
|
|
|
auto it = this->GetNearestHeapMapLocked(offset); |
|
|
|
if (it != m_mappings.end() && it->first != offset) { |
|
|
|
if (auto it = this->GetNearestHeapMapLocked(offset); it != m_mappings.end() && it->first != offset) { |
|
|
|
// Adjust left iterator
|
|
|
|
auto const orig_size = it->second.size; |
|
|
|
auto const left_size = offset - it->first; |
|
|
|
|
|
|
|
@ -7,7 +7,7 @@ |
|
|
|
|
|
|
|
#include <mutex> |
|
|
|
#include <shared_mutex> |
|
|
|
#include <ankerl/unordered_dense.h> |
|
|
|
#include <boost/container/map.hpp> |
|
|
|
#include "common/host_memory.h" |
|
|
|
|
|
|
|
namespace Common { |
|
|
|
@ -35,10 +35,12 @@ public: |
|
|
|
private: |
|
|
|
// TODO: You may want to "fake-map" the first 2GB of 64-bit address space |
|
|
|
// and dedicate it entirely to a recursive PTE mapping :) |
|
|
|
// However Ankerl is way better than using an RB tree, in all senses |
|
|
|
using AddrTree = ankerl::unordered_dense::map<VAddr, SeparateHeapMap>; |
|
|
|
// However Ankerl would be way better than using an RB tree, in all senses - but |
|
|
|
// there is a strict requirement for ordering to be imposed accross the map itself |
|
|
|
// which is not achievable with the unordered property. |
|
|
|
using AddrTree = boost::container::map<VAddr, SeparateHeapMap>; |
|
|
|
AddrTree m_mappings; |
|
|
|
using TicksTree = ankerl::unordered_dense::map<VAddr, SeparateHeapMap>; |
|
|
|
using TicksTree = boost::container::map<VAddr, SeparateHeapMap>; |
|
|
|
TicksTree m_resident_mappings; |
|
|
|
private: |
|
|
|
void SplitHeapMap(VAddr offset, size_t size); |
|
|
|
|