Xinqi Bao's Git

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