Xinqi Bao's Git

Refactor swap.c to use getline() instead of buf-filling
[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(free * 1024, 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(total * 1024, 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((total - free - buffers - cached) * 1024,
69 1024);
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_t)(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 if (sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0) {
89 return 1;
90 }
91
92 return 0;
93 }
94
95 const char *
96 ram_free(void)
97 {
98 struct uvmexp uvmexp;
99 int free_pages;
100
101 if (load_uvmexp(&uvmexp)) {
102 free_pages = uvmexp.npages - uvmexp.active;
103 return fmt_human(pagetok(free_pages, uvmexp.pageshift) *
104 1024, 1024);
105 }
106
107 return NULL;
108 }
109
110 const char *
111 ram_perc(void)
112 {
113 struct uvmexp uvmexp;
114 int percent;
115
116 if (load_uvmexp(&uvmexp)) {
117 percent = uvmexp.active * 100 / uvmexp.npages;
118 return bprintf("%d", percent);
119 }
120
121 return NULL;
122 }
123
124 const char *
125 ram_total(void)
126 {
127 struct uvmexp uvmexp;
128
129 if (load_uvmexp(&uvmexp)) {
130 return fmt_human(pagetok(uvmexp.npages,
131 uvmexp.pageshift) * 1024,
132 1024);
133 }
134
135 return NULL;
136 }
137
138 const char *
139 ram_used(void)
140 {
141 struct uvmexp uvmexp;
142
143 if (load_uvmexp(&uvmexp)) {
144 return fmt_human(pagetok(uvmexp.active,
145 uvmexp.pageshift) * 1024,
146 1024);
147 }
148
149 return NULL;
150 }
151 #endif