Refactor SystemInfo and implement macOS system info backend (#1177)

This commit is contained in:
Mary 2020-05-04 04:15:27 +02:00 committed by GitHub
parent 4c54f36c38
commit 651a07c6c2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 187 additions and 45 deletions

View file

@ -0,0 +1,17 @@
using System.IO;
using System.Linq;
namespace Ryujinx.Common.SystemInfo
{
internal class LinuxSysteminfo : SystemInfo
{
public override string CpuName { get; }
public override ulong RamSize { get; }
public LinuxSysteminfo()
{
CpuName = File.ReadAllLines("/proc/cpuinfo").Where(line => line.StartsWith("model name")).ToList()[0].Split(":")[1].Trim();
RamSize = ulong.Parse(File.ReadAllLines("/proc/meminfo")[0].Split(":")[1].Trim().Split(" ")[0]) * 1024;
}
}
}

View file

@ -0,0 +1,97 @@
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using Ryujinx.Common.Logging;
namespace Ryujinx.Common.SystemInfo
{
internal class MacOSSysteminfo : SystemInfo
{
public override string CpuName { get; }
public override ulong RamSize { get; }
[DllImport("libSystem.dylib", CharSet = CharSet.Ansi, SetLastError = true)]
private static extern int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize, IntPtr newValue, ulong newValueSize);
private static int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize)
{
if (sysctlbyname(name, oldValue, ref oldSize, IntPtr.Zero, 0) == -1)
{
return Marshal.GetLastWin32Error();
}
return 0;
}
private static int sysctlbyname<T>(string name, ref T oldValue)
{
unsafe
{
ulong oldValueSize = (ulong)Unsafe.SizeOf<T>();
return sysctlbyname(name, (IntPtr)Unsafe.AsPointer(ref oldValue), ref oldValueSize);
}
}
private static int sysctlbyname(string name, out string oldValue)
{
oldValue = default;
ulong strSize = 0;
int res = sysctlbyname(name, IntPtr.Zero, ref strSize);
if (res == 0)
{
byte[] rawData = new byte[strSize];
unsafe
{
fixed (byte* rawDataPtr = rawData)
{
res = sysctlbyname(name, (IntPtr)rawDataPtr, ref strSize);
}
if (res == 0)
{
oldValue = Encoding.ASCII.GetString(rawData);
}
}
}
return res;
}
public MacOSSysteminfo()
{
ulong ramSize = 0;
int res = sysctlbyname("hw.memsize", ref ramSize);
if (res == 0)
{
RamSize = ramSize;
}
else
{
Logger.PrintError(LogClass.Application, $"Cannot get memory size, sysctlbyname error: {res}");
RamSize = 0;
}
res = sysctlbyname("machdep.cpu.brand_string", out string cpuName);
if (res == 0)
{
CpuName = cpuName;
}
else
{
Logger.PrintError(LogClass.Application, $"Cannot get CPU name, sysctlbyname error: {res}");
CpuName = "Unknown";
}
}
}
}

View file

@ -0,0 +1,46 @@
using System.Runtime.InteropServices;
namespace Ryujinx.Common.SystemInfo
{
public class SystemInfo
{
public virtual string OsDescription => $"{RuntimeInformation.OSDescription} ({RuntimeInformation.OSArchitecture})";
public virtual string CpuName => "Unknown";
public virtual ulong RamSize => 0;
public string RamSizeInMB
{
get
{
if (RamSize == 0)
{
return "Unknown";
}
return $"{RamSize / 1024 / 1024} MB";
}
}
public static SystemInfo Instance { get; }
static SystemInfo()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Instance = new WindowsSysteminfo();
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Instance = new LinuxSysteminfo();
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
Instance = new MacOSSysteminfo();
}
else
{
Instance = new SystemInfo();
}
}
}
}

View file

@ -0,0 +1,23 @@
using System.Management;
namespace Ryujinx.Common.SystemInfo
{
internal class WindowsSysteminfo : SystemInfo
{
public override string CpuName { get; }
public override ulong RamSize { get; }
public WindowsSysteminfo()
{
foreach (ManagementBaseObject mObject in new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor").Get())
{
CpuName = mObject["Name"].ToString();
}
foreach (ManagementBaseObject mObject in new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_OperatingSystem").Get())
{
RamSize = ulong.Parse(mObject["TotalVisibleMemorySize"].ToString()) * 1024;
}
}
}
}