annotate lib/get-rusage-as.c @ 17363:5a51fb7777a9

sys_select, sys_time: port 2013-01-30 Solaris 2.6 fix to Cygwin Problem reported by Marco Atzeri in <http://lists.gnu.org/archive/html/bug-gnulib/2013-03/msg00000.html>. * lib/sys_select.in.h [HAVE_SYS_SELECT_H && _CYGWIN_SYS_TIME_H]: Simply delegate to the system <sys/select.h> in this case too. Also, pay attention to _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H only if OSF/1, since otherwise Cygwin breaks, and it doesn't seem to be needed on Solaris either. * lib/sys_time.in.h [_CYGWIN_SYS_TIME_H]: Simply delgate to the system <sys/time.h> in this case.
author Paul Eggert <eggert@cs.ucla.edu>
date Tue, 19 Mar 2013 09:08:47 -0700
parents e542fd46ad6f
children 344018b6e5d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Getter for RLIMIT_AS.
17249
e542fd46ad6f maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents: 17185
diff changeset
2 Copyright (C) 2011-2013 Free Software Foundation, Inc.
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 Written by Bruno Haible <bruno@clisp.org>, 2011.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 This program is free software: you can redistribute it and/or modify
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 the Free Software Foundation; either version 3 of the License, or
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8 (at your option) any later version.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 GNU General Public License for more details.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18 #include <config.h>
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20 /* Specification. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21 #include "resource-ext.h"
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23 /* The "address space size" is defined as the total size of the virtual memory
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 areas of the current process. This includes
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 - areas belonging to the executable and shared libraries,
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 - areas allocated by malloc() or mmap(),
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27 - the stack and environment areas,
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28 - gaps and guard pages (mappings with PROT_NONE),
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 - other system dependent areas, such as vsyscall or vdso on Linux.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 There are two ways of retrieving the current address space size:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 a) by trying setrlimit with various values and observing whether the
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 kernel allows additional mmap calls,
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 b) by using system dependent APIs that allow to iterate over the list
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 of virtual memory areas.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 We don't use the mincore() based approach here, because it would be very
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 slow when applied to an entire address space, especially on 64-bit
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 platforms.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 We define two functions
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 get_rusage_as_via_setrlimit(),
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 get_rusage_as_via_iterator().
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 Discussion per platform:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 Linux:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 a) setrlimit with RLIMIT_AS works.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 b) The /proc/self/maps file contains a list of the virtual memory areas.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 Both methods agree, except that on x86_64 systems, the value of
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 get_rusage_as_via_iterator() is 4 KB higher than
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 get_rusage_as_via_setrlimit().
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51
16935
498a2211d839 Write "Mac OS X" instead of "MacOS X".
Bruno Haible <bruno@clisp.org>
parents: 16214
diff changeset
52 Mac OS X:
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 a) setrlimit with RLIMIT_AS succeeds but does not really work: The OS
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 ignores RLIMIT_AS. mmap() of a page always succeeds, therefore
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 get_rusage_as_via_setrlimit() is always 0.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 b) The Mach based API works.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58 FreeBSD:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 a) setrlimit with RLIMIT_AS works.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 b) The /proc/self/maps file contains a list of the virtual memory areas.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 NetBSD:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 a) setrlimit with RLIMIT_AS works.
14218
5c7bf99f5907 get-rusage-as: Improve on NetBSD.
Bruno Haible <bruno@clisp.org>
parents: 14215
diff changeset
64 b) The /proc/self/maps file contains a list of the virtual memory areas.
5c7bf99f5907 get-rusage-as: Improve on NetBSD.
Bruno Haible <bruno@clisp.org>
parents: 14215
diff changeset
65 Both methods agree,
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 OpenBSD:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 a) setrlimit exists, but RLIMIT_AS is not defined.
14235
6b8b94f919ce vma-iter, get-rusage-as: Add OpenBSD support.
Bruno Haible <bruno@clisp.org>
parents: 14227
diff changeset
69 b) mquery() can be used to find out about the virtual memory areas.
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 AIX:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72 a) setrlimit with RLIMIT_AS succeeds but does not really work: The OS
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 apparently ignores RLIMIT_AS. mmap() of a page always succeeds,
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 therefore get_rusage_as_via_setrlimit() is always 0.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75 b) No VMA iteration API exists.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 HP-UX:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 a) setrlimit with RLIMIT_AS works.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 b) No VMA iteration API exists.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81 IRIX:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82 a) setrlimit with RLIMIT_AS works.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83 b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84 Both methods agree,
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86 OSF/1:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
87 a) setrlimit with RLIMIT_AS works.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88 b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89 The value returned by get_rusage_as_via_setrlimit() is 64 KB higher than
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90 get_rusage_as_via_iterator(). It's not clear why.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
92 Solaris:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
93 a) setrlimit with RLIMIT_AS works.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
94 b) No VMA iteration API exists.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
95
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
96 Cygwin:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
97 a) setrlimit with RLIMIT_AS always fails when the limit is < 0x80000000.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 get_rusage_as_via_setrlimit() therefore produces a wrong value.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99 b) The /proc/$pid/maps file lists only the memory areas belonging to
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
100 the executable and shared libraries, not the anonymous memory.
16214
ec738d6aeef5 Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
101 But the native Windows API works.
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
103 mingw:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
104 a) There is no setrlimit function.
16214
ec738d6aeef5 Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents: 16201
diff changeset
105 b) The native Windows API works.
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
107 BeOS, Haiku:
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
108 a) On BeOS, there is no setrlimit function.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
109 On Haiku, setrlimit exists. RLIMIT_AS is defined but unsupported.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110 b) There is a specific BeOS API: get_next_area_info().
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111 */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
114 #include <errno.h> /* errno */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
115 #include <stdlib.h> /* size_t, abort */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
116 #include <fcntl.h> /* open, O_RDONLY */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
117 #include <unistd.h> /* getpagesize, read, close */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
118
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
119
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
120 /* System support for get_rusage_as_via_setrlimit(). */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
122 #if HAVE_SETRLIMIT
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
123 # include <sys/time.h>
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
124 # include <sys/resource.h> /* getrlimit, setrlimit */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
125 #endif
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
126
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
127 /* Test whether mmap() and mprotect() are available.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
128 We don't use HAVE_MMAP, because AC_FUNC_MMAP would not define it on HP-UX.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
129 HAVE_MPROTECT is not enough, because mingw does not have mmap() but has an
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130 mprotect() function in libgcc.a. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131 #if HAVE_SYS_MMAN_H && HAVE_MPROTECT
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
132 # include <fcntl.h>
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
133 # include <sys/types.h>
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
134 # include <sys/mman.h> /* mmap, munmap */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
135 /* Define MAP_FILE when it isn't otherwise. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
136 # ifndef MAP_FILE
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
137 # define MAP_FILE 0
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
138 # endif
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
139 #endif
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
140
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
141
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
142 /* System support for get_rusage_as_via_iterator(). */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
143
14220
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
144 #include "vma-iter.h"
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
145
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
146
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
147 #if HAVE_SETRLIMIT && defined RLIMIT_AS && HAVE_SYS_MMAN_H && HAVE_MPROTECT
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
148
17185
dd46d4e6beea dup, execute, fatal-signal, etc.: no 'static inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16935
diff changeset
149 static uintptr_t
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
150 get_rusage_as_via_setrlimit (void)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
151 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
152 uintptr_t result;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
153
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
154 struct rlimit orig_limit;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
155
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
156 # if HAVE_MAP_ANONYMOUS
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
157 const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
158 const int fd = -1;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
159 # else /* !HAVE_MAP_ANONYMOUS */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
160 const int flags = MAP_FILE | MAP_PRIVATE;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
161 int fd = open ("/dev/zero", O_RDONLY, 0666);
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
162 if (fd < 0)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
163 return 0;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
164 # endif
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
165
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
166 /* Record the original limit. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
167 if (getrlimit (RLIMIT_AS, &orig_limit) < 0)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
168 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
169 result = 0;
14215
8e261eb86ba2 get-rusage-as: Fix bug.
Bruno Haible <bruno@clisp.org>
parents: 14178
diff changeset
170 goto done2;
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
171 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
172
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
173 if (orig_limit.rlim_max != RLIM_INFINITY
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
174 && (orig_limit.rlim_cur == RLIM_INFINITY
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
175 || orig_limit.rlim_cur > orig_limit.rlim_max))
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
176 /* We may not be able to restore the current rlim_cur value.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
177 So bail out. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
178 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
179 result = 0;
14215
8e261eb86ba2 get-rusage-as: Fix bug.
Bruno Haible <bruno@clisp.org>
parents: 14178
diff changeset
180 goto done2;
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
181 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
182
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
183 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
184 /* The granularity is a single page. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
185 const size_t pagesize = getpagesize ();
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
186
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
187 uintptr_t low_bound = 0;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
188 uintptr_t high_bound;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
189
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
190 for (;;)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
191 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
192 /* Here we know that the address space size is >= low_bound. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
193 struct rlimit try_limit;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
194 uintptr_t try_next = 2 * low_bound + pagesize;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
195
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
196 if (try_next < low_bound)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
197 /* Overflow. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
198 try_next = ((uintptr_t) (~ 0) / pagesize) * pagesize;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
199
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
200 /* There's no point in trying a value > orig_limit.rlim_max, as
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
201 setrlimit would fail anyway. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
202 if (orig_limit.rlim_max != RLIM_INFINITY
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
203 && orig_limit.rlim_max < try_next)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
204 try_next = orig_limit.rlim_max;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
205
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
206 /* Avoid endless loop. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
207 if (try_next == low_bound)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
208 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
209 /* try_next could not be increased. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
210 result = low_bound;
14215
8e261eb86ba2 get-rusage-as: Fix bug.
Bruno Haible <bruno@clisp.org>
parents: 14178
diff changeset
211 goto done1;
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
212 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
213
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
214 try_limit.rlim_max = orig_limit.rlim_max;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
215 try_limit.rlim_cur = try_next;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
216 if (setrlimit (RLIMIT_AS, &try_limit) == 0)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
217 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
218 /* Allocate a page of memory, to compare the current address space
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
219 size with try_limit.rlim_cur. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
220 void *new_page =
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
221 mmap (NULL, pagesize, PROT_READ | PROT_WRITE, flags, fd, 0);
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
222
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
223 if (new_page != (void *)(-1))
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
224 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
225 /* The page could be added successfully. Free it. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
226 if (munmap (new_page, pagesize) < 0)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
227 abort ();
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
228 /* We know that the address space size is
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
229 < try_limit.rlim_cur. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
230 high_bound = try_next;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
231 break;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
232 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
233 else
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
234 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
235 /* We know that the address space size is
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
236 >= try_limit.rlim_cur. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
237 low_bound = try_next;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
238 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
239 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
240 else
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
241 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
242 /* Here we expect only EINVAL, not EPERM. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
243 if (errno != EINVAL)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
244 abort ();
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
245 /* We know that the address space size is
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
246 >= try_limit.rlim_cur. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
247 low_bound = try_next;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
248 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
249 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
250
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
251 /* Here we know that the address space size is
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
252 >= low_bound and < high_bound. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
253 while (high_bound - low_bound > pagesize)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
254 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
255 struct rlimit try_limit;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
256 uintptr_t try_next =
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
257 low_bound + (((high_bound - low_bound) / 2) / pagesize) * pagesize;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
258
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
259 /* Here low_bound <= try_next < high_bound. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
260 try_limit.rlim_max = orig_limit.rlim_max;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
261 try_limit.rlim_cur = try_next;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
262 if (setrlimit (RLIMIT_AS, &try_limit) == 0)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
263 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
264 /* Allocate a page of memory, to compare the current address space
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
265 size with try_limit.rlim_cur. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
266 void *new_page =
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
267 mmap (NULL, pagesize, PROT_READ | PROT_WRITE, flags, fd, 0);
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
268
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
269 if (new_page != (void *)(-1))
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
270 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
271 /* The page could be added successfully. Free it. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
272 if (munmap (new_page, pagesize) < 0)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
273 abort ();
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
274 /* We know that the address space size is
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
275 < try_limit.rlim_cur. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
276 high_bound = try_next;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
277 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
278 else
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
279 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
280 /* We know that the address space size is
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
281 >= try_limit.rlim_cur. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
282 low_bound = try_next;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
283 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
284 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
285 else
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
286 {
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
287 /* Here we expect only EINVAL, not EPERM. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
288 if (errno != EINVAL)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
289 abort ();
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
290 /* We know that the address space size is
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
291 >= try_limit.rlim_cur. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
292 low_bound = try_next;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
293 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
294 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
295
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
296 result = low_bound;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
297 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
298
14215
8e261eb86ba2 get-rusage-as: Fix bug.
Bruno Haible <bruno@clisp.org>
parents: 14178
diff changeset
299 done1:
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
300 /* Restore the original rlim_cur value. */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
301 if (setrlimit (RLIMIT_AS, &orig_limit) < 0)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
302 abort ();
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
303
14215
8e261eb86ba2 get-rusage-as: Fix bug.
Bruno Haible <bruno@clisp.org>
parents: 14178
diff changeset
304 done2:
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
305 # if !HAVE_MAP_ANONYMOUS
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
306 close (fd);
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
307 # endif
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
308 return result;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
309 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
310
14227
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
311 #else
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
312
17185
dd46d4e6beea dup, execute, fatal-signal, etc.: no 'static inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16935
diff changeset
313 static uintptr_t
14227
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
314 get_rusage_as_via_setrlimit (void)
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
315 {
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
316 return 0;
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
317 }
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
318
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
319 #endif
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
320
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
321
14220
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
322 #if VMA_ITERATE_SUPPORTED
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
323
14220
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
324 static int
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
325 vma_iterate_callback (void *data, uintptr_t start, uintptr_t end,
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
326 unsigned int flags)
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
327 {
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
328 uintptr_t *totalp = (uintptr_t *) data;
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
329
14220
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
330 *totalp += end - start;
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
331 return 0;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
332 }
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
333
17185
dd46d4e6beea dup, execute, fatal-signal, etc.: no 'static inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16935
diff changeset
334 static uintptr_t
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
335 get_rusage_as_via_iterator (void)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
336 {
14220
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
337 uintptr_t total = 0;
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
338
14220
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
339 vma_iterate (vma_iterate_callback, &total);
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
340
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
341 return total;
14220
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
342 }
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
343
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
344 #else
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
345
17185
dd46d4e6beea dup, execute, fatal-signal, etc.: no 'static inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16935
diff changeset
346 static uintptr_t
14220
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
347 get_rusage_as_via_iterator (void)
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
348 {
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
349 return 0;
14220
996391c07734 New module 'vma-iter'.
Bruno Haible <bruno@clisp.org>
parents: 14218
diff changeset
350 }
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
351
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
352 #endif
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
353
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
354
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
355 uintptr_t
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
356 get_rusage_as (void)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
357 {
16935
498a2211d839 Write "Mac OS X" instead of "MacOS X".
Bruno Haible <bruno@clisp.org>
parents: 16214
diff changeset
358 #if (defined __APPLE__ && defined __MACH__) || defined _AIX || defined __CYGWIN__ /* Mac OS X, AIX, Cygwin */
14175
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
359 /* get_rusage_as_via_setrlimit() does not work.
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
360 Prefer get_rusage_as_via_iterator(). */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
361 return get_rusage_as_via_iterator ();
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
362 #elif HAVE_SETRLIMIT && defined RLIMIT_AS && HAVE_SYS_MMAN_H && HAVE_MPROTECT
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
363 /* Prefer get_rusage_as_via_setrlimit() if it succeeds,
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
364 because the caller may want to use the result with setrlimit(). */
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
365 uintptr_t result;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
366
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
367 result = get_rusage_as_via_setrlimit ();
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
368 if (result == 0)
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
369 result = get_rusage_as_via_iterator ();
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
370 return result;
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
371 #else
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
372 return get_rusage_as_via_iterator ();
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
373 #endif
ae1f97981b87 New module 'get-rusage-as'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
374 }
14227
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
375
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
376
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
377 #ifdef TEST
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
378
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
379 #include <stdio.h>
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
380
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
381 int
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
382 main ()
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
383 {
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
384 printf ("Initially: 0x%08lX 0x%08lX 0x%08lX\n",
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
385 get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (),
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
386 get_rusage_as ());
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
387 malloc (0x88);
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
388 printf ("After small malloc: 0x%08lX 0x%08lX 0x%08lX\n",
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
389 get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (),
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
390 get_rusage_as ());
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
391 malloc (0x8812);
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
392 printf ("After medium malloc: 0x%08lX 0x%08lX 0x%08lX\n",
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
393 get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (),
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
394 get_rusage_as ());
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
395 malloc (0x281237);
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
396 printf ("After large malloc: 0x%08lX 0x%08lX 0x%08lX\n",
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
397 get_rusage_as_via_setrlimit (), get_rusage_as_via_iterator (),
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
398 get_rusage_as ());
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
399 return 0;
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
400 }
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
401
8bb45aca6841 get-rusage-as: Allow for easier testing.
Bruno Haible <bruno@clisp.org>
parents: 14220
diff changeset
402 #endif /* TEST */