[MLton] cygwoes

Mike Thomas miketh@paradigmgeo.com
Wed, 5 Oct 2005 11:34:58 +1000


Hi Matthew, Stephen and Tom.

I haven't been following this closely but a quick look at your memory
management code suggests that if you try the following function you may
get a better idea of what is causing your problem.

The function just gets the last Windows error and converts that into a
text message.  Usually those messages are extremely helpful.

You can use it in any error situation under Windows.

| SO, it certainly appears that we are passing a VirtualAlloc 
| address to VirtualFree.  Still, I was suspicious of 
| requesting a specific starting address; if I change line 1319 
| of gc.c from
|                          h->start = GC_mmapAnon 
| ((void*)address, h->size); to
|                          h->start = GC_mmapAnon ((void*)NULL, 
| h->size); (i.e., ignoring the scan of the virtual address 
| space), then the VirtualFree failure disappears and the 
| mlton-compile executable terminates normally.

===========================================================

/* example of how to use PrintError () with VirtualFree. */
if ( 0 == VirtualFree ( start, 0, MEM_RELEASE ) ) {
     PrintError ( "VirtualFree" );
}

void PrintError ( LPTSTR lpszFunction ) { 
    TCHAR szBuf[80]; 
    LPVOID lpMsgBuf;
    DWORD dw = GetLastError(); 

    FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER | 
                    FORMAT_MESSAGE_FROM_SYSTEM,
                    NULL,
                    dw,
                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                    (LPTSTR) &lpMsgBuf,
                    0, NULL );

    fprintf ( stderr, 
              "%s failed with error %d: %s", 
              lpszFunction, dw, lpMsgBuf ); 
 
    LocalFree(lpMsgBuf);
    /*ExitProcess(dw); */
}

===========================================================

Cheers

Mike Thomas.