diff options
author | Zoltan Varga <vargaz@gmail.com> | 2005-03-30 01:27:09 +0400 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2005-03-30 01:27:09 +0400 |
commit | c3c60a65302eb7f8062b3e007ddfc842e8e0c6e0 (patch) | |
tree | c260a1a62bd9cccabe1e03b2a925dd1c17f724df /libgc | |
parent | 91d5abd7cbbb36cb9da4df517ba658e0426c0b16 (diff) |
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.
svn path=/trunk/mono/; revision=42356
Diffstat (limited to 'libgc')
-rw-r--r-- | libgc/ChangeLog | 6 | ||||
-rw-r--r-- | libgc/include/private/gcconfig.h | 1 | ||||
-rw-r--r-- | libgc/os_dep.c | 27 |
3 files changed, 28 insertions, 6 deletions
diff --git a/libgc/ChangeLog b/libgc/ChangeLog index 32569ddbe93..f6ed8ef4112 100644 --- a/libgc/ChangeLog +++ b/libgc/ChangeLog @@ -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. diff --git a/libgc/include/private/gcconfig.h b/libgc/include/private/gcconfig.h index 94b446b6796..da7a4592779 100644 --- a/libgc/include/private/gcconfig.h +++ b/libgc/include/private/gcconfig.h @@ -1832,6 +1832,7 @@ # 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 diff --git a/libgc/os_dep.c b/libgc/os_dep.c index 6c19e060afb..83f468e89ed 100644 --- a/libgc/os_dep.c +++ b/libgc/os_dep.c @@ -117,10 +117,12 @@ # 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(); |