aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Memory/MemoryManagement.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Memory/MemoryManagement.cs')
-rw-r--r--src/Ryujinx.Memory/MemoryManagement.cs206
1 files changed, 206 insertions, 0 deletions
diff --git a/src/Ryujinx.Memory/MemoryManagement.cs b/src/Ryujinx.Memory/MemoryManagement.cs
new file mode 100644
index 00000000..c4b5ac4c
--- /dev/null
+++ b/src/Ryujinx.Memory/MemoryManagement.cs
@@ -0,0 +1,206 @@
+using System;
+
+namespace Ryujinx.Memory
+{
+ public static class MemoryManagement
+ {
+ public static IntPtr Allocate(ulong size, bool forJit)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ return MemoryManagementWindows.Allocate((IntPtr)size);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ return MemoryManagementUnix.Allocate(size, forJit);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+
+ public static IntPtr Reserve(ulong size, bool forJit, bool viewCompatible)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ return MemoryManagementWindows.Reserve((IntPtr)size, viewCompatible);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ return MemoryManagementUnix.Reserve(size, forJit);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+
+ public static bool Commit(IntPtr address, ulong size, bool forJit)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ return MemoryManagementWindows.Commit(address, (IntPtr)size);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ return MemoryManagementUnix.Commit(address, size, forJit);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+
+ public static bool Decommit(IntPtr address, ulong size)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ return MemoryManagementWindows.Decommit(address, (IntPtr)size);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ return MemoryManagementUnix.Decommit(address, size);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+
+ public static void MapView(IntPtr sharedMemory, ulong srcOffset, IntPtr address, ulong size, MemoryBlock owner)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ MemoryManagementWindows.MapView(sharedMemory, srcOffset, address, (IntPtr)size, owner);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ MemoryManagementUnix.MapView(sharedMemory, srcOffset, address, size);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+
+ public static void UnmapView(IntPtr sharedMemory, IntPtr address, ulong size, MemoryBlock owner)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ MemoryManagementWindows.UnmapView(sharedMemory, address, (IntPtr)size, owner);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ MemoryManagementUnix.UnmapView(address, size);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+
+ public static void Reprotect(IntPtr address, ulong size, MemoryPermission permission, bool forView, bool throwOnFail)
+ {
+ bool result;
+
+ if (OperatingSystem.IsWindows())
+ {
+ result = MemoryManagementWindows.Reprotect(address, (IntPtr)size, permission, forView);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ result = MemoryManagementUnix.Reprotect(address, size, permission);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+
+ if (!result && throwOnFail)
+ {
+ throw new MemoryProtectionException(permission);
+ }
+ }
+
+ public static bool Free(IntPtr address, ulong size)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ return MemoryManagementWindows.Free(address, (IntPtr)size);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ return MemoryManagementUnix.Free(address);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+
+ public static IntPtr CreateSharedMemory(ulong size, bool reserve)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ return MemoryManagementWindows.CreateSharedMemory((IntPtr)size, reserve);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ return MemoryManagementUnix.CreateSharedMemory(size, reserve);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+
+ public static void DestroySharedMemory(IntPtr handle)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ MemoryManagementWindows.DestroySharedMemory(handle);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ MemoryManagementUnix.DestroySharedMemory(handle);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+
+ public static IntPtr MapSharedMemory(IntPtr handle, ulong size)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ return MemoryManagementWindows.MapSharedMemory(handle);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ return MemoryManagementUnix.MapSharedMemory(handle, size);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+
+ public static void UnmapSharedMemory(IntPtr address, ulong size)
+ {
+ if (OperatingSystem.IsWindows())
+ {
+ MemoryManagementWindows.UnmapSharedMemory(address);
+ }
+ else if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
+ {
+ MemoryManagementUnix.UnmapSharedMemory(address, size);
+ }
+ else
+ {
+ throw new PlatformNotSupportedException();
+ }
+ }
+ }
+} \ No newline at end of file