Allocation free tree lookup

This commit is contained in:
gdk 2022-08-30 22:26:40 -03:00 committed by Mary-nyan
parent c646638680
commit 7dd69f2d0e
2 changed files with 24 additions and 7 deletions

View File

@ -13,7 +13,7 @@ namespace Ryujinx.Memory.WindowsShared
public int GetNodes(ulong start, ulong end, ref RangeNode<T>[] overlaps, int overlapCount = 0) 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)); RangeNode<T> node = this.GetNodeByKey(start);
for (; node != null; node = node.Successor) for (; node != null; node = node.Successor)
{ {
@ -34,7 +34,7 @@ namespace Ryujinx.Memory.WindowsShared
} }
} }
class RangeNode<T> : IntrusiveRedBlackTreeNode<RangeNode<T>>, IComparable<RangeNode<T>> class RangeNode<T> : IntrusiveRedBlackTreeNode<RangeNode<T>>, IComparable<RangeNode<T>>, IComparable<ulong>
{ {
public ulong Start { get; } public ulong Start { get; }
public ulong End { get; private set; } public ulong End { get; private set; }
@ -67,5 +67,21 @@ namespace Ryujinx.Memory.WindowsShared
return 1; return 1;
} }
} }
public int CompareTo(ulong address)
{
if (address < Start)
{
return 1;
}
else if (address <= End - 1UL)
{
return 0;
}
else
{
return -1;
}
}
} }
} }

View File

@ -1,3 +1,4 @@
using Ryujinx.Common.Collections;
using Ryujinx.Common.Memory.PartialUnmaps; using Ryujinx.Common.Memory.PartialUnmaps;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
@ -88,7 +89,7 @@ namespace Ryujinx.Memory.WindowsShared
lock (_mappings) lock (_mappings)
{ {
RangeNode<ulong> node = _mappings.GetNode(new RangeNode<ulong>(address, address + 1UL, default)); RangeNode<ulong> node = _mappings.GetNodeByKey(address);
RangeNode<ulong> successorNode; RangeNode<ulong> successorNode;
for (; node != null; node = successorNode) for (; node != null; node = successorNode)
@ -379,7 +380,7 @@ namespace Ryujinx.Memory.WindowsShared
lock (_mappings) lock (_mappings)
{ {
RangeNode<ulong> node = _mappings.GetNode(new RangeNode<ulong>(address, address + 1UL, default)); RangeNode<ulong> node = _mappings.GetNodeByKey(address);
if (node == null) if (node == null)
{ {
@ -481,7 +482,7 @@ namespace Ryujinx.Memory.WindowsShared
lock (_mappings) lock (_mappings)
{ {
RangeNode<ulong> node = _mappings.GetNode(new RangeNode<ulong>(reprotectAddress, reprotectAddress + 1UL, default)); RangeNode<ulong> node = _mappings.GetNodeByKey(reprotectAddress);
RangeNode<ulong> successorNode; RangeNode<ulong> successorNode;
for (; node != null; node = successorNode) for (; node != null; node = successorNode)
@ -580,7 +581,7 @@ namespace Ryujinx.Memory.WindowsShared
lock (_protections) lock (_protections)
{ {
RangeNode<MemoryPermission> node = _protections.GetNode(new RangeNode<MemoryPermission>(address, address + 1UL, default)); RangeNode<MemoryPermission> node = _protections.GetNodeByKey(address);
if (node != null && if (node != null &&
node.Start <= address && node.Start <= address &&
@ -651,7 +652,7 @@ namespace Ryujinx.Memory.WindowsShared
lock (_protections) lock (_protections)
{ {
RangeNode<MemoryPermission> node = _protections.GetNode(new RangeNode<MemoryPermission>(address, address + 1UL, default)); RangeNode<MemoryPermission> node = _protections.GetNodeByKey(address);
RangeNode<MemoryPermission> successorNode; RangeNode<MemoryPermission> successorNode;
for (; node != null; node = successorNode) for (; node != null; node = successorNode)