/ src / Ryujinx.Memory / WritableRegion.cs
WritableRegion.cs
 1  using Ryujinx.Common.Memory;
 2  using System;
 3  
 4  namespace Ryujinx.Memory
 5  {
 6      public sealed class WritableRegion : IDisposable
 7      {
 8          private readonly IWritableBlock _block;
 9          private readonly ulong _va;
10          private readonly MemoryOwner<byte> _memoryOwner;
11          private readonly bool _tracked;
12  
13          private bool NeedsWriteback => _block != null;
14  
15          public Memory<byte> Memory { get; }
16  
17          public WritableRegion(IWritableBlock block, ulong va, Memory<byte> memory, bool tracked = false)
18          {
19              _block = block;
20              _va = va;
21              _tracked = tracked;
22              Memory = memory;
23          }
24  
25          public WritableRegion(IWritableBlock block, ulong va, MemoryOwner<byte> memoryOwner, bool tracked = false)
26              : this(block, va, memoryOwner.Memory, tracked)
27          {
28              _memoryOwner = memoryOwner;
29          }
30  
31          public void Dispose()
32          {
33              if (NeedsWriteback)
34              {
35                  if (_tracked)
36                  {
37                      _block.Write(_va, Memory.Span);
38                  }
39                  else
40                  {
41                      _block.WriteUntracked(_va, Memory.Span);
42                  }
43              }
44  
45              _memoryOwner?.Dispose();
46          }
47      }
48  }