ram.c - slstatus - status monitor | |
git clone git://git.suckless.org/slstatus | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
ram.c (4408B) | |
--- | |
1 /* See LICENSE file for copyright and license details. */ | |
2 #include <stdio.h> | |
3 | |
4 #include "../slstatus.h" | |
5 #include "../util.h" | |
6 | |
7 #if defined(__linux__) | |
8 #include <stdint.h> | |
9 | |
10 const char * | |
11 ram_free(const char *unused) | |
12 { | |
13 uintmax_t free; | |
14 | |
15 if (pscanf("/proc/meminfo", | |
16 "MemTotal: %ju kB\n" | |
17 "MemFree: %ju kB\n" | |
18 "MemAvailable: %ju kB\n", | |
19 &free, &free, &free) != 3) | |
20 return NULL; | |
21 | |
22 return fmt_human(free * 1024, 1024); | |
23 } | |
24 | |
25 const char * | |
26 ram_perc(const char *unused) | |
27 { | |
28 uintmax_t total, free, buffers, cached; | |
29 int percent; | |
30 | |
31 if (pscanf("/proc/meminfo", | |
32 "MemTotal: %ju kB\n" | |
33 "MemFree: %ju kB\n" | |
34 "MemAvailable: %ju kB\n" | |
35 "Buffers: %ju kB\n" | |
36 "Cached: %ju kB\n", | |
37 &total, &free, &buffers, &buffers, &cached) !… | |
38 return NULL; | |
39 | |
40 if (total == 0) | |
41 return NULL; | |
42 | |
43 percent = 100 * ((total - free) - (buffers + cached)) / … | |
44 return bprintf("%d", percent); | |
45 } | |
46 | |
47 const char * | |
48 ram_total(const char *unused) | |
49 { | |
50 uintmax_t total; | |
51 | |
52 if (pscanf("/proc/meminfo", "MemTotal: %ju kB\n", &total) | |
53 != 1) | |
54 return NULL; | |
55 | |
56 return fmt_human(total * 1024, 1024); | |
57 } | |
58 | |
59 const char * | |
60 ram_used(const char *unused) | |
61 { | |
62 uintmax_t total, free, buffers, cached, used; | |
63 | |
64 if (pscanf("/proc/meminfo", | |
65 "MemTotal: %ju kB\n" | |
66 "MemFree: %ju kB\n" | |
67 "MemAvailable: %ju kB\n" | |
68 "Buffers: %ju kB\n" | |
69 "Cached: %ju kB\n", | |
70 &total, &free, &buffers, &buffers, &cached) !… | |
71 return NULL; | |
72 | |
73 used = (total - free - buffers - cached); | |
74 return fmt_human(used * 1024, 1024); | |
75 } | |
76 #elif defined(__OpenBSD__) | |
77 #include <stdlib.h> | |
78 #include <sys/sysctl.h> | |
79 #include <sys/types.h> | |
80 #include <unistd.h> | |
81 | |
82 #define LOG1024 10 | |
83 #define pagetok(size, pageshift) (size_t)(size << (pageshift - L… | |
84 | |
85 inline int | |
86 load_uvmexp(struct uvmexp *uvmexp) | |
87 { | |
88 int uvmexp_mib[] = {CTL_VM, VM_UVMEXP}; | |
89 size_t size; | |
90 | |
91 size = sizeof(*uvmexp); | |
92 | |
93 if (sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0) | |
94 return 1; | |
95 | |
96 return 0; | |
97 } | |
98 | |
99 const char * | |
100 ram_free(const char *unused) | |
101 { | |
102 struct uvmexp uvmexp; | |
103 int free_pages; | |
104 | |
105 if (!load_uvmexp(&uvmexp)) | |
106 return NULL; | |
107 | |
108 free_pages = uvmexp.npages - uvmexp.active; | |
109 return fmt_human(pagetok(free_pages, uvmexp.pageshift) * | |
110 1024, 1024); | |
111 } | |
112 | |
113 const char * | |
114 ram_perc(const char *unused) | |
115 { | |
116 struct uvmexp uvmexp; | |
117 int percent; | |
118 | |
119 if (!load_uvmexp(&uvmexp)) | |
120 return NULL; | |
121 | |
122 percent = uvmexp.active * 100 / uvmexp.npages; | |
123 return bprintf("%d", percent); | |
124 } | |
125 | |
126 const char * | |
127 ram_total(const char *unused) | |
128 { | |
129 struct uvmexp uvmexp; | |
130 | |
131 if (!load_uvmexp(&uvmexp)) | |
132 return NULL; | |
133 | |
134 return fmt_human(pagetok(uvmexp.npages, | |
135 uvmexp.pageshift) * 1024, 1024); | |
136 } | |
137 | |
138 const char * | |
139 ram_used(const char *unused) | |
140 { | |
141 struct uvmexp uvmexp; | |
142 | |
143 if (!load_uvmexp(&uvmexp)) | |
144 return NULL; | |
145 | |
146 return fmt_human(pagetok(uvmexp.active, | |
147 uvmexp.pageshift) * 1024, 1024); | |
148 } | |
149 #elif defined(__FreeBSD__) | |
150 #include <sys/sysctl.h> | |
151 #include <sys/vmmeter.h> | |
152 #include <unistd.h> | |
153 #include <vm/vm_param.h> | |
154 | |
155 const char * | |
156 ram_free(const char *unused) { | |
157 struct vmtotal vm_stats; | |
158 int mib[] = {CTL_VM, VM_TOTAL}; | |
159 size_t len; | |
160 | |
161 len = sizeof(struct vmtotal); | |
162 if (sysctl(mib, 2, &vm_stats, &len, NULL, 0) < 0 | |
163 || !len) | |
164 return NULL; | |
165 | |
166 return fmt_human(vm_stats.t_free * getpagesize(), 1024); | |
167 } | |
168 | |
169 const char * | |
170 ram_total(const char *unused) { | |
171 unsigned int npages; | |
172 size_t len; | |
173 | |
174 len = sizeof(npages); | |
175 if (sysctlbyname("vm.stats.vm.v_page_count", | |
176 &npages, &len, NULL, 0) < 0 || !len) | |
177 return NULL; | |
178 | |
179 return fmt_human(npages * getpagesize(), 1024); | |
180 } | |
181 | |
182 const char * | |
183 ram_perc(const char *unused) { | |
184 unsigned int npages; | |
185 unsigned int active; | |
186 size_t len; | |
187 | |
188 len = sizeof(npages); | |
189 if (sysctlbyname("vm.stats.vm.v_page_count", | |
190 &npages, &len, NULL, 0) < 0 || !len) | |
191 return NULL; | |
192 | |
193 if (sysctlbyname("vm.stats.vm.v_active_count", | |
194 &active, &len, NULL, 0) < 0 || !len) | |
195 return NULL; | |
196 | |
197 return bprintf("%d", active * 100 / npages); | |
198 } | |
199 | |
200 const char * | |
201 ram_used(const char *unused) { | |
202 unsigned int active; | |
203 size_t len; | |
204 | |
205 len = sizeof(active); | |
206 if (sysctlbyname("vm.stats.vm.v_active_count", | |
207 &active, &len, NULL, 0) < 0 || !len) | |
208 return NULL; | |
209 | |
210 return fmt_human(active * getpagesize(), 1024); | |
211 } | |
212 #endif |