AuroraRuntime/Source/HWInfo/RamInfo.cpp
2021-09-13 22:15:57 +01:00

127 lines
2.6 KiB
C++

/***
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: RamInfo.cpp
Date: 2021-6-12
Author: Reece
***/
#include <RuntimeInternal.hpp>
#include "HWInfo.hpp"
#include "RamInfo.hpp"
#if defined(AURORA_IS_BSD_DERIVED)
#include <sys/sysctl.h>
#include <sys/vmmeter.h>
#include <sys/limits.h>
#include <vm/vm_param.h>
#endif
#if defined(AURORA_IS_LINUX_DERIVED)
#include <sys/sysinfo.h>
#endif
#if defined(AURORA_IS_MODERNNT_DERIVED)
#include <psapi.h>
#endif
namespace Aurora::HWInfo
{
static AuOptional<RamStat> gMemStartup;
static AuOptional<RamStat> gMemSystem;
AUKN_SYM AuOptional<RamStat> 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<RamStat> 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<RamStat> GetMemStatStartup()
{
return gMemStartup;
}
void InitRamInfo()
{
gMemStartup = GetMemStatSystem();
}
}