From b43ef3dc0b48117618f8a218e4d5580b13ee9ec1 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Fri, 14 Dec 2018 10:09:22 +0100 Subject: [PATCH] #3885 Include "Cached" memory in available virtual memory on Linux. * Cached memory is easily available to processes if needed. --- .../cafUserInterface/cafMemoryInspector.cpp | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/Fwk/AppFwk/cafUserInterface/cafMemoryInspector.cpp b/Fwk/AppFwk/cafUserInterface/cafMemoryInspector.cpp index 85e9128111..8499376d50 100644 --- a/Fwk/AppFwk/cafUserInterface/cafMemoryInspector.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafMemoryInspector.cpp @@ -41,6 +41,46 @@ std::map readProcessBytesLinux() } return quantities; } + +//-------------------------------------------------------------------------------------------------- +/// Read bytes of memory of different types for system from /proc/meminfo +/// See: http://man7.org/linux/man-pages/man5/proc.5.html +//-------------------------------------------------------------------------------------------------- +std::map readMemInfoLinuxMiB() +{ + std::map quantities; + uint64_t conversionToMiB = 1024; + QFile procMemInfo("/proc/meminfo"); + + if (procMemInfo.open(QIODevice::ReadOnly | QIODevice::Text)) + { + char buf[1024]; + qint64 lineLength = 0; + while (lineLength != -1) + { + lineLength = procMemInfo.readLine(buf, sizeof(buf)); + if (lineLength > 0) + { + QString line = QString::fromLatin1(buf, lineLength); + QStringList words = line.split(QRegExp(":*\\s+"), QString::SkipEmptyParts); + if (words.size() > 1) + { + bool ok = true; + unsigned long long value = words[1].toULongLong(&ok); + if (ok) + { + quantities[words[0]] = value / conversionToMiB; + } + else + { + quantities[words[0]] = 0u; + } + } + } + } + } + return quantities; +} #endif //-------------------------------------------------------------------------------------------------- /// @@ -93,7 +133,8 @@ uint64_t caf::MemoryInspector::getTotalVirtualMemoryMiB() long long totalVirtualMem = memInfo.totalram; totalVirtualMem += memInfo.totalswap; totalVirtualMem *= memInfo.mem_unit; - return totalVirtualMem / MIB_DIV; + uint64_t totalVirtualMemMiB = totalVirtualMem / MIB_DIV; + return totalVirtualMemMiB; #else return 0u; #endif @@ -137,8 +178,12 @@ uint64_t caf::MemoryInspector::getAvailableVirtualMemoryMiB() sysinfo(&memInfo); long long availVirtualMem = memInfo.freeram; availVirtualMem += memInfo.freeswap; + availVirtualMem += memInfo.bufferram; availVirtualMem *= memInfo.mem_unit; - return availVirtualMem / MIB_DIV; + uint64_t virtualMemoryWithoutCachedMiB = availVirtualMem / MIB_DIV; + uint64_t cachedMemMiB = readMemInfoLinuxMiB()["Cached"]; + uint64_t totalFreeVirtualMemoryMiB = virtualMemoryWithoutCachedMiB + cachedMemMiB; + return totalFreeVirtualMemoryMiB; #else return 0u; #endif