Commit c7268677 authored by simonmar's avatar simonmar
Browse files

[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.
parent 1d0504a9
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* $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 * (c) The GHC Team 1998-1999
* *
...@@ -87,7 +87,7 @@ getMBlock(void) ...@@ -87,7 +87,7 @@ getMBlock(void)
// the mmap() interface. // the mmap() interface.
static void * static void *
my_mmap (void *addr, int size) my_mmap (void *addr, lnat size)
{ {
void *ret; void *ret;
...@@ -126,11 +126,14 @@ my_mmap (void *addr, int size) ...@@ -126,11 +126,14 @@ my_mmap (void *addr, int size)
#endif #endif
if (ret == (void *)-1) { 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); prog_belch("out of memory (requested %d bytes)", size);
stg_exit(EXIT_FAILURE); stg_exit(EXIT_FAILURE);
} else { } else {
barf("getMBlock: mmap failed"); barf("getMBlock: mmap: %s", sys_errlist[errno]);
} }
} }
...@@ -141,7 +144,7 @@ my_mmap (void *addr, int size) ...@@ -141,7 +144,7 @@ my_mmap (void *addr, int size)
// mblocks. // mblocks.
static void * static void *
gen_map_mblocks (int size) gen_map_mblocks (lnat size)
{ {
int slop; int slop;
void *ret; void *ret;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment