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 }