2011-05-30 Ivan Maidanski <ivmai@mail.ru>
authorivmai <ivmai>
Mon, 30 May 2011 16:52:54 +0000 (16:52 +0000)
committerIvan Maidanski <ivmai@mail.ru>
Mon, 25 Jul 2011 12:03:26 +0000 (16:03 +0400)
* configure.ac (PIC): Add workaround for GCC v3.4.6 which does not
define the corresponding macro.
* configure.ac: Don't check for GCC twice.
* configure: Regenerate.
* tests/test_malloc.c (DEFAULT_NTHREADS): New macro.
* tests/test_malloc.c (run_one_test): Refine printed message (in
case of HAVE_MMAP).
* tests/test_malloc.c (main): Use DEFAULT_NTHREADS.
* tests/test_stack.c (main): Cast AO_stack_pop() returned pointer.
* src/atomic_ops_malloc.c (USE_MMAP_ANON, GC_MMAP_FLAGS,
OPT_MAP_ANON): New macro.
* src/atomic_ops_malloc.c (get_mmaped): Pass -1 (instead of 0) as
file descriptor to mmap() if MAP_ANONYMOUS (same as for MAP_ANON).
* src/atomic_ops_malloc.c (get_mmaped): Use USE_MMAP_ANON,
GC_MMAP_FLAGS and OPT_MAP_ANON macros; reformat code; check open()
returned value.

ChangeLog
configure
configure.ac
src/atomic_ops_malloc.c
tests/test_malloc.c
tests/test_stack.c

index c864db2..e876913 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2011-05-30  Ivan Maidanski  <ivmai@mail.ru>
+
+       * configure.ac (PIC): Add workaround for GCC v3.4.6 which does not
+       define the corresponding macro.
+       * configure.ac: Don't check for GCC twice.
+       * configure: Regenerate.
+       * tests/test_malloc.c (DEFAULT_NTHREADS): New macro.
+       * tests/test_malloc.c (run_one_test): Refine printed message (in
+       case of HAVE_MMAP).
+       * tests/test_malloc.c (main): Use DEFAULT_NTHREADS.
+       * tests/test_stack.c (main): Cast AO_stack_pop() returned pointer.
+       * src/atomic_ops_malloc.c (USE_MMAP_ANON, GC_MMAP_FLAGS,
+       OPT_MAP_ANON): New macro.
+       * src/atomic_ops_malloc.c (get_mmaped): Pass -1 (instead of 0) as
+       file descriptor to mmap() if MAP_ANONYMOUS (same as for MAP_ANON).
+       * src/atomic_ops_malloc.c (get_mmaped): Use USE_MMAP_ANON,
+       GC_MMAP_FLAGS and OPT_MAP_ANON macros; reformat code; check open()
+       returned value.
+
 2011-05-11  Ivan Maidanski  <ivmai@mail.ru>
 
        * tests/test_malloc.c: Expand all tabs to spaces; remove trailing
index 91069fd..56e2d35 100755 (executable)
--- a/configure
+++ b/configure
@@ -4730,24 +4730,26 @@ if test "$GCC" = yes; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: -fPIC" >&5
 $as_echo "-fPIC" >&6; }
   PICFLAG=-fPIC
+  case "$host" in
+    *-*-solaris*)
+      # Workaround: at least GCC 3.4.6 does not define this macro.
+      CFLAGS="$CFLAGS -D__PIC__=1"
+      ;;
+  esac
 else
   case "$host" in
     *-*-hpux*)
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"+Z\"" >&5
 $as_echo "\"+Z\"" >&6; }
       PICFLAG="+Z"
-      if test "$GCC" != yes; then
-        CFLAGS="$CFLAGS +O2 -mt"
-      fi
+      CFLAGS="$CFLAGS +O2 -mt"
       ;;
     *-*-solaris*)
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: -Kpic" >&5
 $as_echo "-Kpic" >&6; }
       PICFLAG=-Kpic
-      if test "$GCC" != yes; then
-        CFLAGS="$CFLAGS -O"
-        need_asm=true
-      fi
+      CFLAGS="$CFLAGS -O"
+      need_asm=true
       ;;
     *-*-linux*)
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: -fPIC" >&5
index 547e315..e913b96 100644 (file)
@@ -25,22 +25,24 @@ AC_MSG_CHECKING(Determining PIC compiler flag)
 if test "$GCC" = yes; then
   AC_MSG_RESULT(-fPIC)
   PICFLAG=-fPIC
+  case "$host" in
+    *-*-solaris*)
+      # Workaround: at least GCC 3.4.6 does not define this macro.
+      CFLAGS="$CFLAGS -D__PIC__=1"
+      ;;
+  esac
 else
   case "$host" in
     *-*-hpux*)
       AC_MSG_RESULT("+Z")
       PICFLAG="+Z"
-      if test "$GCC" != yes; then
-        CFLAGS="$CFLAGS +O2 -mt"
-      fi
+      CFLAGS="$CFLAGS +O2 -mt"
       ;;
     *-*-solaris*)
       AC_MSG_RESULT(-Kpic)
       PICFLAG=-Kpic
-      if test "$GCC" != yes; then
-        CFLAGS="$CFLAGS -O"
-        need_asm=true
-      fi
+      CFLAGS="$CFLAGS -O"
+      need_asm=true
       ;;
     *-*-linux*)
       AC_MSG_RESULT(-fPIC)
index 4c08269..3af585e 100644 (file)
@@ -67,6 +67,28 @@ static volatile char *initial_heap_lim = AO_initial_heap + AO_INITIAL_HEAP_SIZE;
 #include <fcntl.h>
 #include <sys/mman.h>
 
+#if defined(MAP_ANONYMOUS) || defined(MAP_ANON)
+# define USE_MMAP_ANON
+#endif
+
+#ifdef USE_MMAP_FIXED
+# define GC_MMAP_FLAGS MAP_FIXED | MAP_PRIVATE
+        /* Seems to yield better performance on Solaris 2, but can      */
+        /* be unreliable if something is already mapped at the address. */
+#else
+# define GC_MMAP_FLAGS MAP_PRIVATE
+#endif
+
+#ifdef USE_MMAP_ANON
+# ifdef MAP_ANONYMOUS
+#   define OPT_MAP_ANON MAP_ANONYMOUS
+# else
+#   define OPT_MAP_ANON MAP_ANON
+# endif
+#else
+# define OPT_MAP_ANON 0
+#endif
+
 static volatile AO_t mmap_enabled = 0;
 
 void
@@ -78,24 +100,28 @@ AO_malloc_enable_mmap(void)
 static char *get_mmaped(size_t sz)
 {
   char * result;
+# ifdef USE_MMAP_ANON
+#   define zero_fd -1
+# else
+    int zero_fd;
+# endif
 
   assert(!(sz & (CHUNK_SIZE - 1)));
-  if (!mmap_enabled) return 0;
-# if defined(MAP_ANONYMOUS)
-    result = mmap(0, sz, PROT_READ | PROT_WRITE,
-                  MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
-# elif defined(MAP_ANON)
-    result = mmap(0, sz, PROT_READ | PROT_WRITE,
-                  MAP_PRIVATE | MAP_ANON, -1, 0);
-# else
-    {
-      int zero_fd = open("/dev/zero", O_RDONLY);
-      result = mmap(0, sz, PROT_READ | PROT_WRITE,
-                    MAP_PRIVATE, zero_fd, 0);
-      close(zero_fd);
-    }
+  if (!mmap_enabled)
+    return 0;
+
+# ifndef USE_MMAP_ANON
+    zero_fd = open("/dev/zero", O_RDONLY);
+    if (zero_fd == -1)
+      return 0;
+# endif
+  result = mmap(0, sz, PROT_READ | PROT_WRITE,
+                GC_MMAP_FLAGS | OPT_MAP_ANON, zero_fd, 0/* offset */);
+# ifndef USE_MMAP_ANON
+    close(zero_fd);
 # endif
-  if (result == MAP_FAILED) result = 0;
+  if (result == MAP_FAILED)
+    result = 0;
   return result;
 }
 
@@ -281,8 +307,7 @@ AO_free(void *p)
   log_sz = *(AO_t *)base;
 # ifdef AO_TRACE_MALLOC
     fprintf(stderr, "%x: AO_free(%p sz:%lu)\n", (int)pthread_self(), p,
-                    (unsigned long)
-                      (log_sz > LOG_MAX_SIZE? log_sz : (1 << log_sz)));
+            (unsigned long)(log_sz > LOG_MAX_SIZE? log_sz : (1 << log_sz)));
 # endif
   if (log_sz > LOG_MAX_SIZE)
     AO_free_large(p);
index 4eb50a2..11e13ce 100644 (file)
 #ifndef MAX_NTHREADS
 # define MAX_NTHREADS 100
 #endif
+
+#ifndef DEFAULT_NTHREADS
+# ifdef HAVE_MMAP
+#   define DEFAULT_NTHREADS 10
+# else
+#   define DEFAULT_NTHREADS 3
+# endif
+#endif
+
 #ifndef N_REVERSALS
 # define N_REVERSALS 1000 /* must be even */
 #endif
+
 #ifndef LIST_LENGTH
 # define LIST_LENGTH 1000
 #endif
+
 #ifndef LARGE_OBJ_SIZE
 # define LARGE_OBJ_SIZE 200000
 #endif
@@ -130,9 +141,12 @@ void * run_one_test(void * arg) {
   char *q;
 
   if (0 == p) {
-    fprintf(stderr, "AO_malloc(%d) failed: This is normal without mmap\n",
-            LARGE_OBJ_SIZE);
-    AO_free(p);
+#   ifdef HAVE_MMAP
+      fprintf(stderr, "AO_malloc(%d) failed\n", LARGE_OBJ_SIZE);
+#   else
+      fprintf(stderr, "AO_malloc(%d) failed: This is normal without mmap\n",
+              LARGE_OBJ_SIZE);
+#   endif
   } else {
     p[0] = p[LARGE_OBJ_SIZE/2] = p[LARGE_OBJ_SIZE-1] = 'a';
     q = AO_malloc(LARGE_OBJ_SIZE);
@@ -168,11 +182,7 @@ int main(int argc, char **argv) {
     int exper_n;
 
     if (1 == argc) {
-#     if !defined(HAVE_MMAP)
-        nthreads = 3;
-#     else
-        nthreads = 10;
-#     endif
+      nthreads = DEFAULT_NTHREADS;
     } else if (2 == argc) {
       nthreads = atoi(argv[1]);
       if (nthreads < 1 || nthreads > MAX_NTHREADS) {
index 3955dc3..177ceee 100644 (file)
@@ -213,7 +213,7 @@ int main(int argc, char **argv)
           print_list();
   #     endif
         check_list(list_length);
-        while ((le = AO_stack_pop(&the_list)) != 0)
+        while ((le = (list_element *)AO_stack_pop(&the_list)) != 0)
           free(le);
       }
 # ifndef NO_TIMES