Revert "Memory Changes"

This reverts commit d5c9bc662c.

Solves crash in Kirby Star Allies after a few mins of gameplay, possibly other titles.
This commit is contained in:
KeatonTheBot
2025-08-17 00:19:01 -05:00
parent 7fd01214cf
commit 48c809a80d
17 changed files with 736 additions and 1583 deletions
@@ -14,13 +14,12 @@ namespace Ryujinx.Common.Collections
/// Adds a new node into the tree.
/// </summary>
/// <param name="node">Node to be added</param>
/// <param name="parent">Node to be added under</param>
/// <exception cref="ArgumentNullException"><paramref name="node"/> is null</exception>
public void Add(T node, T parent = null)
public void Add(T node)
{
ArgumentNullException.ThrowIfNull(node);
Insert(node, parent);
Insert(node);
}
/// <summary>
@@ -76,11 +75,9 @@ namespace Ryujinx.Common.Collections
/// Inserts a new node into the tree.
/// </summary>
/// <param name="node">Node to be inserted</param>
/// <param name="parent">Node to be inserted under</param>
private void Insert(T node, T parent = null)
private void Insert(T node)
{
T newNode = parent != null ? InsertWithParent(node, parent) : BSTInsert(node);
T newNode = BSTInsert(node);
RestoreBalanceAfterInsertion(newNode);
}
@@ -123,78 +120,10 @@ namespace Ryujinx.Common.Collections
else if (newNode.CompareTo(parent) < 0)
{
parent.Left = newNode;
newNode.Successor = parent;
if (parent.Predecessor != null)
{
newNode.Predecessor = parent.Predecessor;
parent.Predecessor = newNode;
newNode.Predecessor.Successor = newNode;
}
parent.Predecessor = newNode;
}
else
{
parent.Right = newNode;
newNode.Predecessor = parent;
if (parent.Successor != null)
{
newNode.Successor = parent.Successor;
newNode.Successor.Predecessor = newNode;
}
parent.Successor = newNode;
}
Count++;
return newNode;
}
/// <summary>
/// Insertion Mechanism for a Binary Search Tree (BST).
/// <br></br>
/// Inserts a new node directly under a parent node
/// where all children in the left subtree are less than <paramref name="newNode"/>,
/// and all children in the right subtree are greater than <paramref name="newNode"/>.
/// </summary>
/// <param name="newNode">Node to be inserted</param>
/// <param name="parent">Node to be inserted under</param>
/// <returns>The inserted Node</returns>
private T InsertWithParent(T newNode, T parent)
{
newNode.Parent = parent;
if (newNode.CompareTo(parent) < 0)
{
parent.Left = newNode;
newNode.Successor = parent;
if (parent.Predecessor != null)
{
newNode.Predecessor = parent.Predecessor;
parent.Predecessor = newNode;
newNode.Predecessor.Successor = newNode;
}
parent.Predecessor = newNode;
}
else
{
parent.Right = newNode;
newNode.Predecessor = parent;
if (parent.Successor != null)
{
newNode.Successor = parent.Successor;
newNode.Successor.Predecessor = newNode;
}
parent.Successor = newNode;
}
Count++;
return newNode;
@@ -227,7 +156,7 @@ namespace Ryujinx.Common.Collections
}
else
{
T element = nodeToDelete.Successor;
T element = Minimum(RightOf(nodeToDelete));
child = RightOf(element);
parent = ParentOf(element);
@@ -255,9 +184,6 @@ namespace Ryujinx.Common.Collections
element.Left = old.Left;
element.Right = old.Right;
element.Parent = old.Parent;
element.Predecessor = old.Predecessor;
if (element.Predecessor != null)
element.Predecessor.Successor = element;
if (ParentOf(old) == null)
{
@@ -312,11 +238,6 @@ namespace Ryujinx.Common.Collections
{
RestoreBalanceAfterRemoval(child);
}
if (old.Successor != null)
old.Successor.Predecessor = old.Predecessor;
if (old.Predecessor != null)
old.Predecessor.Successor = old.Successor;
return old;
}
@@ -9,7 +9,8 @@ namespace Ryujinx.Common.Collections
public T Left;
public T Right;
public T Parent;
public T Predecessor;
public T Successor;
public T Predecessor => IntrusiveRedBlackTreeImpl<T>.PredecessorOf((T)this);
public T Successor => IntrusiveRedBlackTreeImpl<T>.SuccessorOf((T)this);
}
}
@@ -107,7 +107,7 @@ namespace Ryujinx.Common.Collections
Node<TKey, TValue> node = GetNode(key);
if (node != null)
{
Node<TKey, TValue> successor = node.Successor;
Node<TKey, TValue> successor = SuccessorOf(node);
return successor != null ? successor.Key : default;
}
@@ -124,7 +124,7 @@ namespace Ryujinx.Common.Collections
Node<TKey, TValue> node = GetNode(key);
if (node != null)
{
Node<TKey, TValue> predecessor = node.Predecessor;
Node<TKey, TValue> predecessor = PredecessorOf(node);
return predecessor != null ? predecessor.Key : default;
}
@@ -132,10 +132,11 @@ namespace Ryujinx.Common.Collections
}
/// <summary>
/// Adds all the nodes in the dictionary as key/value pairs into a list.
/// Adds all the nodes in the dictionary as key/value pairs into <paramref name="list"/>.
/// <br></br>
/// The key/value pairs will be added in Level Order.
/// </summary>
/// <param name="list">List to add the tree pairs into</param>
public List<KeyValuePair<TKey, TValue>> AsLevelOrderList()
{
List<KeyValuePair<TKey, TValue>> list = [];
@@ -162,7 +163,7 @@ namespace Ryujinx.Common.Collections
}
/// <summary>
/// Adds all the nodes in the dictionary into a list.
/// Adds all the nodes in the dictionary into <paramref name="list"/>.
/// </summary>
/// <returns>A list of all KeyValuePairs sorted by Key Order</returns>
public List<KeyValuePair<TKey, TValue>> AsList()
@@ -274,7 +275,7 @@ namespace Ryujinx.Common.Collections
}
}
Node<TKey, TValue> newNode = new(key, value, parent);
if (parent == null)
if (newNode.Parent == null)
{
Root = newNode;
}