X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FMBlock.c;h=109b23e549503aecfae27d8ed13dd01c54163903;hb=9213df4a0c5a8f121832d36d6d3afbf1c80f1a0a;hp=c9b4500650e6fc79eb12f288f9e37b4fe4bfff59;hpb=9bebeb69fe3afbee2ef2617745ad49a3eecb1aab;p=ghc-hetmet.git diff --git a/ghc/rts/MBlock.c b/ghc/rts/MBlock.c index c9b4500..109b23e 100644 --- a/ghc/rts/MBlock.c +++ b/ghc/rts/MBlock.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: MBlock.c,v 1.10 1999/03/03 19:04:56 sof Exp $ + * $Id: MBlock.c,v 1.21 2001/01/16 11:54:25 simonmar Exp $ * * (c) The GHC Team 1998-1999 * @@ -39,35 +39,6 @@ #include #endif -#if freebsd2_TARGET_OS || freebsd3_TARGET_OS -/* Executable is loaded from 0x0 - * Shared libraries are loaded at 0x2000000 - * Stack is at the top of the address space. The kernel probably owns - * 0x8000000 onwards, so we'll pick 0x5000000. - */ -#define ASK_FOR_MEM_AT 0x50000000 - -#elif linux_TARGET_OS -/* Any ideas? - */ -#define ASK_FOR_MEM_AT 0x50000000 - -#elif solaris2_TARGET_OS -/* guess */ -#define ASK_FOR_MEM_AT 0x50000000 - -#elif osf3_TARGET_OS -/* guess */ -#define ASK_FOR_MEM_AT 0x50000000 - -#elif _WIN32 -/* doesn't matter, we use a reserve/commit algorithm */ - -#else -#error Dont know where to get memory from on this architecture -/* ToDo: memory locations on other architectures */ -#endif - lnat mblocks_allocated = 0; void * @@ -80,7 +51,7 @@ getMBlock(void) void * getMBlocks(nat n) { - static caddr_t next_request = (caddr_t)ASK_FOR_MEM_AT; + static caddr_t next_request = (caddr_t)HEAP_BASE; caddr_t ret; lnat size = MBLOCK_SIZE * n; @@ -91,6 +62,12 @@ getMBlocks(nat n) MAP_FIXED | MAP_PRIVATE, fd, 0); close(fd); } +#elif hpux_TARGET_OS + ret = mmap(next_request, size, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); +#elif macosx_TARGET_OS + ret = mmap(next_request, size, PROT_READ | PROT_WRITE, + MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); #else ret = mmap(next_request, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); @@ -105,7 +82,7 @@ getMBlocks(nat n) } if (((W_)ret & MBLOCK_MASK) != 0) { - barf("GetMBlock: misaligned block returned"); + barf("GetMBlock: misaligned block %p returned when allocating %d megablock(s) at %p", ret, n, next_request); } IF_DEBUG(gc,fprintf(stderr,"Allocated %d megablock(s) at %x\n",n,(nat)ret)); @@ -141,11 +118,12 @@ char* base_non_committed = (char*)0; #define SIZE_RESERVED_POOL ( 128 * 1024 * 1024 ) /* This predicate should be inlined, really. */ +/* TODO: this only works for a single chunk */ int is_heap_alloced(const void* x) { return (((char*)(x) >= base_non_committed) && - ((char*)(x) <= (base_non_committed + 128 * 1024 * 1024))); + ((char*)(x) <= (base_non_committed + SIZE_RESERVED_POOL))); } void * @@ -159,6 +137,10 @@ getMBlocks(nat n) if ( (base_non_committed == 0) || (next_request + size > base_non_committed + SIZE_RESERVED_POOL) ) { +#ifdef ENABLE_WIN32_DLL_SUPPORT + if (base_non_committed) + barf("Windows programs can only use 128Mb of heap; sorry!"); +#endif base_non_committed = VirtualAlloc ( NULL , SIZE_RESERVED_POOL , MEM_RESERVE @@ -171,7 +153,7 @@ getMBlocks(nat n) ret=(void*)-1; } else { /* The returned pointer is not aligned on a mega-block boundary. Make it. */ - base_mblocks = (char*)((unsigned)base_non_committed & (unsigned)0xfff00000) + 0x100000; + base_mblocks = (char*)((unsigned long)base_non_committed & (unsigned long)0xfff00000) + MBLOCK_SIZE; # if 0 fprintf(stderr, "Dropping %d bytes off of 128M chunk\n", (unsigned)base_mblocks - (unsigned)base_non_committed);