Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/libgc
diff options
context:
space:
mode:
authorZoltan Varga <vargaz@gmail.com>2005-03-30 01:27:09 +0400
committerZoltan Varga <vargaz@gmail.com>2005-03-30 01:27:09 +0400
commitc3c60a65302eb7f8062b3e007ddfc842e8e0c6e0 (patch)
treec260a1a62bd9cccabe1e03b2a925dd1c17f724df /libgc
parent91d5abd7cbbb36cb9da4df517ba658e0426c0b16 (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/ChangeLog6
-rw-r--r--libgc/include/private/gcconfig.h1
-rw-r--r--libgc/os_dep.c27
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();