mirror of https://github.com/xzeldon/htop.git
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.
This commit is contained in:
parent
d34645f8f1
commit
5bc1f5ed04
|
@ -621,6 +621,9 @@ static bool LinuxProcessList_recurseProcTree(LinuxProcessList* this, const char*
|
||||||
|
|
||||||
static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) {
|
static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) {
|
||||||
unsigned long long int swapFree = 0;
|
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");
|
FILE* file = fopen(PROCMEMINFOFILE, "r");
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
|
@ -629,33 +632,42 @@ static inline void LinuxProcessList_scanMemoryInfo(ProcessList* this) {
|
||||||
char buffer[128];
|
char buffer[128];
|
||||||
while (fgets(buffer, 128, file)) {
|
while (fgets(buffer, 128, file)) {
|
||||||
|
|
||||||
|
#define tryRead(label, variable) (String_startsWith(buffer, label) && sscanf(buffer + strlen(label), " %32llu kB", variable))
|
||||||
switch (buffer[0]) {
|
switch (buffer[0]) {
|
||||||
case 'M':
|
case 'M':
|
||||||
if (String_startsWith(buffer, "MemTotal:"))
|
if (tryRead("MemTotal:", &this->totalMem)) {}
|
||||||
sscanf(buffer, "MemTotal: %32llu kB", &this->totalMem);
|
else if (tryRead("MemFree:", &this->freeMem)) {}
|
||||||
else if (String_startsWith(buffer, "MemFree:"))
|
else if (tryRead("MemShared:", &this->sharedMem)) {}
|
||||||
sscanf(buffer, "MemFree: %32llu kB", &this->freeMem);
|
|
||||||
else if (String_startsWith(buffer, "MemShared:"))
|
|
||||||
sscanf(buffer, "MemShared: %32llu kB", &this->sharedMem);
|
|
||||||
break;
|
break;
|
||||||
case 'B':
|
case 'B':
|
||||||
if (String_startsWith(buffer, "Buffers:"))
|
if (tryRead("Buffers:", &this->buffersMem)) {}
|
||||||
sscanf(buffer, "Buffers: %32llu kB", &this->buffersMem);
|
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
if (String_startsWith(buffer, "Cached:"))
|
if (tryRead("Cached:", &this->cachedMem)) {}
|
||||||
sscanf(buffer, "Cached: %32llu kB", &this->cachedMem);
|
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
if (String_startsWith(buffer, "SwapTotal:"))
|
switch (buffer[1]) {
|
||||||
sscanf(buffer, "SwapTotal: %32llu kB", &this->totalSwap);
|
case 'w':
|
||||||
if (String_startsWith(buffer, "SwapFree:"))
|
if (tryRead("SwapTotal:", &this->totalSwap)) {}
|
||||||
sscanf(buffer, "SwapFree: %32llu kB", &swapFree);
|
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;
|
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;
|
this->usedSwap = this->totalSwap - swapFree;
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue