2005-03-29 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Tue, 29 Mar 2005 21:27:09 +0000 (21:27 -0000)
committerZoltan Varga <vargaz@gmail.com>
Tue, 29 Mar 2005 21:27:09 +0000 (21:27 -0000)
* os_dep.c: Add ability to fall back to mmap-ing memory when sbrk
fails.

* include/private/gcconfig.h: Enable FALLBACK_TO_MMAP on amd64. Fixes
#73882.

svn path=/trunk/mono/; revision=42356

libgc/ChangeLog
libgc/include/private/gcconfig.h
libgc/os_dep.c

index 32569ddbe93c56eb37c36edeef222759e59b60ce..f6ed8ef41121ba9194d578dcb5e976759274a4a7 100644 (file)
@@ -1,5 +1,11 @@
 2005-03-29  Zoltan Varga  <vargaz@freemail.hu>
 
+       * os_dep.c: Add ability to fall back to mmap-ing memory when sbrk
+       fails.
+
+       * include/private/gcconfig.h: Enable FALLBACK_TO_MMAP on amd64. Fixes
+       #73882.
+
        * config.guess config.sub ltmain.sh: Update these files with more
        up-to-date versions. Fixes #74071.
 
index 94b446b6796cae8ee56b03483f2027cc7006f39a..da7a4592779b99ac6116febdaa5bc7d30ee4a2e9 100644 (file)
 #   ifdef LINUX
 #      define OS_TYPE "LINUX"
 #       define LINUX_STACKBOTTOM
+#       define FALLBACK_TO_MMAP
 #       if !defined(GC_LINUX_THREADS) || !defined(REDIRECT_MALLOC)
 #          define MPROTECT_VDB
 #      else
index 6c19e060afb06fdf95719185a70c856c653d4178..83f468e89ed1a58d5d12dc086f5f45491939f136 100644 (file)
 # include <sys/uio.h>
 # include <malloc.h>   /* for locking */
 #endif
-#if defined(USE_MMAP) || defined(USE_MUNMAP)
+#if defined(USE_MUNMAP)
 # ifndef USE_MMAP
     --> USE_MUNMAP requires USE_MMAP
 # endif
+#endif
+#if defined(USE_MMAP) || defined(USE_MUNMAP) || defined(FALLBACK_TO_MMAP)
 # include <sys/types.h>
 # include <sys/mman.h>
 # include <sys/stat.h>
@@ -600,7 +602,7 @@ word GC_page_size;
 
 # else
 #   if defined(MPROTECT_VDB) || defined(PROC_VDB) || defined(USE_MMAP) \
-       || defined(USE_MUNMAP)
+       || defined(USE_MUNMAP) || defined(FALLBACK_TO_MMAP)
        void GC_setpagesize()
        {
            GC_page_size = GETPAGESIZE();
@@ -1533,7 +1535,7 @@ word bytes;
 
 #else  /* Not RS6000 */
 
-#if defined(USE_MMAP) || defined(USE_MUNMAP)
+#if defined(USE_MMAP) || defined(USE_MUNMAP) || defined(FALLBACK_TO_MMAP)
 
 #ifdef USE_MMAP_FIXED
 #   define GC_MMAP_FLAGS MAP_FIXED | MAP_PRIVATE
@@ -1557,14 +1559,18 @@ word bytes;
 
 #endif /* defined(USE_MMAP) || defined(USE_MUNMAP) */
 
-#if defined(USE_MMAP)
+#if defined(USE_MMAP) || defined(FALLBACK_TO_MMAP)
 /* Tested only under Linux, IRIX5 and Solaris 2 */
 
 #ifndef HEAP_START
 #   define HEAP_START 0
 #endif
 
+#ifdef FALLBACK_TO_MMAP
+static ptr_t GC_unix_get_mem_mmap(bytes)
+#else
 ptr_t GC_unix_get_mem(bytes)
+#endif
 word bytes;
 {
     void *result;
@@ -1601,7 +1607,10 @@ word bytes;
     return((ptr_t)result);
 }
 
-#else /* Not RS6000, not USE_MMAP */
+#endif
+
+#ifndef USE_MMAP
+
 ptr_t GC_unix_get_mem(bytes)
 word bytes;
 {
@@ -1620,7 +1629,13 @@ word bytes;
         if((ptr_t)sbrk(GC_page_size - lsbs) == (ptr_t)(-1)) return(0);
     }
     result = (ptr_t)sbrk((SBRK_ARG_T)bytes);
-    if (result == (ptr_t)(-1)) result = 0;
+    if (result == (ptr_t)(-1)) {
+#ifdef FALLBACK_TO_MMAP
+               result = GC_unix_get_mem_mmap (bytes);
+#else
+               result = 0;
+#endif
+       }
   }
 # ifdef IRIX5
     __UNLOCK_MALLOC();