Remove usage of Mono.Posix.NETStandard accross all projects (#2906)

* Remove usage of Mono.Posix.NETStandard in Ryujinx project

* Remove usage of Mono.Posix.NETStandard in ARMeilleure project

* Remove usage of Mono.Posix.NETStandard in Ryujinx.Memory project

* Address gdkchan's comments
This commit is contained in:
Mary 2021-12-08 22:24:26 +01:00 committed by GitHub
parent bc4e70b6fa
commit 00c69f2098
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 149 additions and 42 deletions

View File

@ -5,10 +5,6 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Mono.Posix.NETStandard" Version="5.20.1-preview" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Ryujinx.Common\Ryujinx.Common.csproj" /> <ProjectReference Include="..\Ryujinx.Common\Ryujinx.Common.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -1,5 +1,4 @@
using Mono.Unix.Native; using System;
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace ARMeilleure.Signal namespace ARMeilleure.Signal
@ -21,6 +20,7 @@ namespace ARMeilleure.Signal
static class UnixSignalHandlerRegistration static class UnixSignalHandlerRegistration
{ {
private const int SIGSEGV = 11;
private const int SA_SIGINFO = 0x00000004; private const int SA_SIGINFO = 0x00000004;
[DllImport("libc", SetLastError = true)] [DllImport("libc", SetLastError = true)]
@ -39,7 +39,7 @@ namespace ARMeilleure.Signal
sigemptyset(ref sig.sa_mask); sigemptyset(ref sig.sa_mask);
int result = sigaction((int)Signum.SIGSEGV, ref sig, out SigAction old); int result = sigaction(SIGSEGV, ref sig, out SigAction old);
if (result != 0) if (result != 0)
{ {
@ -51,7 +51,7 @@ namespace ARMeilleure.Signal
public static bool RestoreExceptionHandler(SigAction oldAction) public static bool RestoreExceptionHandler(SigAction oldAction)
{ {
return sigaction((int)Signum.SIGSEGV, ref oldAction, out SigAction _) == 0; return sigaction(SIGSEGV, ref oldAction, out SigAction _) == 0;
} }
} }
} }

View File

@ -1,10 +1,11 @@
using Mono.Unix.Native; using System;
using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Runtime.Versioning; using System.Runtime.Versioning;
using static Ryujinx.Memory.MemoryManagerUnixHelper;
namespace Ryujinx.Memory namespace Ryujinx.Memory
{ {
[SupportedOSPlatform("linux")] [SupportedOSPlatform("linux")]
@ -18,15 +19,6 @@ namespace Ryujinx.Memory
public IntPtr SourcePointer; public IntPtr SourcePointer;
} }
[DllImport("libc", SetLastError = true)]
public static extern IntPtr mremap(IntPtr old_address, ulong old_size, ulong new_size, MremapFlags flags, IntPtr new_address);
[DllImport("libc", SetLastError = true)]
public static extern int madvise(IntPtr address, ulong size, int advice);
private const int MADV_DONTNEED = 4;
private const int MADV_REMOVE = 9;
private static readonly List<UnixSharedMemory> _sharedMemory = new List<UnixSharedMemory>(); private static readonly List<UnixSharedMemory> _sharedMemory = new List<UnixSharedMemory>();
private static readonly ConcurrentDictionary<IntPtr, ulong> _sharedMemorySource = new ConcurrentDictionary<IntPtr, ulong>(); private static readonly ConcurrentDictionary<IntPtr, ulong> _sharedMemorySource = new ConcurrentDictionary<IntPtr, ulong>();
private static readonly ConcurrentDictionary<IntPtr, ulong> _allocations = new ConcurrentDictionary<IntPtr, ulong>(); private static readonly ConcurrentDictionary<IntPtr, ulong> _allocations = new ConcurrentDictionary<IntPtr, ulong>();
@ -47,7 +39,7 @@ namespace Ryujinx.Memory
if (shared) if (shared)
{ {
flags |= MmapFlags.MAP_SHARED | (MmapFlags)0x80000; flags |= MmapFlags.MAP_SHARED | MmapFlags.MAP_UNLOCKED;
} }
else else
{ {
@ -59,7 +51,7 @@ namespace Ryujinx.Memory
flags |= MmapFlags.MAP_NORESERVE; flags |= MmapFlags.MAP_NORESERVE;
} }
IntPtr ptr = Syscall.mmap(IntPtr.Zero, size, prot, flags, -1, 0); IntPtr ptr = mmap(IntPtr.Zero, size, prot, flags, -1, 0);
if (ptr == new IntPtr(-1L)) if (ptr == new IntPtr(-1L))
{ {
@ -77,7 +69,7 @@ namespace Ryujinx.Memory
public static bool Commit(IntPtr address, ulong size) public static bool Commit(IntPtr address, ulong size)
{ {
bool success = Syscall.mprotect(address, size, MmapProts.PROT_READ | MmapProts.PROT_WRITE) == 0; bool success = mprotect(address, size, MmapProts.PROT_READ | MmapProts.PROT_WRITE) == 0;
if (success) if (success)
{ {
@ -87,7 +79,7 @@ namespace Ryujinx.Memory
{ {
ulong sharedAddress = ((ulong)address - (ulong)shared.SourcePointer) + (ulong)shared.Pointer; ulong sharedAddress = ((ulong)address - (ulong)shared.SourcePointer) + (ulong)shared.Pointer;
if (Syscall.mprotect((IntPtr)sharedAddress, size, MmapProts.PROT_READ | MmapProts.PROT_WRITE) != 0) if (mprotect((IntPtr)sharedAddress, size, MmapProts.PROT_READ | MmapProts.PROT_WRITE) != 0)
{ {
return false; return false;
} }
@ -108,16 +100,16 @@ namespace Ryujinx.Memory
} }
// Must be writable for madvise to work properly. // Must be writable for madvise to work properly.
Syscall.mprotect(address, size, MmapProts.PROT_READ | MmapProts.PROT_WRITE); mprotect(address, size, MmapProts.PROT_READ | MmapProts.PROT_WRITE);
madvise(address, size, isShared ? MADV_REMOVE : MADV_DONTNEED); madvise(address, size, isShared ? MADV_REMOVE : MADV_DONTNEED);
return Syscall.mprotect(address, size, MmapProts.PROT_NONE) == 0; return mprotect(address, size, MmapProts.PROT_NONE) == 0;
} }
public static bool Reprotect(IntPtr address, ulong size, MemoryPermission permission) public static bool Reprotect(IntPtr address, ulong size, MemoryPermission permission)
{ {
return Syscall.mprotect(address, size, GetProtection(permission)) == 0; return mprotect(address, size, GetProtection(permission)) == 0;
} }
private static MmapProts GetProtection(MemoryPermission permission) private static MmapProts GetProtection(MemoryPermission permission)
@ -138,7 +130,7 @@ namespace Ryujinx.Memory
{ {
if (_allocations.TryRemove(address, out ulong size)) if (_allocations.TryRemove(address, out ulong size))
{ {
return Syscall.munmap(address, size) == 0; return munmap(address, size) == 0;
} }
return false; return false;
@ -146,14 +138,14 @@ namespace Ryujinx.Memory
public static IntPtr Remap(IntPtr target, IntPtr source, ulong size) public static IntPtr Remap(IntPtr target, IntPtr source, ulong size)
{ {
int flags = (int)MremapFlags.MREMAP_MAYMOVE; int flags = 1;
if (target != IntPtr.Zero) if (target != IntPtr.Zero)
{ {
flags |= 2; flags |= 2;
} }
IntPtr result = mremap(source, 0, size, (MremapFlags)(flags), target); IntPtr result = mremap(source, 0, size, flags, target);
if (result == IntPtr.Zero) if (result == IntPtr.Zero)
{ {

View File

@ -0,0 +1,128 @@
using System;
using System.Runtime.InteropServices;
namespace Ryujinx.Memory
{
public static class MemoryManagerUnixHelper
{
[Flags]
public enum MmapProts : uint
{
PROT_NONE = 0,
PROT_READ = 1,
PROT_WRITE = 2,
PROT_EXEC = 4
}
[Flags]
public enum MmapFlags : uint
{
MAP_SHARED = 1,
MAP_PRIVATE = 2,
MAP_ANONYMOUS = 4,
MAP_NORESERVE = 8,
MAP_UNLOCKED = 16
}
private const int MAP_ANONYMOUS_LINUX_GENERIC = 0x20;
private const int MAP_NORESERVE_LINUX_GENERIC = 0x4000;
private const int MAP_UNLOCKED_LINUX_GENERIC = 0x80000;
private const int MAP_NORESERVE_DARWIN = 0x40;
private const int MAP_JIT_DARWIN = 0x800;
private const int MAP_ANONYMOUS_DARWIN = 0x1000;
public const int MADV_DONTNEED = 4;
public const int MADV_REMOVE = 9;
[DllImport("libc", EntryPoint = "mmap", SetLastError = true)]
private static extern IntPtr Internal_mmap(IntPtr address, ulong length, MmapProts prot, int flags, int fd, long offset);
[DllImport("libc", SetLastError = true)]
public static extern int mprotect(IntPtr address, ulong length, MmapProts prot);
[DllImport("libc", SetLastError = true)]
public static extern int munmap(IntPtr address, ulong length);
[DllImport("libc", SetLastError = true)]
public static extern IntPtr mremap(IntPtr old_address, ulong old_size, ulong new_size, int flags, IntPtr new_address);
[DllImport("libc", SetLastError = true)]
public static extern int madvise(IntPtr address, ulong size, int advice);
private static int MmapFlagsToSystemFlags(MmapFlags flags)
{
int result = 0;
if (flags.HasFlag(MmapFlags.MAP_SHARED))
{
result |= (int)MmapFlags.MAP_SHARED;
}
if (flags.HasFlag(MmapFlags.MAP_PRIVATE))
{
result |= (int)MmapFlags.MAP_PRIVATE;
}
if (flags.HasFlag(MmapFlags.MAP_ANONYMOUS))
{
if (OperatingSystem.IsLinux())
{
result |= MAP_ANONYMOUS_LINUX_GENERIC;
}
else if (OperatingSystem.IsMacOS())
{
result |= MAP_ANONYMOUS_DARWIN;
}
else
{
throw new NotImplementedException();
}
}
if (flags.HasFlag(MmapFlags.MAP_NORESERVE))
{
if (OperatingSystem.IsLinux())
{
result |= MAP_NORESERVE_LINUX_GENERIC;
}
else if (OperatingSystem.IsMacOS())
{
result |= MAP_NORESERVE_DARWIN;
}
else
{
throw new NotImplementedException();
}
}
if (flags.HasFlag(MmapFlags.MAP_UNLOCKED))
{
if (OperatingSystem.IsLinux())
{
result |= MAP_UNLOCKED_LINUX_GENERIC;
}
else if (OperatingSystem.IsMacOS())
{
// FIXME: Doesn't exist on Darwin
}
else
{
throw new NotImplementedException();
}
}
if (OperatingSystem.IsMacOSVersionAtLeast(10, 14))
{
result |= MAP_JIT_DARWIN;
}
return result;
}
public static IntPtr mmap(IntPtr address, ulong length, MmapProts prot, MmapFlags flags, int fd, long offset)
{
return Internal_mmap(address, length, prot, MmapFlagsToSystemFlags(flags), fd, offset);
}
}
}

View File

@ -5,10 +5,6 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Mono.Posix.NETStandard" Version="5.20.1-preview" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Ryujinx.Common\Ryujinx.Common.csproj" /> <ProjectReference Include="..\Ryujinx.Common\Ryujinx.Common.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -1,12 +1,10 @@
using Gdk; using Gdk;
using Gtk; using Gtk;
using Mono.Unix;
using Ryujinx.Ui; using Ryujinx.Ui;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.InteropServices;
namespace Ryujinx.Modules namespace Ryujinx.Modules
{ {

View File

@ -2,7 +2,6 @@ using Gtk;
using ICSharpCode.SharpZipLib.GZip; using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar; using ICSharpCode.SharpZipLib.Tar;
using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Zip;
using Mono.Unix;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Ui; using Ryujinx.Ui;
@ -355,14 +354,16 @@ namespace Ryujinx.Modules
worker.Start(); worker.Start();
} }
[DllImport("libc", SetLastError = true)]
private static extern int chmod(string path, uint mode);
private static void SetUnixPermissions() private static void SetUnixPermissions()
{ {
string ryuBin = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Ryujinx"); string ryuBin = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Ryujinx");
if (!OperatingSystem.IsWindows()) if (!OperatingSystem.IsWindows())
{ {
UnixFileInfo unixFileInfo = new UnixFileInfo(ryuBin); chmod(ryuBin, 0777);
unixFileInfo.FileAccessPermissions |= FileAccessPermissions.UserExecute;
} }
} }

View File

@ -61,9 +61,6 @@ namespace Ryujinx
} }
} }
// Enforce loading of Mono.Posix to avoid .NET runtime lazy loading it during an update.
Assembly.Load("Mono.Posix.NETStandard");
// Make process DPI aware for proper window sizing on high-res screens. // Make process DPI aware for proper window sizing on high-res screens.
ForceDpiAware.Windows(); ForceDpiAware.Windows();
WindowScaleFactor = ForceDpiAware.GetWindowScaleFactor(); WindowScaleFactor = ForceDpiAware.GetWindowScaleFactor();

View File

@ -25,7 +25,6 @@
<PackageReference Include="OpenTK.Graphics" Version="4.5.0" /> <PackageReference Include="OpenTK.Graphics" Version="4.5.0" />
<PackageReference Include="SPB" Version="0.0.3-build15" /> <PackageReference Include="SPB" Version="0.0.3-build15" />
<PackageReference Include="SharpZipLib" Version="1.3.3" /> <PackageReference Include="SharpZipLib" Version="1.3.3" />
<PackageReference Include="Mono.Posix.NETStandard" Version="5.20.1-preview" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>