bug-gnulib
[Top][All Lists]
Advanced

[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
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]