X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FMBlock.c;h=95744077b413e555952f5b26768d522ef43e0e25;hb=a551f1a135addb8e11b5c81bd3f25a3990483383;hp=5f6cfb7ca1416581d321410b6530972d71a08e27;hpb=80498a8a061475f74b2c093dfe97d454387581b8;p=ghc-hetmet.git diff --git a/ghc/rts/MBlock.c b/ghc/rts/MBlock.c index 5f6cfb7..9574407 100644 --- a/ghc/rts/MBlock.c +++ b/ghc/rts/MBlock.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: MBlock.c,v 1.34 2002/10/27 21:46:27 wolfgang Exp $ + * $Id: MBlock.c,v 1.41 2002/11/26 07:02:04 mthomas Exp $ * * (c) The GHC Team 1998-1999 * @@ -50,13 +50,9 @@ lnat mblocks_allocated = 0; The MBlock Map: provides our implementation of HEAP_ALLOCED() -------------------------------------------------------------------------- */ -StgWord8 mblock_map[4096]; // initially all zeros - -static void -mblockIsHeap (void *p) -{ - mblock_map[((StgWord)p & ~MBLOCK_MASK) >> MBLOCK_SHIFT] = 1; -} +#ifdef MBLOCK_MAP_SIZE +StgWord8 mblock_map[MBLOCK_MAP_SIZE]; // initially all zeros +#endif /* ----------------------------------------------------------------------------- Allocate new mblock(s) @@ -120,17 +116,25 @@ my_mmap (void *addr, int size) if(!addr || err) // try to allocate anywhere err = vm_allocate(mach_task_self(),(vm_address_t*) &ret, size, TRUE); - if(err) - ret = (void*) -1; + if(err) // don't know what the error codes mean exactly + barf("memory allocation failed (requested %d bytes)", size); else vm_protect(mach_task_self(),ret,size,FALSE,VM_PROT_READ|VM_PROT_WRITE); #else - ret = mmap(addr, size, PROT_READ | PROT_WRITE, + ret = mmap(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); #endif + if (ret == (void *)-1) { + if (errno == ENOMEM) { + barf("out of memory (requested %d bytes)", size); + } else { + barf("getMBlock: mmap failed"); + } + } + return ret; -} +} // Implements the general case: allocate a chunk of memory of 'size' // mblocks. @@ -145,9 +149,6 @@ gen_map_mblocks (int size) // it (unmap the rest). size += MBLOCK_SIZE; ret = my_mmap(0, size); - if (ret == (void *)-1) { - barf("gen_map_mblocks: mmap failed"); - } // unmap the slop bits around the chunk we allocated slop = (W_)ret & MBLOCK_MASK; @@ -159,6 +160,9 @@ gen_map_mblocks (int size) barf("gen_map_mblocks: munmap failed"); } + // ToDo: if we happened to get an aligned block, then don't + // unmap the excess, just use it. + // next time, try after the block we just got. ret += MBLOCK_SIZE - slop; return ret; @@ -181,20 +185,11 @@ getMBlocks(nat n) ret = gen_map_mblocks(size); } else { ret = my_mmap(next_request, size); - - if (ret == (void *)-1) { - if (errno == ENOMEM) { - belch("out of memory (requested %d bytes)", n * BLOCK_SIZE); - stg_exit(EXIT_FAILURE); - } else { - barf("getMBlock: mmap failed"); - } - } if (((W_)ret & MBLOCK_MASK) != 0) { // misaligned block! #ifdef DEBUG - belch("getMBlock: misaligned block %p returned when allocating %d megablock(s) at %p", ret, n, next_request); + belch("warning: getMBlock: misaligned block %p returned when allocating %d megablock(s) at %p", ret, n, next_request); #endif // unmap this block... @@ -207,13 +202,14 @@ getMBlocks(nat n) } // Next time, we'll try to allocate right after the block we just got. + // ToDo: check that we haven't already grabbed the memory at next_request next_request = ret + size; IF_DEBUG(gc,fprintf(stderr,"Allocated %d megablock(s) at %p\n",n,ret)); // fill in the table for (i = 0; i < n; i++) { - mblockIsHeap( ret + i * MBLOCK_SIZE ); + MARK_HEAP_ALLOCED( ret + i * MBLOCK_SIZE ); } mblocks_allocated += n; @@ -316,7 +312,7 @@ getMBlocks(nat n) // fill in the table for (i = 0; i < n; i++) { - mblockIsHeap( ret + i * MBLOCK_SIZE ); + MARK_HEAP_ALLOCED ( ret + i * MBLOCK_SIZE ); } return ret;