MemoryEhMeilleure.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. using ARMeilleure.Signal;
  2. using Ryujinx.Memory;
  3. using Ryujinx.Memory.Tracking;
  4. using System;
  5. using System.Runtime.InteropServices;
  6. namespace Ryujinx.Cpu
  7. {
  8. class MemoryEhMeilleure : IDisposable
  9. {
  10. private delegate bool TrackingEventDelegate(ulong address, ulong size, bool write);
  11. private readonly MemoryBlock _addressSpace;
  12. private readonly MemoryTracking _tracking;
  13. private readonly TrackingEventDelegate _trackingEvent;
  14. private readonly ulong _baseAddress;
  15. public MemoryEhMeilleure(MemoryBlock addressSpace, MemoryTracking tracking)
  16. {
  17. _addressSpace = addressSpace;
  18. _tracking = tracking;
  19. _baseAddress = (ulong)_addressSpace.Pointer;
  20. ulong endAddress = _baseAddress + addressSpace.Size;
  21. _trackingEvent = new TrackingEventDelegate(tracking.VirtualMemoryEvent);
  22. bool added = NativeSignalHandler.AddTrackedRegion((nuint)_baseAddress, (nuint)endAddress, Marshal.GetFunctionPointerForDelegate(_trackingEvent));
  23. if (!added)
  24. {
  25. throw new InvalidOperationException("Number of allowed tracked regions exceeded.");
  26. }
  27. }
  28. public void Dispose()
  29. {
  30. NativeSignalHandler.RemoveTrackedRegion((nuint)_baseAddress);
  31. }
  32. }
  33. }