]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/segments.hpp
alien.c-types: not necessary to import `short` differently anymore
[factor.git] / vm / segments.hpp
index b136d9cd5e346830fc43bf628424161d9d143ef7..81c8d71beb5a4eed8cbf8e2034e982087e727bb5 100644 (file)
@@ -2,8 +2,10 @@ namespace factor {
 
 inline cell align_page(cell a) { return align(a, getpagesize()); }
 
-/* segments set up guard pages to check for under/overflow.
-size must be a multiple of the page size */
+bool set_memory_locked(cell base, cell size, bool locked);
+
+// segments set up guard pages to check for under/overflow.
+// size must be a multiple of the page size
 struct segment {
   cell start;
   cell size;
@@ -24,7 +26,18 @@ struct segment {
     return addr >= start && addr < end;
   }
 
-  void set_border_locked(bool locked);
+  void set_border_locked(bool locked) {
+    int pagesize = getpagesize();
+    cell lo = start - pagesize;
+    if (!set_memory_locked(lo, pagesize, locked)) {
+      fatal_error("Cannot (un)protect low guard page", lo);
+    }
+
+    cell hi = end;
+    if (!set_memory_locked(hi, pagesize, locked)) {
+      fatal_error("Cannot (un)protect high guard page", hi);
+    }
+  }
 };
 
 }