[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: new module 'get-rusage-as'
From: |
Bruno Haible |
Subject: |
Re: new module 'get-rusage-as' |
Date: |
Tue, 18 Jan 2011 20:13:21 +0100 |
User-agent: |
KMail/1.9.9 |
I committed this module, with a small tweak so that on Cygwin 1.5.x,
a malloc of 10 MB makes a difference in get_rusage_as ().
Now for the unit tests. I'm rewriting the test infrastructure so that
1) It should avoid the failure on x86_64 Linux systems,
2) It detects test failures also on MacOS X and Cygwin.
The previous code worked only when setrlimit of RLIMIT_AS works. On these
platforms, get_rusage_as() also works. But get_rusage_as() works also on
other platforms. So it is better to use get_rusage_as() instead of
setrlimit of RLIMIT_AS.
When I reintroduce the memory leak fixed on 2009-12-15, the output on
MacOS X and Cygwin thus changes from
Skipping test: getrlimit and setrlimit don't work
SKIP: test-dprintf-posix2.sh
Skipping test: getrlimit and setrlimit don't work
SKIP: test-fprintf-posix3.sh
to
FAIL: test-dprintf-posix2.sh
FAIL: test-fprintf-posix3.sh
2011-01-18 Bruno Haible <address@hidden>
*printf-posix: Avoid test failures. Make tests work on MacOS X, Cygwin.
* tests/test-fprintf-posix3.c: Include "resource-ext.h".
(main): Perform test also when getrlimit and setrlimit don't exist or
when setrlimit of RLIMIT_DATA fails (like on Cygwin). Instead of
limiting the address space size using setrlimit, compare the address
space size before and after the the test.
* tests/test-dprintf-posix2.c: Likewise.
* tests/test-fprintf-posix3.sh: Update skip messages.
* tests/test-dprintf-posix2.sh: Likewise.
* modules/fprintf-posix-tests (Depends-on): Add get-rusage-as.
* modules/dprintf-posix-tests (Depends-on): Likewise.
Reported by Bruce Korb <address@hidden> and
Gary V. Vaughan <address@hidden>.
--- modules/dprintf-posix-tests.orig Tue Jan 18 20:10:39 2011
+++ modules/dprintf-posix-tests Tue Jan 18 19:48:22 2011
@@ -9,6 +9,7 @@
Depends-on:
stdint
+get-rusage-as
configure.ac:
AC_CHECK_FUNCS_ONCE([getrlimit setrlimit])
--- modules/fprintf-posix-tests.orig Tue Jan 18 20:10:39 2011
+++ modules/fprintf-posix-tests Tue Jan 18 19:48:22 2011
@@ -12,6 +12,7 @@
Depends-on:
stdint
+get-rusage-as
configure.ac:
AC_CHECK_FUNCS_ONCE([getrlimit setrlimit])
--- tests/test-dprintf-posix2.c.orig Tue Jan 18 20:10:39 2011
+++ tests/test-dprintf-posix2.c Tue Jan 18 20:03:16 2011
@@ -20,16 +20,19 @@
#include <stdio.h>
-#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
-
#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
+#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+#endif
+
+#include "resource-ext.h"
+
/* Test against a memory leak in the fprintf replacement. */
/* Number of iterations across the loop. */
@@ -46,32 +49,32 @@
int
main (int argc, char *argv[])
{
- struct rlimit limit;
+ uintptr_t initial_rusage_as;
int arg;
- int repeat;
+ int result;
/* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
/* On BSD systems, malloc() is limited by RLIMIT_DATA. */
-#ifdef RLIMIT_DATA
- if (getrlimit (RLIMIT_DATA, &limit) < 0)
- return 77;
- if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
- limit.rlim_max = MAX_ALLOC_TOTAL;
- limit.rlim_cur = limit.rlim_max;
- if (setrlimit (RLIMIT_DATA, &limit) < 0)
- return 77;
+#if HAVE_GETRLIMIT && HAVE_SETRLIMIT && defined RLIMIT_DATA
+ {
+ struct rlimit limit;
+
+ if (getrlimit (RLIMIT_DATA, &limit) >= 0)
+ {
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max >
MAX_ALLOC_TOTAL)
+ limit.rlim_max = MAX_ALLOC_TOTAL;
+ limit.rlim_cur = limit.rlim_max;
+ (void) setrlimit (RLIMIT_DATA, &limit);
+ }
+ }
#endif
- /* On Linux systems, malloc() is limited by RLIMIT_AS. */
-#ifdef RLIMIT_AS
- if (getrlimit (RLIMIT_AS, &limit) < 0)
- return 77;
- if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
- limit.rlim_max = MAX_ALLOC_TOTAL;
- limit.rlim_cur = limit.rlim_max;
- if (setrlimit (RLIMIT_AS, &limit) < 0)
+ /* On Linux systems, malloc() is limited by RLIMIT_AS.
+ On some systems, setrlimit of RLIMIT_AS doesn't work but get_rusage_as ()
+ does. Allow the address space size to grow by at most MAX_ALLOC_TOTAL.
*/
+ initial_rusage_as = get_rusage_as ();
+ if (initial_rusage_as == 0)
return 77;
-#endif
arg = atoi (argv[1]);
if (arg == 0)
@@ -80,30 +83,28 @@
if (memory == NULL)
return 1;
memset (memory, 17, MAX_ALLOC_TOTAL);
- return 78;
+ result = 78;
}
-
- /* Perform the test and test whether it triggers a permanent memory
- allocation of more than MAX_ALLOC_TOTAL bytes. */
-
- for (repeat = 0; repeat < NUM_ROUNDS; repeat++)
+ else
{
- /* This may produce a temporary memory allocation of 11000 bytes.
- but should not result in a permanent memory allocation. */
- if (dprintf (STDOUT_FILENO, "%011000d\n", 17) == -1
- && errno == ENOMEM)
- return 1;
- }
+ /* Perform the test and test whether it triggers a permanent memory
+ allocation of more than MAX_ALLOC_TOTAL bytes. */
+ int repeat;
+
+ for (repeat = 0; repeat < NUM_ROUNDS; repeat++)
+ {
+ /* This may produce a temporary memory allocation of 11000 bytes.
+ but should not result in a permanent memory allocation. */
+ if (dprintf (STDOUT_FILENO, "%011000d\n", 17) == -1
+ && errno == ENOMEM)
+ return 1;
+ }
- return 0;
-}
+ result = 0;
+ }
-#else
+ if (get_rusage_as () > initial_rusage_as + MAX_ALLOC_TOTAL)
+ return 1;
-int
-main (int argc, char *argv[])
-{
- return 77;
+ return result;
}
-
-#endif
--- tests/test-dprintf-posix2.sh.orig Tue Jan 18 20:10:39 2011
+++ tests/test-dprintf-posix2.sh Tue Jan 18 20:10:28 2011
@@ -9,14 +9,14 @@
) 2>/dev/null
malloc_result=$?
if test $malloc_result = 77; then
- echo "Skipping test: getrlimit and setrlimit don't work"
+ echo "Skipping test: no way to determine address space size"
exit 77
fi
./test-dprintf-posix2${EXEEXT} 1 > /dev/null
result=$?
if test $result = 77; then
- echo "Skipping test: getrlimit and setrlimit don't work"
+ echo "Skipping test: no way to determine address space size"
exit 77
fi
if test $result != 0; then
@@ -24,7 +24,7 @@
fi
if test $malloc_result = 78; then
- echo "Skipping test: getrlimit and setrlimit don't work"
+ echo "Skipping test: get_rusage_as() doesn't work"
exit 77
fi
--- tests/test-fprintf-posix3.c.orig Tue Jan 18 20:10:39 2011
+++ tests/test-fprintf-posix3.c Tue Jan 18 20:03:50 2011
@@ -20,15 +20,18 @@
#include <stdio.h>
-#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
-
#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
#include <string.h>
#include <errno.h>
+#if HAVE_GETRLIMIT && HAVE_SETRLIMIT
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/resource.h>
+#endif
+
+#include "resource-ext.h"
+
/* Test against a memory leak in the fprintf replacement. */
/* Number of iterations across the loop. */
@@ -45,32 +48,32 @@
int
main (int argc, char *argv[])
{
- struct rlimit limit;
+ uintptr_t initial_rusage_as;
int arg;
- int repeat;
+ int result;
/* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
/* On BSD systems, malloc() is limited by RLIMIT_DATA. */
-#ifdef RLIMIT_DATA
- if (getrlimit (RLIMIT_DATA, &limit) < 0)
- return 77;
- if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
- limit.rlim_max = MAX_ALLOC_TOTAL;
- limit.rlim_cur = limit.rlim_max;
- if (setrlimit (RLIMIT_DATA, &limit) < 0)
- return 77;
+#if HAVE_GETRLIMIT && HAVE_SETRLIMIT && defined RLIMIT_DATA
+ {
+ struct rlimit limit;
+
+ if (getrlimit (RLIMIT_DATA, &limit) >= 0)
+ {
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max >
MAX_ALLOC_TOTAL)
+ limit.rlim_max = MAX_ALLOC_TOTAL;
+ limit.rlim_cur = limit.rlim_max;
+ (void) setrlimit (RLIMIT_DATA, &limit);
+ }
+ }
#endif
- /* On Linux systems, malloc() is limited by RLIMIT_AS. */
-#ifdef RLIMIT_AS
- if (getrlimit (RLIMIT_AS, &limit) < 0)
- return 77;
- if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > MAX_ALLOC_TOTAL)
- limit.rlim_max = MAX_ALLOC_TOTAL;
- limit.rlim_cur = limit.rlim_max;
- if (setrlimit (RLIMIT_AS, &limit) < 0)
+ /* On Linux systems, malloc() is limited by RLIMIT_AS.
+ On some systems, setrlimit of RLIMIT_AS doesn't work but get_rusage_as ()
+ does. Allow the address space size to grow by at most MAX_ALLOC_TOTAL.
*/
+ initial_rusage_as = get_rusage_as ();
+ if (initial_rusage_as == 0)
return 77;
-#endif
arg = atoi (argv[1]);
if (arg == 0)
@@ -79,30 +82,28 @@
if (memory == NULL)
return 1;
memset (memory, 17, MAX_ALLOC_TOTAL);
- return 78;
+ result = 78;
}
-
- /* Perform the test and test whether it triggers a permanent memory
- allocation of more than MAX_ALLOC_TOTAL bytes. */
-
- for (repeat = 0; repeat < NUM_ROUNDS; repeat++)
+ else
{
- /* This may produce a temporary memory allocation of 11000 bytes.
- but should not result in a permanent memory allocation. */
- if (fprintf (stdout, "%011000d\n", 17) == -1
- && errno == ENOMEM)
- return 1;
- }
+ /* Perform the test and test whether it triggers a permanent memory
+ allocation of more than MAX_ALLOC_TOTAL bytes. */
+ int repeat;
+
+ for (repeat = 0; repeat < NUM_ROUNDS; repeat++)
+ {
+ /* This may produce a temporary memory allocation of 11000 bytes.
+ but should not result in a permanent memory allocation. */
+ if (fprintf (stdout, "%011000d\n", 17) == -1
+ && errno == ENOMEM)
+ return 1;
+ }
- return 0;
-}
+ result = 0;
+ }
-#else
+ if (get_rusage_as () > initial_rusage_as + MAX_ALLOC_TOTAL)
+ return 1;
-int
-main (int argc, char *argv[])
-{
- return 77;
+ return result;
}
-
-#endif
--- tests/test-fprintf-posix3.sh.orig Tue Jan 18 20:10:39 2011
+++ tests/test-fprintf-posix3.sh Tue Jan 18 20:10:28 2011
@@ -9,14 +9,14 @@
) 2>/dev/null
malloc_result=$?
if test $malloc_result = 77; then
- echo "Skipping test: getrlimit and setrlimit don't work"
+ echo "Skipping test: no way to determine address space size"
exit 77
fi
./test-fprintf-posix3${EXEEXT} 1 > /dev/null
result=$?
if test $result = 77; then
- echo "Skipping test: getrlimit and setrlimit don't work"
+ echo "Skipping test: no way to determine address space size"
exit 77
fi
if test $result != 0; then
@@ -24,7 +24,7 @@
fi
if test $malloc_result = 78; then
- echo "Skipping test: getrlimit and setrlimit don't work"
+ echo "Skipping test: get_rusage_as() doesn't work"
exit 77
fi