From c47ce6f69709064c61ae804d63393fd40d4bc11b Mon Sep 17 00:00:00 2001 From: Gabriel A Date: Thu, 4 Jan 2024 20:48:53 -0300 Subject: [PATCH] Fix potential race + wrong check for partition not being found --- .../Jit/AddressSpacePartitioned.cs | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/Ryujinx.Cpu/Jit/AddressSpacePartitioned.cs b/src/Ryujinx.Cpu/Jit/AddressSpacePartitioned.cs index 7ef008690..d5ccb02a5 100644 --- a/src/Ryujinx.Cpu/Jit/AddressSpacePartitioned.cs +++ b/src/Ryujinx.Cpu/Jit/AddressSpacePartitioned.cs @@ -33,19 +33,22 @@ namespace Ryujinx.Cpu.Jit while (va < endVa) { - int partitionIndex = FindPartitionIndex(va); - AddressSpacePartition partition = _partitions[partitionIndex]; + lock (_partitions) + { + 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; - pa += currentSize; + va += currentSize; + pa += currentSize; - InsertBridgeIfNeeded(partitionIndex); + InsertBridgeIfNeeded(partitionIndex); + } } } @@ -55,27 +58,29 @@ namespace Ryujinx.Cpu.Jit while (va < endVa) { - int partitionIndex = FindPartitionIndex(va); - AddressSpacePartition partition = _partitions[partitionIndex]; + AddressSpacePartition partition; - 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()) - { - lock (_partitions) + RemoveBridgeIfNeeded(partitionIndex); + + if (partition.IsEmpty()) { _partitions.Remove(partition); partition.Dispose();