Xinqi Bao's Git

7c0870c12eb83dc51e8e4446305fdf578cce371c
[slstatus.git] / components / ram.c
1 /* See LICENSE file for copyright and license details. */
2 #include <stdio.h>
3
4 #include "../util.h"
5
6 #if defined(__linux__)
7 const char *
8 ram_free(void)
9 {
10 long free;
11
12 if (pscanf("/proc/meminfo",
13 "MemTotal: %ld kB\n"
14 "MemFree: %ld kB\n"
15 "MemAvailable: %ld kB\n",
16 &free, &free, &free) != 3) {
17 return NULL;
18 }
19
20 return fmt_human_2(free * 1024, "B");
21 }
22
23 const char *
24 ram_perc(void)
25 {
26 long total, free, buffers, cached;
27
28 if (pscanf("/proc/meminfo",
29 "MemTotal: %ld kB\n"
30 "MemFree: %ld kB\n"
31 "MemAvailable: %ld kB\nBuffers: %ld kB\n"
32 "Cached: %ld kB\n",
33 &total, &free, &buffers, &buffers, &cached) != 5) {
34 return NULL;
35 }
36
37 return bprintf("%d%%", 100 * ((total - free) -
38 (buffers + cached)) / total);
39 }
40
41 const char *
42 ram_total(void)
43 {
44 long total;
45
46 if (pscanf("/proc/meminfo", "MemTotal: %ld kB\n",
47 &total) != 1) {
48 return NULL;
49 }
50
51 return fmt_human_2(total * 1024, "B");
52 }
53
54 const char *
55 ram_used(void)
56 {
57 long total, free, buffers, cached;
58
59 if (pscanf("/proc/meminfo",
60 "MemTotal: %ld kB\n"
61 "MemFree: %ld kB\n"
62 "MemAvailable: %ld kB\nBuffers: %ld kB\n"
63 "Cached: %ld kB\n",
64 &total, &free, &buffers, &buffers, &cached) != 5) {
65 return NULL;
66 }
67
68 return fmt_human_2((total - free - buffers - cached) * 1024,
69 "B");
70 }
71 #elif defined(__OpenBSD__)
72 #include <stdlib.h>
73 #include <sys/sysctl.h>
74 #include <sys/types.h>
75 #include <unistd.h>
76
77 #define LOG1024 10
78 #define pagetok(size, pageshift) ((size) << (pageshift - LOG1024))
79
80 inline int
81 load_uvmexp(struct uvmexp *uvmexp)
82 {
83 int uvmexp_mib[] = {CTL_VM, VM_UVMEXP};
84 size_t size;
85
86 size = sizeof(*uvmexp);
87
88 return sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0 ? 1 : 0;
89 }
90
91 const char *
92 ram_free(void)
93 {
94 struct uvmexp uvmexp;
95 int free_pages;
96
97 if (load_uvmexp(&uvmexp)) {
98 free_pages = uvmexp.npages - uvmexp.active;
99 return fmt_human_2(pagetok(free_pages, uvmexp.pageshift) * 1024, "B");
100 }
101
102 return NULL;
103 }
104
105 const char *
106 ram_perc(void)
107 {
108 struct uvmexp uvmexp;
109 int percent;
110
111 if (load_uvmexp(&uvmexp)) {
112 percent = uvmexp.active * 100 / uvmexp.npages;
113 return bprintf("%d%%", percent);
114 }
115
116 return NULL;
117 }
118
119 const char *
120 ram_total(void)
121 {
122 struct uvmexp uvmexp;
123
124 if (load_uvmexp(&uvmexp)) {
125 return fmt_human_2(pagetok(uvmexp.npages, uvmexp.pageshift) * 1024, "B");
126 }
127
128 return NULL;
129 }
130
131 const char *
132 ram_used(void)
133 {
134 struct uvmexp uvmexp;
135
136 if (load_uvmexp(&uvmexp)) {
137 return fmt_human_2(pagetok(uvmexp.active, uvmexp.pageshift) * 1024, "B");
138 }
139
140 return NULL;
141 }
142 #endif