Commit 9bebeb69 authored by sof's avatar sof
Browse files

[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.
parent 59456a73
/* -----------------------------------------------------------------------------
* $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 <sys/types.h>
#endif
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#ifndef mingw32_TARGET_OS
# ifdef HAVE_SYS_MMAN_H
# include <sys/mman.h>
# 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;
......
/* -----------------------------------------------------------------------------
* $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);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment