/ src / Ryujinx.Memory / NativeMemoryManager.cs
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  }