X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FMBlock.c;h=1bf4e80218723bfc45e46308a9b6ccf4a34563d4;hb=f74458a707d766e7b9b04db7d27cb3f697100e4f;hp=93478a295e3b55bc450acdb5b5c19b6b97d0d6ac;hpb=0bffc410964e1688ad80d277d53400659e697ab5;p=ghc-hetmet.git diff --git a/ghc/rts/MBlock.c b/ghc/rts/MBlock.c index 93478a2..1bf4e80 100644 --- a/ghc/rts/MBlock.c +++ b/ghc/rts/MBlock.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: MBlock.c,v 1.42 2002/12/11 15:36:42 simonmar Exp $ + * $Id: MBlock.c,v 1.44 2003/03/26 02:12:38 sof Exp $ * * (c) The GHC Team 1998-1999 * @@ -127,7 +127,8 @@ my_mmap (void *addr, int size) if (ret == (void *)-1) { if (errno == ENOMEM) { - barf("out of memory (requested %d bytes)", size); + prog_belch("out of memory (requested %d bytes)", size); + stg_exit(EXIT_FAILURE); } else { barf("getMBlock: mmap failed"); } @@ -152,16 +153,25 @@ gen_map_mblocks (int size) // unmap the slop bits around the chunk we allocated slop = (W_)ret & MBLOCK_MASK; - + if (munmap(ret, MBLOCK_SIZE - slop) == -1) { - barf("gen_map_mblocks: munmap failed"); + barf("gen_map_mblocks: munmap failed"); } if (slop > 0 && munmap(ret+size-slop, slop) == -1) { - barf("gen_map_mblocks: munmap failed"); + barf("gen_map_mblocks: munmap failed"); } - + // ToDo: if we happened to get an aligned block, then don't - // unmap the excess, just use it. + // unmap the excess, just use it. For this to work, you + // need to keep in mind the following: + // * Calling my_mmap() with an 'addr' arg pointing to + // already my_mmap()ed space is OK and won't fail. + // * If my_mmap() can't satisfy the request at the + // given 'next_request' address in getMBlocks(), that + // you unmap the extra mblock mmap()ed here (or simply + // satisfy yourself that the slop introduced isn't worth + // salvaging.) + // // next time, try after the block we just got. ret += MBLOCK_SIZE - slop;