MacOSSystemInfo.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. using System.Runtime.InteropServices;
  4. using System.Runtime.Versioning;
  5. using System.Text;
  6. using Ryujinx.Common.Logging;
  7. namespace Ryujinx.Common.SystemInfo
  8. {
  9. [SupportedOSPlatform("macos")]
  10. class MacOSSystemInfo : SystemInfo
  11. {
  12. internal MacOSSystemInfo()
  13. {
  14. string cpuName = GetCpuidCpuName();
  15. if (cpuName == null && sysctlbyname("machdep.cpu.brand_string", out cpuName) != 0)
  16. {
  17. cpuName = "Unknown";
  18. }
  19. ulong totalRAM = 0;
  20. if (sysctlbyname("hw.memsize", ref totalRAM) != 0) // Bytes
  21. {
  22. totalRAM = 0;
  23. };
  24. CpuName = $"{cpuName} ; {LogicalCoreCount} logical";
  25. RamTotal = totalRAM;
  26. }
  27. [DllImport("libSystem.dylib", CharSet = CharSet.Ansi, SetLastError = true)]
  28. private static extern int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize, IntPtr newValue, ulong newValueSize);
  29. private static int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize)
  30. {
  31. if (sysctlbyname(name, oldValue, ref oldSize, IntPtr.Zero, 0) == -1)
  32. {
  33. int err = Marshal.GetLastWin32Error();
  34. Logger.Error?.Print(LogClass.Application, $"Cannot retrieve '{name}'. Error Code {err}");
  35. return err;
  36. }
  37. return 0;
  38. }
  39. private static int sysctlbyname<T>(string name, ref T oldValue)
  40. {
  41. unsafe
  42. {
  43. ulong oldValueSize = (ulong)Unsafe.SizeOf<T>();
  44. return sysctlbyname(name, (IntPtr)Unsafe.AsPointer(ref oldValue), ref oldValueSize);
  45. }
  46. }
  47. private static int sysctlbyname(string name, out string oldValue)
  48. {
  49. oldValue = default;
  50. ulong strSize = 0;
  51. int res = sysctlbyname(name, IntPtr.Zero, ref strSize);
  52. if (res == 0)
  53. {
  54. byte[] rawData = new byte[strSize];
  55. unsafe
  56. {
  57. fixed (byte* rawDataPtr = rawData)
  58. {
  59. res = sysctlbyname(name, (IntPtr)rawDataPtr, ref strSize);
  60. }
  61. if (res == 0)
  62. {
  63. oldValue = Encoding.ASCII.GetString(rawData);
  64. }
  65. }
  66. }
  67. return res;
  68. }
  69. }
  70. }