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.
/* -----------------------------------------------------------------------------
/* -----------------------------------------------------------------------------
- * $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
*
*
* (c) The GHC Team 1998-1999
*
#include <sys/types.h>
#endif
#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
#endif
#ifdef HAVE_FCNTL_H
+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)
{
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;
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
if ( (base_non_committed == 0) ||
(next_request + size > base_non_committed + SIZE_RESERVED_POOL) ) {
base_non_committed = VirtualAlloc ( NULL
, PAGE_READWRITE
);
if ( base_non_committed == 0 ) {
, PAGE_READWRITE
);
if ( base_non_committed == 0 ) {
fprintf(stderr, "getMBlocks: VirtualAlloc failed with: %d\n", GetLastError());
# endif
ret=(void*)-1;
fprintf(stderr, "getMBlocks: VirtualAlloc failed with: %d\n", GetLastError());
# endif
ret=(void*)-1;
# endif
if ( ((char*)base_mblocks + size) > ((char*)base_non_committed + SIZE_RESERVED_POOL) ) {
# endif
if ( ((char*)base_mblocks + size) > ((char*)base_non_committed + SIZE_RESERVED_POOL) ) {
fprintf(stderr, "oops, committed too small a region to start with.");
# endif
ret=(void*)-1;
fprintf(stderr, "oops, committed too small a region to start with.");
# endif
ret=(void*)-1;
if ( ret != (void*)-1 ) {
ret = VirtualAlloc(next_request, size, MEM_COMMIT, PAGE_READWRITE);
if (ret == NULL) {
if ( ret != (void*)-1 ) {
ret = VirtualAlloc(next_request, size, MEM_COMMIT, PAGE_READWRITE);
if (ret == NULL) {
fprintf(stderr, "getMBlocks: VirtualAlloc failed with: %d\n", GetLastError());
# endif
ret=(void*)-1;
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
*
*
* (c) The GHC Team, 1998-1999
*
extern lnat mblocks_allocated;
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);
extern void * getMBlock(void);
extern void * getMBlocks(nat n);