X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FMBlock.c;h=c0a619fbad87388faa202a76eeaf0a93c6008ec6;hb=a0b380bb30e37ab75eb42ff3f7e9a9bc60291496;hp=5e2fd2406307818b76b23d314aad52b60063330d;hpb=b311f131b123c6941daf3825f7432d85aa19368f;p=ghc-hetmet.git diff --git a/ghc/rts/MBlock.c b/ghc/rts/MBlock.c index 5e2fd24..c0a619f 100644 --- a/ghc/rts/MBlock.c +++ b/ghc/rts/MBlock.c @@ -1,5 +1,7 @@ /* ----------------------------------------------------------------------------- - * $Id: MBlock.c,v 1.8 1999/01/26 10:41:20 sof Exp $ + * $Id: MBlock.c,v 1.15 2000/04/03 15:24:21 rrt Exp $ + * + * (c) The GHC Team 1998-1999 * * MegaBlock Allocator Interface. This file contains all the dirty * architecture-dependent hackery required to get a chunk of aligned @@ -23,8 +25,10 @@ #include #endif -#ifdef HAVE_SYS_MMAN_H -#include +#ifndef mingw32_TARGET_OS +# ifdef HAVE_SYS_MMAN_H +# include +# endif #endif #ifdef HAVE_FCNTL_H @@ -35,7 +39,7 @@ #include #endif -#if freebsd2_TARGET_OS || freebsd3_TARGET_OS +#if freebsd2_TARGET_OS || freebsd_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 @@ -43,6 +47,10 @@ */ #define ASK_FOR_MEM_AT 0x50000000 +#elif netbsd_TARGET_OS +/* NetBSD i386 shared libs are at 0x40000000 + */ +#define ASK_FOR_MEM_AT 0x50000000 #elif linux_TARGET_OS /* Any ideas? */ @@ -56,6 +64,10 @@ /* guess */ #define ASK_FOR_MEM_AT 0x50000000 +#elif hpux_TARGET_OS +/* guess */ +#define ASK_FOR_MEM_AT 0x50000000 + #elif _WIN32 /* doesn't matter, we use a reserve/commit algorithm */ @@ -87,6 +99,9 @@ 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); #else ret = mmap(next_request, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); @@ -131,19 +146,29 @@ getMBlocks(nat n) */ +char* base_non_committed = (char*)0; + +/* Reserve VM 128M at the time to try to minimise the slop cost. */ +#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 + SIZE_RESERVED_POOL))); +} + void * getMBlocks(nat n) { - static char* base_non_committed = (char*)0; static char* base_mblocks = (char*)0; static char* next_request = (char*)0; void* ret = (void*)0; lnat size = MBLOCK_SIZE * n; - /* Reserve VM 128M at the time to try to minimise the slop cost. */ -#define SIZE_RESERVED_POOL ( 128 * 1024 * 1024 ) - if ( (base_non_committed == 0) || (next_request + size > base_non_committed + SIZE_RESERVED_POOL) ) { base_non_committed = VirtualAlloc ( NULL @@ -152,20 +177,20 @@ getMBlocks(nat n) , PAGE_READWRITE ); if ( base_non_committed == 0 ) { -# ifdef DEBUG +# if 1 /*def DEBUG*/ fprintf(stderr, "getMBlocks: VirtualAlloc failed with: %d\n", GetLastError()); # endif 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); # endif if ( ((char*)base_mblocks + size) > ((char*)base_non_committed + SIZE_RESERVED_POOL) ) { -# ifdef DEBUG +# if 1 /*def DEBUG*/ fprintf(stderr, "oops, committed too small a region to start with."); # endif ret=(void*)-1; @@ -178,7 +203,7 @@ getMBlocks(nat n) if ( ret != (void*)-1 ) { ret = VirtualAlloc(next_request, size, MEM_COMMIT, PAGE_READWRITE); if (ret == NULL) { -# ifdef DEBUG +# if 1 /*def DEBUG*/ fprintf(stderr, "getMBlocks: VirtualAlloc failed with: %d\n", GetLastError()); # endif ret=(void*)-1;