From a4eba7639e29c0dae1a97d56bb3628686dc9bcac Mon Sep 17 00:00:00 2001 From: Morritz Date: Fri, 30 Apr 2021 15:23:31 +0200 Subject: Fix: GetPhysicalRamUsage on FreeBSD (UNIX) - webadmin display (#5213) * Fix: GetPhysicalRamUsage on FreeBSD (UNIX) - webadmin display * fixed cast type * Fix: GetPhysicalRamUsage on FreeBSD - webadmin display / style and failing build fixes * added myself to contributors Co-authored-by: 12xx12 <44411062+12xx12@users.noreply.github.com> --- src/Root.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/Root.cpp') diff --git a/src/Root.cpp b/src/Root.cpp index 62d50c28c..f100a242a 100644 --- a/src/Root.cpp +++ b/src/Root.cpp @@ -20,6 +20,11 @@ #endif #elif defined(__APPLE__) #include + #elif defined(__FreeBSD__) + #include + #include + #include + #include #endif #endif @@ -885,6 +890,37 @@ int cRoot::GetPhysicalRAMUsage(void) return static_cast(t_info.resident_size / 1024); } return -1; + #elif defined (__FreeBSD__) + /* + struct rusage self_usage; + int status = getrusage(RUSAGE_SELF, &self_usage); + if (!status) + { + return static_cast(self_usage.ru_maxrss); + } + return -1; + */ + // Good to watch: https://www.youtube.com/watch?v=Os5cK0H8EOA - getrusage. + // Unfortunately, it only gives peak memory usage a.k.a max resident set size + // So it is better to use FreeBSD kvm function to get the size of resident pages. + + static kvm_t* kd = NULL; + + if (kd == NULL) + { + kd = kvm_open(NULL, "/dev/null", NULL, O_RDONLY, "kvm_open"); // returns a descriptor used to access kernel virtual memory + } + if (kd != NULL) + { + int pc = 0; // number of processes found + struct kinfo_proc* kp; + kp = kvm_getprocs(kd, KERN_PROC_PID, getpid(), &pc); + if ((kp != NULL) && (pc >= 1)) + { + return static_cast(kp->ki_rssize * getpagesize() / 1024); + } + } + return -1; #else LOGINFO("%s: Unknown platform, cannot query memory usage", __FUNCTION__); return -1; -- cgit v1.2.3