diff options
Diffstat (limited to 'Ryujinx.Memory/Tracking/MemoryTracking.cs')
-rw-r--r-- | Ryujinx.Memory/Tracking/MemoryTracking.cs | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/Ryujinx.Memory/Tracking/MemoryTracking.cs b/Ryujinx.Memory/Tracking/MemoryTracking.cs index aafb418d..ed3d7e38 100644 --- a/Ryujinx.Memory/Tracking/MemoryTracking.cs +++ b/Ryujinx.Memory/Tracking/MemoryTracking.cs @@ -1,4 +1,6 @@ -using Ryujinx.Memory.Range; +using Ryujinx.Common.Pools; +using Ryujinx.Memory.Range; +using System; using System.Collections.Generic; namespace Ryujinx.Memory.Tracking @@ -14,9 +16,6 @@ namespace Ryujinx.Memory.Tracking // Only use these from within the lock. private readonly NonOverlappingRangeList<VirtualRegion> _virtualRegions; - // Only use these from within the lock. - private readonly VirtualRegion[] _virtualResults = new VirtualRegion[10]; - private readonly int _pageSize; /// <summary> @@ -62,12 +61,13 @@ namespace Ryujinx.Memory.Tracking lock (TrackingLock) { - var results = _virtualResults; - int count = _virtualRegions.FindOverlapsNonOverlapping(va, size, ref results); + ref var overlaps = ref ThreadStaticArray<VirtualRegion>.Get(); + + int count = _virtualRegions.FindOverlapsNonOverlapping(va, size, ref overlaps); for (int i = 0; i < count; i++) { - VirtualRegion region = results[i]; + VirtualRegion region = overlaps[i]; // If the region has been fully remapped, signal that it has been mapped again. bool remapped = _memoryManager.IsRangeMapped(region.Address, region.Size); @@ -94,12 +94,13 @@ namespace Ryujinx.Memory.Tracking lock (TrackingLock) { - var results = _virtualResults; - int count = _virtualRegions.FindOverlapsNonOverlapping(va, size, ref results); + ref var overlaps = ref ThreadStaticArray<VirtualRegion>.Get(); + + int count = _virtualRegions.FindOverlapsNonOverlapping(va, size, ref overlaps); for (int i = 0; i < count; i++) { - VirtualRegion region = results[i]; + VirtualRegion region = overlaps[i]; region.SignalMappingChanged(false); } @@ -201,8 +202,9 @@ namespace Ryujinx.Memory.Tracking lock (TrackingLock) { - var results = _virtualResults; - int count = _virtualRegions.FindOverlapsNonOverlapping(address, size, ref results); + ref var overlaps = ref ThreadStaticArray<VirtualRegion>.Get(); + + int count = _virtualRegions.FindOverlapsNonOverlapping(address, size, ref overlaps); if (count == 0) { @@ -221,7 +223,7 @@ namespace Ryujinx.Memory.Tracking for (int i = 0; i < count; i++) { - VirtualRegion region = results[i]; + VirtualRegion region = overlaps[i]; region.Signal(address, size, write); } } |