Return memory to the OS; trac #698
[ghc-hetmet.git] / rts / posix / OSMem.c
index f8e484f..9993da3 100644 (file)
 #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)
 {
@@ -187,7 +178,6 @@ osGetMBlocks(nat n)
 {
   caddr_t ret;
   lnat size = MBLOCK_SIZE * (lnat)n;
-  map_rec* rec;
 
   if (next_request == 0) {
       // use gen_map_mblocks the first time.
@@ -209,11 +199,6 @@ 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;
@@ -221,18 +206,19 @@ osGetMBlocks(nat n)
   return ret;
 }
 
-void osFreeAllMBlocks(void)
+void osFreeMBlocks(char *addr, nat n)
 {
-    map_rec* tmp  = mmap_rec;
-    map_rec* next = NULL;
+    munmap(addr, n * MBLOCK_SIZE);
+}
 
-    for(; tmp!=NULL;) {
-        if(munmap(tmp->base,tmp->size))
-            barf("osFreeAllMBlocks: munmap failed!");
+void osFreeAllMBlocks(void)
+{
+    void *mblock;
 
-        next = tmp->next;
-        stgFree(tmp);
-        tmp = next;
+    for (mblock = getFirstMBlock();
+         mblock != NULL;
+         mblock = getNextMBlock(mblock)) {
+        munmap(mblock, MBLOCK_SIZE);
     }
 }