/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: RamInfo.cpp Date: 2021-6-12 Author: Reece ***/ #include #include "HWInfo.hpp" #include "RamInfo.hpp" #if defined(AURORA_IS_BSD_DERIVED) #include #include #include #include #endif #if defined(AURORA_IS_LINUX_DERIVED) #include #endif #if defined(AURORA_IS_MODERNNT_DERIVED) #include #endif namespace Aurora::HWInfo { static AuOptional gMemStartup; static AuOptional gMemSystem; AUKN_SYM AuOptional GetMemStatProcess() { auto max = GetMemStatSystem().value_or(RamStat {}).available; #if defined(AURORA_IS_MODERNNT_DERIVED) PROCESS_MEMORY_COUNTERS pmc; if (!GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(PROCESS_MEMORY_COUNTERS))) { return {}; } return RamStat {pmc.WorkingSetSize, max}; #elif defined(AURORA_IS_POSIX_DERIVED) struct rusage usage; getrusage(RUSAGE_SELF, &usage); auto used = AuUInt64(usage.ru_maxrss) * 1024; return RamStat {used, max}; #else return {}; #endif } #if defined(AURORA_IS_BSD_DERIVED) struct vmtotal GetVMInfo() { struct vmtotal info; int mib[2]; mib[0] = CTL_VM; mib[1] = VM_TOTAL; size_t len = sizeof(info); sysctl(mib, 2, &info, &len, NULL, 0); return info; } #endif AUKN_SYM AuOptional GetMemStatSystem() { #if defined(AURORA_IS_MODERNNT_DERIVED) MEMORYSTATUSEX statex; statex.dwLength = sizeof(statex); if (!GlobalMemoryStatusEx(&statex)) { return {}; } return RamStat {statex.ullTotalPhys - statex.ullAvailPhys, statex.ullTotalPhys}; #elif defined(AURORA_IS_BSD_DERIVED) auto maxMem = QueryBsdHwStat(HW_PHYSMEM); auto vmInfo = GetVMInfo(); auto freeMem = AuUInt64(vmInfo.t_free) * QueryBsdHwStat(HW_PAGESIZE).value_or(4096); return RamStat {maxMem.value_or(freeMem * 2) - freeMem, maxMem.value_or(0)}; #elif defined(AURORA_IS_LINUX_DERIVED) struct sysinfo info; if (sysinfo(&info) != 0) { return {}; } return RamStat {info.totalram - info.freeram, info.totalram} #else return {}; #endif } AUKN_SYM AuOptional GetMemStatStartup() { return gMemStartup; } void InitRamInfo() { gMemStartup = GetMemStatSystem(); } }