diff options
Diffstat (limited to 'src/testbed/gnunet-service-testbed_meminfo.c')
-rw-r--r-- | src/testbed/gnunet-service-testbed_meminfo.c | 279 |
1 files changed, 0 insertions, 279 deletions
diff --git a/src/testbed/gnunet-service-testbed_meminfo.c b/src/testbed/gnunet-service-testbed_meminfo.c deleted file mode 100644 index 1646b8d19..000000000 --- a/src/testbed/gnunet-service-testbed_meminfo.c +++ /dev/null | |||
@@ -1,279 +0,0 @@ | |||
1 | /* | ||
2 | This file is part of GNUnet. | ||
3 | Copyright (C) 2008--2013 GNUnet e.V. | ||
4 | |||
5 | GNUnet is free software: you can redistribute it and/or modify it | ||
6 | under the terms of the GNU Affero General Public License as published | ||
7 | by the Free Software Foundation, either version 3 of the License, | ||
8 | or (at your option) any later version. | ||
9 | |||
10 | GNUnet is distributed in the hope that it will be useful, but | ||
11 | WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Affero General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Affero General Public License | ||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | |||
18 | SPDX-License-Identifier: AGPL3.0-or-later | ||
19 | */ | ||
20 | |||
21 | #include "platform.h" | ||
22 | #include "gnunet_util_lib.h" | ||
23 | |||
24 | /* | ||
25 | * File for parsing top-level /proc entities. | ||
26 | * Copyright Copyright (C) 1992-1998 by Michael K. Johnson, johnsonm@redhat.com | ||
27 | * Copyright 1998-2003 Albert Cahalan | ||
28 | * June 2003, Fabian Frederick, disk and slab info | ||
29 | * | ||
30 | * This library is free software; you can redistribute it and/or | ||
31 | * modify it under the terms of the GNU Lesser General Public | ||
32 | * License as published by the Free Software Foundation; either | ||
33 | * version 2.1 of the License, or (at your option) any later version. | ||
34 | * | ||
35 | * This library is distributed in the hope that it will be useful, | ||
36 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
37 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
38 | * Lesser General Public License for more details. | ||
39 | * | ||
40 | * You should have received a copy of the GNU Lesser General Public | ||
41 | * License along with this library; if not, write to the Free Software | ||
42 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
43 | */ | ||
44 | |||
45 | #define BAD_OPEN_MESSAGE \ | ||
46 | "Error: /proc must be mounted\n" \ | ||
47 | " To mount /proc at boot you need an /etc/fstab line like:\n" \ | ||
48 | " proc /proc proc defaults\n" \ | ||
49 | " In the meantime, run \"mount proc /proc -t proc\"\n" | ||
50 | |||
51 | #define STAT_FILE "/proc/stat" | ||
52 | // static int stat_fd = -1; | ||
53 | #define UPTIME_FILE "/proc/uptime" | ||
54 | // static int uptime_fd = -1; | ||
55 | #define LOADAVG_FILE "/proc/loadavg" | ||
56 | // static int loadavg_fd = -1; | ||
57 | #define MEMINFO_FILE "/proc/meminfo" | ||
58 | static int meminfo_fd = -1; | ||
59 | #define VMINFO_FILE "/proc/vmstat" | ||
60 | // static int vminfo_fd = -1; | ||
61 | |||
62 | // As of 2.6.24 /proc/meminfo seems to need 888 on 64-bit, | ||
63 | // and would need 1258 if the obsolete fields were there. | ||
64 | static char buf[2048]; | ||
65 | |||
66 | /* This macro opens filename only if necessary and seeks to 0 so | ||
67 | * that successive calls to the functions are more efficient. | ||
68 | * It also reads the current contents of the file into the global buf. | ||
69 | */ | ||
70 | #define FILE_TO_BUF(filename, fd) do { \ | ||
71 | static int local_n; \ | ||
72 | if (fd == -1 && (fd = open (filename, O_RDONLY)) == -1) { \ | ||
73 | fputs (BAD_OPEN_MESSAGE, stderr); \ | ||
74 | fflush (NULL); \ | ||
75 | _exit (102); \ | ||
76 | } \ | ||
77 | lseek (fd, 0L, SEEK_SET); \ | ||
78 | if ((local_n = read (fd, buf, sizeof buf - 1)) < 0) { \ | ||
79 | perror (filename); \ | ||
80 | fflush (NULL); \ | ||
81 | _exit (103); \ | ||
82 | } \ | ||
83 | buf[local_n] = '\0'; \ | ||
84 | } while (0) | ||
85 | |||
86 | |||
87 | /***********************************************************************/ | ||
88 | /* | ||
89 | * Copyright 1999 by Albert Cahalan; all rights reserved. | ||
90 | * This file may be used subject to the terms and conditions of the | ||
91 | * GNU Library General Public License Version 2, or any later version | ||
92 | * at your option, as published by the Free Software Foundation. | ||
93 | * This program is distributed in the hope that it will be useful, | ||
94 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
95 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
96 | * GNU Library General Public License for more details. | ||
97 | */ | ||
98 | |||
99 | typedef struct mem_table_struct | ||
100 | { | ||
101 | const char *name; /* memory type name */ | ||
102 | unsigned long *slot; /* slot in return struct */ | ||
103 | } mem_table_struct; | ||
104 | |||
105 | static int | ||
106 | compare_mem_table_structs (const void *a, const void *b) | ||
107 | { | ||
108 | return strcmp (((const mem_table_struct *) a)->name, ((const | ||
109 | mem_table_struct *) b) | ||
110 | -> | ||
111 | name); | ||
112 | } | ||
113 | |||
114 | |||
115 | /* example data, following junk, with comments added: | ||
116 | * | ||
117 | * MemTotal: 61768 kB old | ||
118 | * MemFree: 1436 kB old | ||
119 | * MemShared: 0 kB old (now always zero; not calculated) | ||
120 | * Buffers: 1312 kB old | ||
121 | * Cached: 20932 kB old | ||
122 | * Active: 12464 kB new | ||
123 | * Inact_dirty: 7772 kB new | ||
124 | * Inact_clean: 2008 kB new | ||
125 | * Inact_target: 0 kB new | ||
126 | * Inact_laundry: 0 kB new, and might be missing too | ||
127 | * HighTotal: 0 kB | ||
128 | * HighFree: 0 kB | ||
129 | * LowTotal: 61768 kB | ||
130 | * LowFree: 1436 kB | ||
131 | * SwapTotal: 122580 kB old | ||
132 | * SwapFree: 60352 kB old | ||
133 | * Inactive: 20420 kB 2.5.41+ | ||
134 | * Dirty: 0 kB 2.5.41+ | ||
135 | * Writeback: 0 kB 2.5.41+ | ||
136 | * Mapped: 9792 kB 2.5.41+ | ||
137 | * Slab: 4564 kB 2.5.41+ | ||
138 | * Committed_AS: 8440 kB 2.5.41+ | ||
139 | * PageTables: 304 kB 2.5.41+ | ||
140 | * ReverseMaps: 5738 2.5.41+ | ||
141 | * SwapCached: 0 kB 2.5.??+ | ||
142 | * HugePages_Total: 220 2.5.??+ | ||
143 | * HugePages_Free: 138 2.5.??+ | ||
144 | * Hugepagesize: 4096 kB 2.5.??+ | ||
145 | */ | ||
146 | |||
147 | /* obsolete */ | ||
148 | unsigned long kb_main_shared; | ||
149 | /* old but still kicking -- the important stuff */ | ||
150 | unsigned long kb_main_buffers; | ||
151 | unsigned long kb_main_cached; | ||
152 | unsigned long kb_main_free; | ||
153 | unsigned long kb_main_total; | ||
154 | unsigned long kb_swap_free; | ||
155 | unsigned long kb_swap_total; | ||
156 | /* recently introduced */ | ||
157 | unsigned long kb_high_free; | ||
158 | unsigned long kb_high_total; | ||
159 | unsigned long kb_low_free; | ||
160 | unsigned long kb_low_total; | ||
161 | /* 2.4.xx era */ | ||
162 | unsigned long kb_active; | ||
163 | unsigned long kb_inact_laundry; | ||
164 | unsigned long kb_inact_dirty; | ||
165 | unsigned long kb_inact_clean; | ||
166 | unsigned long kb_inact_target; | ||
167 | unsigned long kb_swap_cached; /* late 2.4 and 2.6+ only */ | ||
168 | /* derived values */ | ||
169 | unsigned long kb_swap_used; | ||
170 | unsigned long kb_main_used; | ||
171 | /* 2.5.41+ */ | ||
172 | unsigned long kb_writeback; | ||
173 | unsigned long kb_slab; | ||
174 | unsigned long nr_reversemaps; | ||
175 | unsigned long kb_committed_as; | ||
176 | unsigned long kb_dirty; | ||
177 | unsigned long kb_inactive; | ||
178 | unsigned long kb_mapped; | ||
179 | unsigned long kb_pagetables; | ||
180 | // seen on a 2.6.x kernel: | ||
181 | static unsigned long kb_vmalloc_chunk; | ||
182 | static unsigned long kb_vmalloc_total; | ||
183 | static unsigned long kb_vmalloc_used; | ||
184 | // seen on 2.6.24-rc6-git12 | ||
185 | static unsigned long kb_anon_pages; | ||
186 | static unsigned long kb_bounce; | ||
187 | static unsigned long kb_commit_limit; | ||
188 | static unsigned long kb_nfs_unstable; | ||
189 | static unsigned long kb_swap_reclaimable; | ||
190 | static unsigned long kb_swap_unreclaimable; | ||
191 | |||
192 | void | ||
193 | meminfo (void) | ||
194 | { | ||
195 | char namebuf[16]; /* big enough to hold any row name */ | ||
196 | mem_table_struct findme = { namebuf, NULL }; | ||
197 | mem_table_struct *found; | ||
198 | char *head; | ||
199 | char *tail; | ||
200 | static const mem_table_struct mem_table[] = { | ||
201 | { "Active", &kb_active }, // important | ||
202 | { "AnonPages", &kb_anon_pages }, | ||
203 | { "Bounce", &kb_bounce }, | ||
204 | { "Buffers", &kb_main_buffers }, // important | ||
205 | { "Cached", &kb_main_cached }, // important | ||
206 | { "CommitLimit", &kb_commit_limit }, | ||
207 | { "Committed_AS", &kb_committed_as }, | ||
208 | { "Dirty", &kb_dirty }, // kB version of vmstat nr_dirty | ||
209 | { "HighFree", &kb_high_free }, | ||
210 | { "HighTotal", &kb_high_total }, | ||
211 | { "Inact_clean", &kb_inact_clean }, | ||
212 | { "Inact_dirty", &kb_inact_dirty }, | ||
213 | { "Inact_laundry", &kb_inact_laundry }, | ||
214 | { "Inact_target", &kb_inact_target }, | ||
215 | { "Inactive", &kb_inactive }, // important | ||
216 | { "LowFree", &kb_low_free }, | ||
217 | { "LowTotal", &kb_low_total }, | ||
218 | { "Mapped", &kb_mapped }, // kB version of vmstat nr_mapped | ||
219 | { "MemFree", &kb_main_free }, // important | ||
220 | { "MemShared", &kb_main_shared }, // important, but now gone! | ||
221 | { "MemTotal", &kb_main_total }, // important | ||
222 | { "NFS_Unstable", &kb_nfs_unstable }, | ||
223 | { "PageTables", &kb_pagetables }, // kB version of vmstat nr_page_table_pages | ||
224 | { "ReverseMaps", &nr_reversemaps }, // same as vmstat nr_page_table_pages | ||
225 | { "SReclaimable", &kb_swap_reclaimable }, // "swap reclaimable" (dentry and inode structures) | ||
226 | { "SUnreclaim", &kb_swap_unreclaimable }, | ||
227 | { "Slab", &kb_slab }, // kB version of vmstat nr_slab | ||
228 | { "SwapCached", &kb_swap_cached }, | ||
229 | { "SwapFree", &kb_swap_free }, // important | ||
230 | { "SwapTotal", &kb_swap_total }, // important | ||
231 | { "VmallocChunk", &kb_vmalloc_chunk }, | ||
232 | { "VmallocTotal", &kb_vmalloc_total }, | ||
233 | { "VmallocUsed", &kb_vmalloc_used }, | ||
234 | { "Writeback", &kb_writeback }, // kB version of vmstat nr_writeback | ||
235 | }; | ||
236 | const int mem_table_count = sizeof(mem_table) / sizeof(mem_table_struct); | ||
237 | |||
238 | FILE_TO_BUF (MEMINFO_FILE, meminfo_fd); | ||
239 | |||
240 | kb_inactive = ~0UL; | ||
241 | |||
242 | head = buf; | ||
243 | for (;;) | ||
244 | { | ||
245 | tail = strchr (head, ':'); | ||
246 | if (! tail) | ||
247 | break; | ||
248 | *tail = '\0'; | ||
249 | if (strlen (head) >= sizeof(namebuf)) | ||
250 | { | ||
251 | head = tail + 1; | ||
252 | goto nextline; | ||
253 | } | ||
254 | strcpy (namebuf, head); | ||
255 | found = bsearch (&findme, mem_table, mem_table_count, | ||
256 | sizeof(mem_table_struct), compare_mem_table_structs | ||
257 | ); | ||
258 | head = tail + 1; | ||
259 | if (! found) | ||
260 | goto nextline; | ||
261 | *(found->slot) = (unsigned long) strtoull (head, &tail, 10); | ||
262 | nextline: | ||
263 | tail = strchr (head, '\n'); | ||
264 | if (! tail) | ||
265 | break; | ||
266 | head = tail + 1; | ||
267 | } | ||
268 | if (! kb_low_total) /* low==main except with large-memory support */ | ||
269 | { | ||
270 | kb_low_total = kb_main_total; | ||
271 | kb_low_free = kb_main_free; | ||
272 | } | ||
273 | if (kb_inactive == ~0UL) | ||
274 | { | ||
275 | kb_inactive = kb_inact_dirty + kb_inact_clean + kb_inact_laundry; | ||
276 | } | ||
277 | kb_swap_used = kb_swap_total - kb_swap_free; | ||
278 | kb_main_used = kb_main_total - kb_main_free; | ||
279 | } | ||