diff options
| author | gdk <gab.dark.100@gmail.com> | 2022-07-15 17:05:14 -0300 |
|---|---|---|
| committer | Mary-nyan <thog@protonmail.com> | 2022-09-10 16:23:49 +0200 |
| commit | 65f2a82b9745548748aa1d68547aff7a2cac574a (patch) | |
| tree | 0c6076624f005b7658b151f85fcaf046d0cfdb74 | |
| parent | 93dd6d525a8c4072ba704e0bb126a980ef4b479a (diff) | |
Optimize PlaceholderManager.UnreserveRange
| -rw-r--r-- | Ryujinx.Memory/WindowsShared/MappingTree.cs | 4 | ||||
| -rw-r--r-- | Ryujinx.Memory/WindowsShared/PlaceholderManager.cs | 20 |
2 files changed, 13 insertions, 11 deletions
diff --git a/Ryujinx.Memory/WindowsShared/MappingTree.cs b/Ryujinx.Memory/WindowsShared/MappingTree.cs index 8f880f0c..7a18d457 100644 --- a/Ryujinx.Memory/WindowsShared/MappingTree.cs +++ b/Ryujinx.Memory/WindowsShared/MappingTree.cs @@ -9,6 +9,8 @@ namespace Ryujinx.Memory.WindowsShared /// <typeparam name="T">Type of the value stored on the node</typeparam> class MappingTree<T> : IntrusiveRedBlackTree<RangeNode<T>> { + private const int ArrayGrowthSize = 16; + public int GetNodes(ulong start, ulong end, ref RangeNode<T>[] overlaps, int overlapCount = 0) { RangeNode<T> node = GetNode(new RangeNode<T>(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 b08a91e0..1722d528 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<ulong>[InitialOverlapsSize]; - int count; - lock (_mappings) { - count = _mappings.GetNodes(address, endAddress, ref overlaps); + RangeNode<ulong> node = _mappings.GetNode(new RangeNode<ulong>(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; + } } } |
