127 lines
2.6 KiB
C++
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;
|
|
|
|
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();
|
|
}
|
|
} |