MacOSSysteminfo.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. using System.Runtime.InteropServices;
  4. using System.Text;
  5. using Ryujinx.Common.Logging;
  6. namespace Ryujinx.Common.SystemInfo
  7. {
  8. internal class MacOSSysteminfo : SystemInfo
  9. {
  10. public override string CpuName { get; }
  11. public override ulong RamSize { get; }
  12. [DllImport("libSystem.dylib", CharSet = CharSet.Ansi, SetLastError = true)]
  13. private static extern int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize, IntPtr newValue, ulong newValueSize);
  14. private static int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize)
  15. {
  16. if (sysctlbyname(name, oldValue, ref oldSize, IntPtr.Zero, 0) == -1)
  17. {
  18. return Marshal.GetLastWin32Error();
  19. }
  20. return 0;
  21. }
  22. private static int sysctlbyname<T>(string name, ref T oldValue)
  23. {
  24. unsafe
  25. {
  26. ulong oldValueSize = (ulong)Unsafe.SizeOf<T>();
  27. return sysctlbyname(name, (IntPtr)Unsafe.AsPointer(ref oldValue), ref oldValueSize);
  28. }
  29. }
  30. private static int sysctlbyname(string name, out string oldValue)
  31. {
  32. oldValue = default;
  33. ulong strSize = 0;
  34. int res = sysctlbyname(name, IntPtr.Zero, ref strSize);
  35. if (res == 0)
  36. {
  37. byte[] rawData = new byte[strSize];
  38. unsafe
  39. {
  40. fixed (byte* rawDataPtr = rawData)
  41. {
  42. res = sysctlbyname(name, (IntPtr)rawDataPtr, ref strSize);
  43. }
  44. if (res == 0)
  45. {
  46. oldValue = Encoding.ASCII.GetString(rawData);
  47. }
  48. }
  49. }
  50. return res;
  51. }
  52. public MacOSSysteminfo()
  53. {
  54. ulong ramSize = 0;
  55. int res = sysctlbyname("hw.memsize", ref ramSize);
  56. if (res == 0)
  57. {
  58. RamSize = ramSize;
  59. }
  60. else
  61. {
  62. Logger.PrintError(LogClass.Application, $"Cannot get memory size, sysctlbyname error: {res}");
  63. RamSize = 0;
  64. }
  65. res = sysctlbyname("machdep.cpu.brand_string", out string cpuName);
  66. if (res == 0)
  67. {
  68. CpuName = cpuName;
  69. }
  70. else
  71. {
  72. Logger.PrintError(LogClass.Application, $"Cannot get CPU name, sysctlbyname error: {res}");
  73. CpuName = "Unknown";
  74. }
  75. }
  76. }
  77. }