diff options
Diffstat (limited to 'src/Ryujinx.Memory/MemoryManagement.cs')
-rw-r--r-- | src/Ryujinx.Memory/MemoryManagement.cs | 206 |
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 |