/* Getter for RLIMIT_DATA.
- Copyright (C) 2011 Free Software Foundation, Inc.
+ Copyright (C) 2011-2013 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2011.
This program is free software: you can redistribute it and/or modify
Note that malloc() falls back on mmap() for large allocations and also
for small allocations if there is not enough room in the data segment.
- MacOS X:
+ Mac OS X:
a) setrlimit with RLIMIT_DATA succeeds but does not really work: The OS
ignores RLIMIT_DATA. Therefore get_rusage_data_via_setrlimit() is
always 0.
OpenBSD:
a) setrlimit with RLIMIT_DATA works.
- b) No VMA iteration API exists.
+ b) mquery() can be used to find out about the virtual memory areas.
+ get_rusage_data_via_setrlimit() works much better than
+ get_rusage_data_via_iterator().
Note that malloc() appears to use mmap() for both large and small
allocations.
get_rusage_data_via_setrlimit() therefore produces a wrong value.
b) The /proc/$pid/maps file lists only the memory areas belonging to
the executable and shared libraries, not the anonymous memory.
- But the native Win32 API works.
+ But the native Windows API works.
Note that malloc() apparently falls back on mmap() for large allocations.
mingw:
# define errno_expected() (errno == EINVAL)
# endif
-static inline uintptr_t
+static uintptr_t
get_rusage_data_via_setrlimit (void)
{
uintptr_t result;
#else
-static inline uintptr_t
+static uintptr_t
get_rusage_data_via_setrlimit (void)
{
return 0;
return 0;
}
-static inline uintptr_t
+static uintptr_t
get_rusage_data_via_iterator (void)
{
# if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __BEOS__ || defined __HAIKU__
- /* On mingw, there is no sbrk() function.
+ /* On native Windows, there is no sbrk() function.
On Haiku, sbrk(0) always returns 0. */
static void *brk_value;
#else
-static inline uintptr_t
+static uintptr_t
get_rusage_data_via_iterator (void)
{
return 0;
uintptr_t
get_rusage_data (void)
{
-#if (defined __APPLE__ && defined __MACH__) || defined __CYGWIN__ /* MacOS X, Cygwin */
+#if (defined __APPLE__ && defined __MACH__) || defined __CYGWIN__ /* Mac OS X, Cygwin */
/* get_rusage_data_via_setrlimit() does not work.
Prefer get_rusage_data_via_iterator(). */
return get_rusage_data_via_iterator ();