HSharedMem.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.Collections.Generic;
  3. namespace Ryujinx.Core.OsHle.Handles
  4. {
  5. class HSharedMem
  6. {
  7. private List<long> Positions;
  8. public int PositionsCount => Positions.Count;
  9. public EventHandler<EventArgs> MemoryMapped;
  10. public EventHandler<EventArgs> MemoryUnmapped;
  11. public HSharedMem(long PhysPos)
  12. {
  13. Positions = new List<long>();
  14. }
  15. public void AddVirtualPosition(long Position)
  16. {
  17. lock (Positions)
  18. {
  19. Positions.Add(Position);
  20. MemoryMapped?.Invoke(this, EventArgs.Empty);
  21. }
  22. }
  23. public void RemoveVirtualPosition(long Position)
  24. {
  25. lock (Positions)
  26. {
  27. Positions.Remove(Position);
  28. MemoryUnmapped?.Invoke(this, EventArgs.Empty);
  29. }
  30. }
  31. public long GetVirtualPosition(int Index)
  32. {
  33. lock (Positions)
  34. {
  35. if (Index < 0 || Index >= Positions.Count)
  36. {
  37. throw new ArgumentOutOfRangeException(nameof(Index));
  38. }
  39. return Positions[Index];
  40. }
  41. }
  42. public bool TryGetLastVirtualPosition(out long Position)
  43. {
  44. lock (Positions)
  45. {
  46. if (Positions.Count > 0)
  47. {
  48. Position = Positions[Positions.Count - 1];
  49. return true;
  50. }
  51. Position = 0;
  52. return false;
  53. }
  54. }
  55. }
  56. }