From: sof Date: Wed, 3 Mar 1999 19:04:57 +0000 (+0000) Subject: [project @ 1999-03-03 19:04:56 by sof] X-Git-Tag: Approximately_9120_patches~6433 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=9bebeb69fe3afbee2ef2617745ad49a3eecb1aab;p=ghc-hetmet.git [project @ 1999-03-03 19:04:56 by sof] Added is_heap_alloced() to the API - returns true if an address is within the range of addresses that we've been given back from the OS. Only needed for Win32 DLLs, so it's only defined when compiling up a Win32 RTS DLL. --- diff --git a/ghc/rts/MBlock.c b/ghc/rts/MBlock.c index 96be15f..c9b4500 100644 --- a/ghc/rts/MBlock.c +++ b/ghc/rts/MBlock.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: MBlock.c,v 1.9 1999/02/05 16:02:44 simonm Exp $ + * $Id: MBlock.c,v 1.10 1999/03/03 19:04:56 sof Exp $ * * (c) The GHC Team 1998-1999 * @@ -25,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 @@ -133,19 +135,28 @@ 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. */ +int +is_heap_alloced(const void* x) +{ + return (((char*)(x) >= base_non_committed) && + ((char*)(x) <= (base_non_committed + 128 * 1024 * 1024))); +} + 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 @@ -154,7 +165,7 @@ 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; @@ -167,7 +178,7 @@ getMBlocks(nat n) # 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; @@ -180,7 +191,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; diff --git a/ghc/rts/MBlock.h b/ghc/rts/MBlock.h index 1615f70..52467e5 100644 --- a/ghc/rts/MBlock.h +++ b/ghc/rts/MBlock.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: MBlock.h,v 1.4 1999/02/05 16:02:45 simonm Exp $ + * $Id: MBlock.h,v 1.5 1999/03/03 19:04:57 sof Exp $ * * (c) The GHC Team, 1998-1999 * @@ -9,5 +9,9 @@ extern lnat mblocks_allocated; +#ifdef HAVE_WIN32_DLL_SUPPORT +extern int is_heap_alloced(const void* p); +#endif + extern void * getMBlock(void); extern void * getMBlocks(nat n);