Commit 1dfac5c8 authored by lennart.augustsson@credit-suisse.com's avatar lennart.augustsson@credit-suisse.com
Browse files

Free all memory when shutting down. XXX not implemented for Posix.

parent c9b3d15f
...@@ -299,6 +299,12 @@ getMBlocks(nat n) ...@@ -299,6 +299,12 @@ getMBlocks(nat n)
return ret; return ret;
} }
void
freeAllMBlocks(void)
{
/* XXX Do something here */
}
#else /* defined(mingw32_HOST_OS) || defined(cygwin32_HOST_OS) */ #else /* defined(mingw32_HOST_OS) || defined(cygwin32_HOST_OS) */
/* /*
...@@ -316,8 +322,10 @@ getMBlocks(nat n) ...@@ -316,8 +322,10 @@ getMBlocks(nat n)
our case). our case).
*/ */
char* base_non_committed = (char*)0; static char* base_non_committed = (char*)0;
char* end_non_committed = (char*)0; static char* end_non_committed = (char*)0;
static void *membase;
/* Default is to reserve 256M of VM to minimise the slop cost. */ /* Default is to reserve 256M of VM to minimise the slop cost. */
#define SIZE_RESERVED_POOL ( 256 * 1024 * 1024 ) #define SIZE_RESERVED_POOL ( 256 * 1024 * 1024 )
...@@ -356,9 +364,10 @@ getMBlocks(nat n) ...@@ -356,9 +364,10 @@ getMBlocks(nat n)
, MEM_RESERVE , MEM_RESERVE
, PAGE_READWRITE , PAGE_READWRITE
); );
membase = base_non_committed;
if ( base_non_committed == 0 ) { if ( base_non_committed == 0 ) {
errorBelch("getMBlocks: VirtualAlloc failed with: %ld\n", GetLastError()); errorBelch("getMBlocks: VirtualAlloc MEM_RESERVE %lu failed with: %ld\n", size_reserved_pool, GetLastError());
ret=(void*)-1; ret=(void*)-1;
} else { } else {
end_non_committed = (char*)base_non_committed + (unsigned long)size_reserved_pool; end_non_committed = (char*)base_non_committed + (unsigned long)size_reserved_pool;
/* The returned pointer is not aligned on a mega-block boundary. Make it. */ /* The returned pointer is not aligned on a mega-block boundary. Make it. */
...@@ -380,7 +389,7 @@ getMBlocks(nat n) ...@@ -380,7 +389,7 @@ getMBlocks(nat n)
if ( ret != (void*)-1 ) { if ( ret != (void*)-1 ) {
ret = VirtualAlloc(next_request, size, MEM_COMMIT, PAGE_READWRITE); ret = VirtualAlloc(next_request, size, MEM_COMMIT, PAGE_READWRITE);
if (ret == NULL) { if (ret == NULL) {
debugBelch("getMBlocks: VirtualAlloc failed with: %ld\n", GetLastError()); debugBelch("getMBlocks: VirtualAlloc MEM_COMMIT %lu failed with: %ld\n", size, GetLastError());
ret=(void*)-1; ret=(void*)-1;
} }
} }
...@@ -406,6 +415,18 @@ getMBlocks(nat n) ...@@ -406,6 +415,18 @@ getMBlocks(nat n)
return ret; return ret;
} }
void
freeAllMBlocks(void)
{
BOOL rc;
rc = VirtualFree(membase, 0, MEM_RELEASE);
if (rc == FALSE) {
debugBelch("freeAllMBlocks: VirtualFree failed with: %ld\n", GetLastError());
}
}
/* Hand back the physical memory that is allocated to a mega-block. /* Hand back the physical memory that is allocated to a mega-block.
ToDo: chain the released mega block onto some list so that ToDo: chain the released mega block onto some list so that
getMBlocks() can get at it. getMBlocks() can get at it.
......
...@@ -13,6 +13,7 @@ extern lnat RTS_VAR(mblocks_allocated); ...@@ -13,6 +13,7 @@ extern lnat RTS_VAR(mblocks_allocated);
extern void * getMBlock(void); extern void * getMBlock(void);
extern void * getMBlocks(nat n); extern void * getMBlocks(nat n);
extern void freeAllMBlocks(void);
#if osf3_HOST_OS #if osf3_HOST_OS
/* ToDo: Perhaps by adjusting this value we can make linking without /* ToDo: Perhaps by adjusting this value we can make linking without
......
...@@ -266,6 +266,7 @@ void ...@@ -266,6 +266,7 @@ void
exitStorage (void) exitStorage (void)
{ {
stat_exit(calcAllocated()); stat_exit(calcAllocated());
freeAllMBlocks();
} }
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
......
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