summaryrefslogtreecommitdiffstats
path: root/linux
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2015-11-28 22:22:00 -0200
committerHisham Muhammad <hisham@gobolinux.org>2015-11-28 22:22:00 -0200
commit5bc1f5ed04a56c4b33cf2854e1f3b0918b098cbf (patch)
treee6fb85632830d178f80a6f466b0a4555c7f51cdb /linux
parentd34645f8f1b958454f182fcc061a05fefe48f4df (diff)
Account unreclaimable slab and shmem as used memory,
reclaimable slab as cached memory. Hopefully this presents a more truthful representation of available vs. used memory on Linux. See brndnmtthws/conky#82, #242, #67, #263.
Diffstat (limited to 'linux')
-rw-r--r--linux/LinuxProcessList.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/linux/LinuxProcessList.c b/linux/LinuxProcessList.c
index 92259514..6724acff 100644
--- a/linux/LinuxProcessList.c
+++ b/linux/LinuxProcessList.c
@@ -621,6 +621,9 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, const char*
static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) {
unsigned long long int swapFree = 0;
+ unsigned long long int slab = 0;
+ unsigned long long int shmem = 0;
+ unsigned long long int sreclaimable = 0;
FILE* file = fopen(PROCMEMINFOFILE, "r");
if (file == NULL) {
@@ -629,33 +632,42 @@ static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) {
char buffer[128];
while (fgets(buffer, 128, file)) {
+ #define tryRead(label, variable) (String_startsWith(buffer, label) && sscanf(buffer + strlen(label), " %32llu kB", variable))
switch (buffer[0]) {
case 'M':
- if (String_startsWith(buffer, "MemTotal:"))
- sscanf(buffer, "MemTotal: %32llu kB", &this->totalMem);
- else if (String_startsWith(buffer, "MemFree:"))
- sscanf(buffer, "MemFree: %32llu kB", &this->freeMem);
- else if (String_startsWith(buffer, "MemShared:"))
- sscanf(buffer, "MemShared: %32llu kB", &this->sharedMem);
+ if (tryRead("MemTotal:", &this->totalMem)) {}
+ else if (tryRead("MemFree:", &this->freeMem)) {}
+ else if (tryRead("MemShared:", &this->sharedMem)) {}
break;
case 'B':
- if (String_startsWith(buffer, "Buffers:"))
- sscanf(buffer, "Buffers: %32llu kB", &this->buffersMem);
+ if (tryRead("Buffers:", &this->buffersMem)) {}
break;
case 'C':
- if (String_startsWith(buffer, "Cached:"))
- sscanf(buffer, "Cached: %32llu kB", &this->cachedMem);
+ if (tryRead("Cached:", &this->cachedMem)) {}
break;
case 'S':
- if (String_startsWith(buffer, "SwapTotal:"))
- sscanf(buffer, "SwapTotal: %32llu kB", &this->totalSwap);
- if (String_startsWith(buffer, "SwapFree:"))
- sscanf(buffer, "SwapFree: %32llu kB", &swapFree);
+ switch (buffer[1]) {
+ case 'w':
+ if (tryRead("SwapTotal:", &this->totalSwap)) {}
+ else if (tryRead("SwapFree:", &swapFree)) {}
+ break;
+ case 'l':
+ if (tryRead("Slab:", &slab)) {}
+ break;
+ case 'h':
+ if (tryRead("Shmem:", &shmem)) {}
+ break;
+ case 'R':
+ if (tryRead("SReclaimable:", &sreclaimable)) {}
+ break;
+ }
break;
}
+ #undef tryRead
}
- this->usedMem = this->totalMem - this->freeMem;
+ this->usedMem = this->totalMem - this->freeMem + (slab - sreclaimable) + shmem;
+ this->cachedMem = this->cachedMem + sreclaimable;
this->usedSwap = this->totalSwap - swapFree;
fclose(file);
}

© 2014-2024 Faster IT GmbH | imprint | privacy policy