Xinqi Bao's Git

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