*
* ---------------------------------------------------------------------------*/
-/* 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 <unistd.h>
#ifdef HAVE_STRING_H
#include <string.h>
#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
#include <errno.h>
#include <mach/vm_map.h>
#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)
{
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) {
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).
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);
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;
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)
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);
}
}