Xinqi Bao's Git

f653156e4e6e2da7326051a071962190c4e5d364
[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);
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);
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 }
70 #elif defined(__OpenBSD__)
71 #include <stdlib.h>
72 #include <sys/sysctl.h>
73 #include <sys/types.h>
74 #include <unistd.h>
75
76 #define LOG1024 10
77 #define pagetok(size, pageshift) ((size) << (pageshift - LOG1024))
78
79 inline int
80 load_uvmexp(struct uvmexp *uvmexp)
81 {
82 int uvmexp_mib[] = {CTL_VM, VM_UVMEXP};
83 size_t size;
84
85 size = sizeof(*uvmexp);
86
87 return sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0 ? 1 : 0;
88 }
89
90 const char *
91 ram_free(void)
92 {
93 struct uvmexp uvmexp;
94 int free_pages;
95
96 if (load_uvmexp(&uvmexp)) {
97 free_pages = uvmexp.npages - uvmexp.active;
98 return fmt_human_2(pagetok(free_pages,
99 uvmexp.pageshift) * 1024);
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,
126 uvmexp.pageshift) * 1024);
127 }
128
129 return NULL;
130 }
131
132 const char *
133 ram_used(void)
134 {
135 struct uvmexp uvmexp;
136
137 if (load_uvmexp(&uvmexp)) {
138 return fmt_human_2(pagetok(uvmexp.active,
139 uvmexp.pageshift) * 1024);
140 }
141
142 return NULL;
143 }
144 #endif