From: Zoltan Varga Date: Tue, 29 Mar 2005 21:27:09 +0000 (+0000) Subject: 2005-03-29 Zoltan Varga X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=36a5e4ea04bd62e15b34c078808d668af6c38b9a;p=gc 2005-03-29 Zoltan Varga * 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 --- diff --git a/ChangeLog b/ChangeLog index 78ace528..863d9db0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2005-03-29 Zoltan Varga + * 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/include/private/gcconfig.h b/include/private/gcconfig.h index 94b446b6..da7a4592 100644 --- a/include/private/gcconfig.h +++ b/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/os_dep.c b/os_dep.c index 6c19e060..83f468e8 100644 --- a/os_dep.c +++ b/os_dep.c @@ -117,10 +117,12 @@ # include # include /* 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 # include # include @@ -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();