aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Memory/Tracking
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Memory/Tracking')
-rw-r--r--src/Ryujinx.Memory/Tracking/MemoryTracking.cs8
-rw-r--r--src/Ryujinx.Memory/Tracking/MultiRegionHandle.cs11
-rw-r--r--src/Ryujinx.Memory/Tracking/RegionHandle.cs14
-rw-r--r--src/Ryujinx.Memory/Tracking/SmartMultiRegionHandle.cs4
-rw-r--r--src/Ryujinx.Memory/Tracking/VirtualRegion.cs9
5 files changed, 29 insertions, 17 deletions
diff --git a/src/Ryujinx.Memory/Tracking/MemoryTracking.cs b/src/Ryujinx.Memory/Tracking/MemoryTracking.cs
index bf1e0ad3..ab9d9893 100644
--- a/src/Ryujinx.Memory/Tracking/MemoryTracking.cs
+++ b/src/Ryujinx.Memory/Tracking/MemoryTracking.cs
@@ -21,7 +21,7 @@ namespace Ryujinx.Memory.Tracking
/// This lock must be obtained when traversing or updating the region-handle hierarchy.
/// It is not required when reading dirty flags.
/// </summary>
- internal object TrackingLock = new object();
+ internal object TrackingLock = new();
/// <summary>
/// Create a new tracking structure for the given "physical" memory block,
@@ -114,7 +114,7 @@ namespace Ryujinx.Memory.Tracking
/// <returns>A list of virtual regions within the given range</returns>
internal List<VirtualRegion> GetVirtualRegionsForHandle(ulong va, ulong size)
{
- List<VirtualRegion> result = new List<VirtualRegion>();
+ List<VirtualRegion> result = new();
_virtualRegions.GetOrAddRegions(result, va, size, (va, size) => new VirtualRegion(this, va, size));
return result;
@@ -172,7 +172,7 @@ namespace Ryujinx.Memory.Tracking
lock (TrackingLock)
{
bool mapped = _memoryManager.IsRangeMapped(address, size);
- RegionHandle handle = new RegionHandle(this, paAddress, paSize, address, size, id, mapped);
+ RegionHandle handle = new(this, paAddress, paSize, address, size, id, mapped);
return handle;
}
@@ -194,7 +194,7 @@ namespace Ryujinx.Memory.Tracking
lock (TrackingLock)
{
bool mapped = _memoryManager.IsRangeMapped(address, size);
- RegionHandle handle = new RegionHandle(this, paAddress, paSize, address, size, bitmap, bit, id, mapped);
+ RegionHandle handle = new(this, paAddress, paSize, address, size, bitmap, bit, id, mapped);
return handle;
}
diff --git a/src/Ryujinx.Memory/Tracking/MultiRegionHandle.cs b/src/Ryujinx.Memory/Tracking/MultiRegionHandle.cs
index 68fc5e75..5d3f20f4 100644
--- a/src/Ryujinx.Memory/Tracking/MultiRegionHandle.cs
+++ b/src/Ryujinx.Memory/Tracking/MultiRegionHandle.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Threading;
@@ -21,11 +22,11 @@ namespace Ryujinx.Memory.Tracking
private readonly ulong Granularity;
private readonly ulong Size;
- private ConcurrentBitmap _dirtyBitmap;
+ private readonly ConcurrentBitmap _dirtyBitmap;
private int _sequenceNumber;
- private BitMap _sequenceNumberBitmap;
- private BitMap _dirtyCheckedBitmap;
+ private readonly BitMap _sequenceNumberBitmap;
+ private readonly BitMap _dirtyCheckedBitmap;
private int _uncheckedHandles;
public bool Dirty { get; private set; } = true;
@@ -54,7 +55,7 @@ namespace Ryujinx.Memory.Tracking
// It is assumed that the provided handles do not overlap, in order, are on page boundaries,
// and don't extend past the requested range.
- foreach (RegionHandle handle in handles)
+ foreach (RegionHandle handle in handles.Cast<RegionHandle>())
{
int startIndex = (int)((handle.RealAddress - address) / granularity);
@@ -406,6 +407,8 @@ namespace Ryujinx.Memory.Tracking
public void Dispose()
{
+ GC.SuppressFinalize(this);
+
foreach (var handle in _handles)
{
handle.Dispose();
diff --git a/src/Ryujinx.Memory/Tracking/RegionHandle.cs b/src/Ryujinx.Memory/Tracking/RegionHandle.cs
index 77794488..d36207ca 100644
--- a/src/Ryujinx.Memory/Tracking/RegionHandle.cs
+++ b/src/Ryujinx.Memory/Tracking/RegionHandle.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Reflection.Metadata;
using System.Threading;
namespace Ryujinx.Memory.Tracking
@@ -50,7 +49,7 @@ namespace Ryujinx.Memory.Tracking
internal IMultiRegionHandle Parent { get; set; }
- private event Action _onDirty;
+ private event Action OnDirty;
private readonly object _preActionLock = new();
private RegionSignal _preAction; // Action to perform before a read or write. This will block the memory access.
@@ -269,7 +268,7 @@ namespace Ryujinx.Memory.Tracking
Dirty = true;
if (!oldDirty)
{
- _onDirty?.Invoke();
+ OnDirty?.Invoke();
}
Parent?.SignalWrite();
}
@@ -311,7 +310,10 @@ namespace Ryujinx.Memory.Tracking
/// <param name="consecutiveCheck">True if this reprotect is the result of consecutive dirty checks</param>
public void Reprotect(bool asDirty, bool consecutiveCheck = false)
{
- if (_volatile) return;
+ if (_volatile)
+ {
+ return;
+ }
Dirty = asDirty;
@@ -403,7 +405,7 @@ namespace Ryujinx.Memory.Tracking
/// <param name="action">Action to call on dirty</param>
public void RegisterDirtyEvent(Action action)
{
- _onDirty += action;
+ OnDirty += action;
}
/// <summary>
@@ -461,6 +463,8 @@ namespace Ryujinx.Memory.Tracking
{
ObjectDisposedException.ThrowIf(_disposed, this);
+ GC.SuppressFinalize(this);
+
_disposed = true;
lock (_tracking.TrackingLock)
diff --git a/src/Ryujinx.Memory/Tracking/SmartMultiRegionHandle.cs b/src/Ryujinx.Memory/Tracking/SmartMultiRegionHandle.cs
index 4acddefa..bab00377 100644
--- a/src/Ryujinx.Memory/Tracking/SmartMultiRegionHandle.cs
+++ b/src/Ryujinx.Memory/Tracking/SmartMultiRegionHandle.cs
@@ -17,7 +17,7 @@ namespace Ryujinx.Memory.Tracking
private readonly ulong _address;
private readonly ulong _granularity;
private readonly ulong _size;
- private MemoryTracking _tracking;
+ private readonly MemoryTracking _tracking;
private readonly int _id;
public bool Dirty { get; private set; } = true;
@@ -271,6 +271,8 @@ namespace Ryujinx.Memory.Tracking
public void Dispose()
{
+ GC.SuppressFinalize(this);
+
foreach (var handle in _handles)
{
handle?.Dispose();
diff --git a/src/Ryujinx.Memory/Tracking/VirtualRegion.cs b/src/Ryujinx.Memory/Tracking/VirtualRegion.cs
index 9651426b..e595196c 100644
--- a/src/Ryujinx.Memory/Tracking/VirtualRegion.cs
+++ b/src/Ryujinx.Memory/Tracking/VirtualRegion.cs
@@ -8,7 +8,7 @@ namespace Ryujinx.Memory.Tracking
/// </summary>
class VirtualRegion : AbstractRegion
{
- public List<RegionHandle> Handles = new List<RegionHandle>();
+ public List<RegionHandle> Handles = new();
private readonly MemoryTracking _tracking;
private MemoryPermission _lastPermission;
@@ -86,7 +86,10 @@ namespace Ryujinx.Memory.Tracking
foreach (var handle in Handles)
{
result &= handle.RequiredPermission;
- if (result == 0) return result;
+ if (result == 0)
+ {
+ return result;
+ }
}
return result;
}
@@ -128,7 +131,7 @@ namespace Ryujinx.Memory.Tracking
public override INonOverlappingRange Split(ulong splitAddress)
{
- VirtualRegion newRegion = new VirtualRegion(_tracking, splitAddress, EndAddress - splitAddress, _lastPermission);
+ VirtualRegion newRegion = new(_tracking, splitAddress, EndAddress - splitAddress, _lastPermission);
Size = splitAddress - Address;
// The new region inherits all of our parents.