aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core/OsHle/Handles/HSharedMem.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Core/OsHle/Handles/HSharedMem.cs')
-rw-r--r--Ryujinx.Core/OsHle/Handles/HSharedMem.cs70
1 files changed, 70 insertions, 0 deletions
diff --git a/Ryujinx.Core/OsHle/Handles/HSharedMem.cs b/Ryujinx.Core/OsHle/Handles/HSharedMem.cs
new file mode 100644
index 00000000..3d56ff92
--- /dev/null
+++ b/Ryujinx.Core/OsHle/Handles/HSharedMem.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+
+namespace Ryujinx.Core.OsHle.Handles
+{
+ class HSharedMem
+ {
+ private List<long> Positions;
+
+ public int PositionsCount => Positions.Count;
+
+ public EventHandler<EventArgs> MemoryMapped;
+ public EventHandler<EventArgs> MemoryUnmapped;
+
+ public HSharedMem(long PhysPos)
+ {
+ Positions = new List<long>();
+ }
+
+ public void AddVirtualPosition(long Position)
+ {
+ lock (Positions)
+ {
+ Positions.Add(Position);
+
+ MemoryMapped?.Invoke(this, EventArgs.Empty);
+ }
+ }
+
+ public void RemoveVirtualPosition(long Position)
+ {
+ lock (Positions)
+ {
+ Positions.Remove(Position);
+
+ MemoryUnmapped?.Invoke(this, EventArgs.Empty);
+ }
+ }
+
+ public long GetVirtualPosition(int Index)
+ {
+ lock (Positions)
+ {
+ if (Index < 0 || Index >= Positions.Count)
+ {
+ throw new ArgumentOutOfRangeException(nameof(Index));
+ }
+
+ return Positions[Index];
+ }
+ }
+
+ public bool TryGetLastVirtualPosition(out long Position)
+ {
+ lock (Positions)
+ {
+ if (Positions.Count > 0)
+ {
+ Position = Positions[Positions.Count - 1];
+
+ return true;
+ }
+
+ Position = 0;
+
+ return false;
+ }
+ }
+ }
+} \ No newline at end of file