memusage: Take SReclaimable into account
[sysstatus.git] / src / status / memusage.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include "common.h"
6 #include "tools.h"
7
8
9 void status_memusage(GlobalData *g)
10 {
11   StatusItem s;
12   char text[16] = { 0 };
13
14   char *stline = NULL;
15   size_t stlen;
16   FILE *stfile;
17
18   long long memtotal = 0;
19   long long memfree = 0;
20   long long memused;
21   long long membuffers = 0;
22   long long memcached = 0;
23   long long slab_reclaimable = 0;
24
25
26   statusitem_init(&s);
27   s.text = text;
28
29   stfile = fopen("/proc/meminfo", "r");
30   if (stfile != NULL) {
31     stlen = getline(&stline, &stlen, stfile);
32     memtotal = atoll(&stline[16]);
33
34     stlen = getline(&stline, &stlen, stfile);
35     memfree = atoll(&stline[16]);
36
37     stlen = getline(&stline, &stlen, stfile);
38     if (stlen > 13 && !memcmp(stline, "MemAvailable:", 13)) {
39       stlen = getline(&stline, &stlen, stfile);
40     }
41     membuffers = atoll(&stline[16]);
42
43     stlen = getline(&stline, &stlen, stfile);
44     memcached = atoll(&stline[16]);
45
46     while (0 < (stlen = getline(&stline, &stlen, stfile))) {
47       if (stlen > 13 && !memcmp(stline, "SReclaimable:", 13)) {
48         slab_reclaimable = atoll(&stline[16]);
49         break;
50       }
51     }
52
53     free(stline);
54     fclose(stfile);
55
56     memused = memtotal - memfree - memcached - slab_reclaimable - membuffers;
57
58     memused /= 1024;    // Just show MBs used
59
60     /* Change color based on % of RAM used */
61     if ((float)memused / (float)memtotal < 0.85) {
62       s.color = "#22FF22";  // green
63     } else {
64       s.color = "#FF0000";  // red
65     }
66
67     snprintf(text, sizeof(text), "Mem: %lld M", memused);
68
69     line_append_item(g, &s);
70   }
71 }