/* -----------------------------------------------------------------------------
- * $Id: MBlock.c,v 1.44 2003/03/26 02:12:38 sof Exp $
+ * $Id: MBlock.c,v 1.47 2003/06/26 20:49:32 panne Exp $
*
* (c) The GHC Team 1998-1999
*
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
// the mmap() interface.
static void *
-my_mmap (void *addr, int size)
+my_mmap (void *addr, lnat size)
{
void *ret;
#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", strerror(errno));
}
}
// mblocks.
static void *
-gen_map_mblocks (int size)
+gen_map_mblocks (lnat size)
{
int slop;
void *ret;