diff --git a/Ryujinx.Memory/WindowsShared/MappingTree.cs b/Ryujinx.Memory/WindowsShared/MappingTree.cs index 8f880f0c8..7a18d4570 100644 --- a/Ryujinx.Memory/WindowsShared/MappingTree.cs +++ b/Ryujinx.Memory/WindowsShared/MappingTree.cs @@ -9,6 +9,8 @@ namespace Ryujinx.Memory.WindowsShared /// Type of the value stored on the node class MappingTree : IntrusiveRedBlackTree> { + private const int ArrayGrowthSize = 16; + public int GetNodes(ulong start, ulong end, ref RangeNode[] overlaps, int overlapCount = 0) { RangeNode node = GetNode(new RangeNode(start, start + 1UL, default)); @@ -17,7 +19,7 @@ namespace Ryujinx.Memory.WindowsShared { if (overlaps.Length <= overlapCount) { - Array.Resize(ref overlaps, overlapCount + 1); + Array.Resize(ref overlaps, overlapCount + ArrayGrowthSize); } overlaps[overlapCount++] = node; diff --git a/Ryujinx.Memory/WindowsShared/PlaceholderManager.cs b/Ryujinx.Memory/WindowsShared/PlaceholderManager.cs index b08a91e00..1722d528f 100644 --- a/Ryujinx.Memory/WindowsShared/PlaceholderManager.cs +++ b/Ryujinx.Memory/WindowsShared/PlaceholderManager.cs @@ -86,26 +86,26 @@ namespace Ryujinx.Memory.WindowsShared { ulong endAddress = address + size; - var overlaps = new RangeNode[InitialOverlapsSize]; - int count; - lock (_mappings) { - count = _mappings.GetNodes(address, endAddress, ref overlaps); + RangeNode node = _mappings.GetNode(new RangeNode(address, address + 1UL, default)); - for (int index = 0; index < count; index++) + for (; node != null; node = node.Successor) { - var overlap = overlaps[index]; - - if (IsMapped(overlap.Value)) + if (IsMapped(node.Value)) { - if (!WindowsApi.UnmapViewOfFile2(WindowsApi.CurrentProcessHandle, (IntPtr)overlap.Start, 2)) + if (!WindowsApi.UnmapViewOfFile2(WindowsApi.CurrentProcessHandle, (IntPtr)node.Start, 2)) { throw new WindowsApiException("UnmapViewOfFile2"); } } - _mappings.Remove(overlap); + _mappings.Remove(node); + + if (node.End >= endAddress) + { + break; + } } }