diff options
Diffstat (limited to 'Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs')
| -rw-r--r-- | Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs | 75 |
1 files changed, 68 insertions, 7 deletions
diff --git a/Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs b/Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs index f067083e..069cd5aa 100644 --- a/Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs +++ b/Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs @@ -1,19 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Globalization; using System.IO; -using System.Linq; using System.Runtime.Versioning; +using Ryujinx.Common.Logging; namespace Ryujinx.Common.SystemInfo { [SupportedOSPlatform("linux")] - internal class LinuxSystemInfo : SystemInfo + class LinuxSystemInfo : SystemInfo { - public override string CpuName { get; } - public override ulong RamSize { get; } + internal LinuxSystemInfo() + { + string cpuName = GetCpuidCpuName(); + + if (cpuName == null) + { + var cpuDict = new Dictionary<string, string>(StringComparer.Ordinal) + { + ["model name"] = null, + ["Processor"] = null, + ["Hardware"] = null + }; + + ParseKeyValues("/proc/cpuinfo", cpuDict); + + cpuName = cpuDict["model name"] ?? cpuDict["Processor"] ?? cpuDict["Hardware"] ?? "Unknown"; + } + + var memDict = new Dictionary<string, string>(StringComparer.Ordinal) + { + ["MemTotal"] = null, + ["MemAvailable"] = null + }; + + ParseKeyValues("/proc/meminfo", memDict); + + // Entries are in KB + ulong.TryParse(memDict["MemTotal"]?.Split(' ')[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out ulong totalKB); + ulong.TryParse(memDict["MemAvailable"]?.Split(' ')[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out ulong availableKB); + + CpuName = $"{cpuName} ; {LogicalCoreCount} logical"; + RamTotal = totalKB * 1024; + RamAvailable = availableKB * 1024; + } - public LinuxSystemInfo() + private static void ParseKeyValues(string filePath, Dictionary<string, string> itemDict) { - 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; + if (!File.Exists(filePath)) + { + Logger.Error?.Print(LogClass.Application, $"File \"{filePath}\" not found"); + + return; + } + + int count = itemDict.Count; + + using (StreamReader file = new StreamReader(filePath)) + { + string line; + while ((line = file.ReadLine()) != null) + { + string[] kvPair = line.Split(':', 2, StringSplitOptions.TrimEntries); + + if (kvPair.Length < 2) continue; + + string key = kvPair[0]; + + if (itemDict.TryGetValue(key, out string value) && value == null) + { + itemDict[key] = kvPair[1]; + + if (--count <= 0) break; + } + } + } } } }
\ No newline at end of file |
