Xinqi Bao's Git

8f96b04a416cfbda4e28bc3a5e0b06c69060d45b
[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 fmt_scaled(free * 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 fmt_scaled(total * 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 fmt_scaled((total - free - buffers - cached) * 1024) : NULL;
57 }
58 #elif defined(__OpenBSD__)
59 #include <stdlib.h>
60 #include <sys/sysctl.h>
61 #include <sys/types.h>
62 #include <unistd.h>
63
64 #define LOG1024 10
65 #define pagetok(size, pageshift) ((size) << (pageshift - LOG1024))
66
67 inline int
68 load_uvmexp(struct uvmexp *uvmexp)
69 {
70 int uvmexp_mib[] = {CTL_VM, VM_UVMEXP};
71 size_t size;
72
73 size = sizeof(*uvmexp);
74
75 return sysctl(uvmexp_mib, 2, uvmexp, &size, NULL, 0) >= 0 ? 1 : 0;
76 }
77
78 const char *
79 ram_free(void)
80 {
81 struct uvmexp uvmexp;
82 int free_pages;
83
84 if (load_uvmexp(&uvmexp)) {
85 free_pages = uvmexp.npages - uvmexp.active;
86 return fmt_scaled(pagetok(free_pages, uvmexp.pageshift) * 1024);
87 }
88
89 return NULL;
90 }
91
92 const char *
93 ram_perc(void)
94 {
95 struct uvmexp uvmexp;
96 int percent;
97
98 if (load_uvmexp(&uvmexp)) {
99 percent = uvmexp.active * 100 / uvmexp.npages;
100 return bprintf("%d", percent);
101 }
102
103 return NULL;
104 }
105
106 const char *
107 ram_total(void)
108 {
109 struct uvmexp uvmexp;
110
111 if (load_uvmexp(&uvmexp)) {
112 return fmt_scaled(pagetok(uvmexp.npages, uvmexp.pageshift) * 1024);
113 }
114
115 return NULL;
116 }
117
118 const char *
119 ram_used(void)
120 {
121 struct uvmexp uvmexp;
122
123 if (load_uvmexp(&uvmexp)) {
124 return fmt_scaled(pagetok(uvmexp.active, uvmexp.pageshift) * 1024);
125 }
126
127 return NULL;
128 }
129 #endif