Allow "INLINEABLE" as a synonym
[ghc-hetmet.git] / rts / posix / OSMem.c
index 0a37256..9993da3 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "Rts.h"
 
+#include "RtsUtils.h"
 #include "sm/OSMem.h"
 
 #ifdef HAVE_UNISTD_H
@@ -121,8 +122,8 @@ my_mmap (void *addr, lnat size)
            (errno == EINVAL && sizeof(void*)==4 && size >= 0xc0000000)) {
            // If we request more than 3Gig, then we get EINVAL
            // instead of ENOMEM (at least on Linux).
-           errorBelch("out of memory (requested %lu bytes)", size);
-           stg_exit(EXIT_FAILURE);
+            errorBelch("out of memory (requested %lu bytes)", size);
+            stg_exit(EXIT_FAILURE);
        } else {
            barf("getMBlock: mmap: %s", strerror(errno));
        }
@@ -148,10 +149,10 @@ gen_map_mblocks (lnat size)
     // unmap the slop bits around the chunk we allocated
     slop = (W_)ret & MBLOCK_MASK;
     
-    if (munmap(ret, MBLOCK_SIZE - slop) == -1) {
+    if (munmap((void*)ret, MBLOCK_SIZE - slop) == -1) {
       barf("gen_map_mblocks: munmap failed");
     }
-    if (slop > 0 && munmap(ret+size-slop, slop) == -1) {
+    if (slop > 0 && munmap((void*)(ret+size-slop), slop) == -1) {
       barf("gen_map_mblocks: munmap failed");
     }
 
@@ -177,7 +178,7 @@ osGetMBlocks(nat n)
 {
   caddr_t ret;
   lnat size = MBLOCK_SIZE * (lnat)n;
+
   if (next_request == 0) {
       // use gen_map_mblocks the first time.
       ret = gen_map_mblocks(size);
@@ -198,7 +199,6 @@ osGetMBlocks(nat n)
          ret = gen_map_mblocks(size);
       }
   }
-
   // 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;
@@ -206,9 +206,20 @@ osGetMBlocks(nat n)
   return ret;
 }
 
+void osFreeMBlocks(char *addr, nat n)
+{
+    munmap(addr, n * MBLOCK_SIZE);
+}
+
 void osFreeAllMBlocks(void)
 {
-    /* XXX Do something here (bug #711) */
+    void *mblock;
+
+    for (mblock = getFirstMBlock();
+         mblock != NULL;
+         mblock = getNextMBlock(mblock)) {
+        munmap(mblock, MBLOCK_SIZE);
+    }
 }
 
 lnat getPageSize (void)