NativeMemoryManager.cs
1 using System; 2 using System.Buffers; 3 4 namespace Ryujinx.Memory 5 { 6 public unsafe class NativeMemoryManager<T> : MemoryManager<T> where T : unmanaged 7 { 8 private readonly T* _pointer; 9 private readonly int _length; 10 11 public NativeMemoryManager(nuint pointer, int length) 12 : this((T*)pointer, length) 13 { 14 } 15 16 public NativeMemoryManager(T* pointer, int length) 17 { 18 _pointer = pointer; 19 _length = length; 20 } 21 22 public unsafe T* Pointer => _pointer; 23 24 public int Length => _length; 25 26 public override Span<T> GetSpan() 27 { 28 return new Span<T>((void*)_pointer, _length); 29 } 30 31 public override MemoryHandle Pin(int elementIndex = 0) 32 { 33 if ((uint)elementIndex >= _length) 34 { 35 throw new ArgumentOutOfRangeException(nameof(elementIndex)); 36 } 37 38 return new MemoryHandle((void*)(_pointer + elementIndex)); 39 } 40 41 public override void Unpin() 42 { 43 // No need to do anything as pointer already points no native memory, not GC tracked. 44 } 45 46 protected override void Dispose(bool disposing) 47 { 48 // Nothing to dispose, MemoryBlock still owns the memory. 49 } 50 } 51 }