X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FOSMem.c;h=5d46e68d23004e7603fa815a6d02be8045e7722a;hb=6cf8982ac30be6836a0cdd8be5a6ac1a1a144213;hp=9b71d1c7dbb42f90e56e4fcb11c17661c38db52d;hpb=8425c809cc6ba7346b57fb58920ff424533059f2;p=ghc-hetmet.git diff --git a/rts/posix/OSMem.c b/rts/posix/OSMem.c index 9b71d1c..5d46e68 100644 --- a/rts/posix/OSMem.c +++ b/rts/posix/OSMem.c @@ -6,12 +6,13 @@ * * ---------------------------------------------------------------------------*/ -/* This is non-posix compliant. */ -/* #include "PosixSource.h" */ +// This is non-posix compliant. +// #include "PosixSource.h" #include "Rts.h" -#include "OSMem.h" -#include "RtsFlags.h" + +#include "RtsUtils.h" +#include "sm/OSMem.h" #ifdef HAVE_UNISTD_H #include @@ -25,6 +26,9 @@ #ifdef HAVE_STRING_H #include #endif +#ifdef HAVE_FCNTL_H +#include +#endif #include @@ -33,7 +37,16 @@ #include #endif +/* keep track of maps returned by my_mmap */ +typedef struct _map_rec { + char* base; /* base addr */ + int size; /* map size */ + struct _map_rec* next; /* next pointer */ +} map_rec; + + static caddr_t next_request = 0; +static map_rec* mmap_rec = NULL; void osMemInit(void) { @@ -109,8 +122,8 @@ my_mmap (void *addr, lnat size) vm_protect(mach_task_self(),(vm_address_t)ret,size,FALSE,VM_PROT_READ|VM_PROT_WRITE); } #else - ret = mmap(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_ANON | MAP_PRIVATE, -1, 0); + ret = mmap(addr, size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE, -1, 0); #endif if (ret == (void *)-1) { @@ -135,7 +148,7 @@ static void * gen_map_mblocks (lnat size) { int slop; - void *ret; + StgWord8 *ret; // Try to map a larger block, and take the aligned portion from // it (unmap the rest). @@ -173,8 +186,9 @@ void * osGetMBlocks(nat n) { caddr_t ret; - lnat size = MBLOCK_SIZE * n; - + lnat size = MBLOCK_SIZE * (lnat)n; + map_rec* rec; + if (next_request == 0) { // use gen_map_mblocks the first time. ret = gen_map_mblocks(size); @@ -195,7 +209,11 @@ osGetMBlocks(nat n) ret = gen_map_mblocks(size); } } - + rec = (map_rec*)stgMallocBytes(sizeof(map_rec),"OSMem: osGetMBlocks"); + rec->size = size; + rec->base = ret; + rec->next = mmap_rec; + mmap_rec = rec; // Next time, we'll try to allocate right after the block we just got. // ToDo: check that we haven't already grabbed the memory at next_request next_request = ret + size; @@ -205,7 +223,17 @@ osGetMBlocks(nat n) void osFreeAllMBlocks(void) { - /* XXX Do something here (bug #711) */ + map_rec* tmp = mmap_rec; + map_rec* next = NULL; + + for(; tmp!=NULL;) { + if(munmap(tmp->base,tmp->size)) + barf("osFreeAllMBlocks: munmap failed!"); + + next = tmp->next; + stgFree(tmp); + tmp = next; + } } lnat getPageSize (void) @@ -234,6 +262,6 @@ void setExecutable (void *p, lnat len, rtsBool exec) StgWord size = startOfLastPage - startOfFirstPage + pageSize; if (mprotect((void*)startOfFirstPage, (size_t)size, (exec ? PROT_EXEC : 0) | PROT_READ | PROT_WRITE) != 0) { - barf("makeExecutable: failed to protect 0x%p\n", p); + barf("setExecutable: failed to protect 0x%p\n", p); } }