aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2021-10-07 01:13:51 +0100
committerriperiperi <rhy3756547@hotmail.com>2021-10-07 01:13:51 +0100
commita4956591ec485e9b23ded32a853f2a63af92b769 (patch)
tree5bfdb076182bac84d4747dc8c2143b259a87476c /Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
parentc61c1ea8980f0a97ea4d77a5465745d7103e2452 (diff)
Avoid potential race
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs20
1 files changed, 19 insertions, 1 deletions
diff --git a/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs b/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
index faaccf13..b9b533fb 100644
--- a/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
+++ b/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
@@ -324,9 +324,27 @@ namespace Ryujinx.Graphics.Gpu.Memory
/// <param name="rangeAction">The action to call for each modified range</param>
public void ReregisterRanges(Action<ulong, ulong> rangeAction)
{
+ ref var ranges = ref ThreadStaticArray<BufferModifiedRange>.Get();
+
+ // Range list must be consistent for this operation.
+ lock (_lock)
+ {
+ if (ranges.Length < Count)
+ {
+ Array.Resize(ref ranges, Count);
+ }
+
+ int i = 0;
+ foreach (BufferModifiedRange range in this)
+ {
+ ranges[i++] = range;
+ }
+ }
+
ulong currentSync = _context.SyncNumber;
- foreach (BufferModifiedRange range in this)
+ for (int i = 0; i < Count; i++)
{
+ BufferModifiedRange range = ranges[i];
if (range.SyncNumber != currentSync)
{
rangeAction(range.Address, range.Size);