From c7268677eec041516dad5e0b804c393b8e0e9adb Mon Sep 17 00:00:00 2001 From: simonmar Date: Wed, 14 May 2003 09:11:06 +0000 Subject: [PATCH] [project @ 2003-05-14 09:11:06 by simonmar] Calling mmap() with a size > 3Gig results in EINVAL on Linux. Catch this case and report it as an out of memory condition instead of a panic. --- ghc/rts/MBlock.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ghc/rts/MBlock.c b/ghc/rts/MBlock.c index 1bf4e80..2f9655e 100644 --- a/ghc/rts/MBlock.c +++ b/ghc/rts/MBlock.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: MBlock.c,v 1.44 2003/03/26 02:12:38 sof Exp $ + * $Id: MBlock.c,v 1.45 2003/05/14 09:11:06 simonmar Exp $ * * (c) The GHC Team 1998-1999 * @@ -87,7 +87,7 @@ getMBlock(void) // the mmap() interface. static void * -my_mmap (void *addr, int size) +my_mmap (void *addr, lnat size) { void *ret; @@ -126,11 +126,14 @@ my_mmap (void *addr, int size) #endif if (ret == (void *)-1) { - if (errno == ENOMEM) { + if (errno == ENOMEM || + (errno == EINVAL && sizeof(void*)==4 && size >= 0xc0000000)) { + // If we request more than 3Gig, then we get EINVAL + // instead of ENOMEM (at least on Linux). prog_belch("out of memory (requested %d bytes)", size); stg_exit(EXIT_FAILURE); } else { - barf("getMBlock: mmap failed"); + barf("getMBlock: mmap: %s", sys_errlist[errno]); } } @@ -141,7 +144,7 @@ my_mmap (void *addr, int size) // mblocks. static void * -gen_map_mblocks (int size) +gen_map_mblocks (lnat size) { int slop; void *ret; -- 1.7.10.4