projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[project @ 2003-07-30 10:38:42 by simonmar]
[ghc-hetmet.git]
/
ghc
/
rts
/
MBlock.c
diff --git
a/ghc/rts/MBlock.c
b/ghc/rts/MBlock.c
index
1bf4e80
..
d276be0
100644
(file)
--- 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.47 2003/06/26 20:49:32 panne Exp $
*
* (c) The GHC Team 1998-1999
*
*
* (c) The GHC Team 1998-1999
*
@@
-21,6
+21,9
@@
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
@@
-87,7
+90,7
@@
getMBlock(void)
// the mmap() interface.
static void *
// the mmap() interface.
static void *
-my_mmap (void *addr, int size)
+my_mmap (void *addr, lnat size)
{
void *ret;
{
void *ret;
@@
-126,11
+129,14
@@
my_mmap (void *addr, int size)
#endif
if (ret == (void *)-1) {
#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 {
prog_belch("out of memory (requested %d bytes)", size);
stg_exit(EXIT_FAILURE);
} else {
- barf("getMBlock: mmap failed");
+ barf("getMBlock: mmap: %s", strerror(errno));
}
}
}
}
@@
-141,7
+147,7
@@
my_mmap (void *addr, int size)
// mblocks.
static void *
// mblocks.
static void *
-gen_map_mblocks (int size)
+gen_map_mblocks (lnat size)
{
int slop;
void *ret;
{
int slop;
void *ret;