Allocation free tree lookup
This commit is contained in:
parent
c646638680
commit
7dd69f2d0e
2 changed files with 24 additions and 7 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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)
|
||||||
|
|
Reference in a new issue