From 06a2b03cc91b38e3798d8cc1c57c186778c7e666 Mon Sep 17 00:00:00 2001 From: mageven <62494521+mageven@users.noreply.github.com> Date: Mon, 1 Mar 2021 09:52:00 +0530 Subject: Revise SystemInfo (#2047) * Revise SystemInfo Cleans up and adds a bit more info (logical core count and available mem at launch) to logs. - Extract CPU name from CPUID when supported. - Linux: Robust parsing of procfs files - Windows: Prefer native calls to WMI - Remove unnecessary virtual specifiers * Address gdkchan's comments * Address AcK's comments * Address formatting nits --- Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs | 75 +++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 7 deletions(-) (limited to 'Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs') 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(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(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 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 -- cgit v1.2.3