1
0
forked from MeloNX/MeloNX

Fix potential race + wrong check for partition not being found

This commit is contained in:
Gabriel A 2024-01-04 20:48:53 -03:00
parent df92f2052a
commit 942efbb6d6

View File

@ -33,19 +33,22 @@ namespace Ryujinx.Cpu.Jit
while (va < endVa) while (va < endVa)
{ {
int partitionIndex = FindPartitionIndex(va); lock (_partitions)
AddressSpacePartition partition = _partitions[partitionIndex]; {
int partitionIndex = FindPartitionIndex(va);
AddressSpacePartition partition = _partitions[partitionIndex];
(ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa); (ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa);
partition.Map(clampedVa, pa, clampedEndVa - clampedVa); partition.Map(clampedVa, pa, clampedEndVa - clampedVa);
ulong currentSize = clampedEndVa - clampedVa; ulong currentSize = clampedEndVa - clampedVa;
va += currentSize; va += currentSize;
pa += currentSize; pa += currentSize;
InsertBridgeIfNeeded(partitionIndex); InsertBridgeIfNeeded(partitionIndex);
}
} }
} }
@ -55,27 +58,29 @@ namespace Ryujinx.Cpu.Jit
while (va < endVa) while (va < endVa)
{ {
int partitionIndex = FindPartitionIndex(va); AddressSpacePartition partition;
AddressSpacePartition partition = _partitions[partitionIndex];
if (partition == null) lock (_partitions)
{ {
va += PartitionSize - (va & (PartitionSize - 1)); int partitionIndex = FindPartitionIndex(va);
if (partitionIndex < 0)
{
va += PartitionSize - (va & (PartitionSize - 1));
continue; continue;
} }
(ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa); partition = _partitions[partitionIndex];
partition.Unmap(clampedVa, clampedEndVa - clampedVa); (ulong clampedVa, ulong clampedEndVa) = ClampRange(partition, va, endVa);
va += clampedEndVa - clampedVa; partition.Unmap(clampedVa, clampedEndVa - clampedVa);
RemoveBridgeIfNeeded(partitionIndex); va += clampedEndVa - clampedVa;
if (partition.IsEmpty()) RemoveBridgeIfNeeded(partitionIndex);
{
lock (_partitions) if (partition.IsEmpty())
{ {
_partitions.Remove(partition); _partitions.Remove(partition);
partition.Dispose(); partition.Dispose();