Xinqi Bao's Git

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