aboutsummaryrefslogtreecommitdiff
path: root/src/testbed/gnunet-service-testbed_meminfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/testbed/gnunet-service-testbed_meminfo.c')
-rw-r--r--src/testbed/gnunet-service-testbed_meminfo.c279
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"
58static 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.
64static 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
99typedef 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
105static int
106compare_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 */
148unsigned long kb_main_shared;
149/* old but still kicking -- the important stuff */
150unsigned long kb_main_buffers;
151unsigned long kb_main_cached;
152unsigned long kb_main_free;
153unsigned long kb_main_total;
154unsigned long kb_swap_free;
155unsigned long kb_swap_total;
156/* recently introduced */
157unsigned long kb_high_free;
158unsigned long kb_high_total;
159unsigned long kb_low_free;
160unsigned long kb_low_total;
161/* 2.4.xx era */
162unsigned long kb_active;
163unsigned long kb_inact_laundry;
164unsigned long kb_inact_dirty;
165unsigned long kb_inact_clean;
166unsigned long kb_inact_target;
167unsigned long kb_swap_cached; /* late 2.4 and 2.6+ only */
168/* derived values */
169unsigned long kb_swap_used;
170unsigned long kb_main_used;
171/* 2.5.41+ */
172unsigned long kb_writeback;
173unsigned long kb_slab;
174unsigned long nr_reversemaps;
175unsigned long kb_committed_as;
176unsigned long kb_dirty;
177unsigned long kb_inactive;
178unsigned long kb_mapped;
179unsigned long kb_pagetables;
180// seen on a 2.6.x kernel:
181static unsigned long kb_vmalloc_chunk;
182static unsigned long kb_vmalloc_total;
183static unsigned long kb_vmalloc_used;
184// seen on 2.6.24-rc6-git12
185static unsigned long kb_anon_pages;
186static unsigned long kb_bounce;
187static unsigned long kb_commit_limit;
188static unsigned long kb_nfs_unstable;
189static unsigned long kb_swap_reclaimable;
190static unsigned long kb_swap_unreclaimable;
191
192void
193meminfo (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);
262nextline:
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}