]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/segments.hpp
io.streams.256color: faster by caching styles
[factor.git] / vm / segments.hpp
index 63fd5de3734701919dd9164e1f67b63e47f06012..81c8d71beb5a4eed8cbf8e2034e982087e727bb5 100644 (file)
@@ -2,25 +2,42 @@ 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;
   cell end;
 
-  explicit segment(cell size, bool executable_p);
+  segment(cell size, bool executable_p);
   ~segment();
 
   bool underflow_p(cell addr) {
-    return (addr >= start - getpagesize() && addr < start);
+    return addr >= (start - getpagesize()) && addr < start;
   }
 
   bool overflow_p(cell addr) {
-    return (addr >= end && addr < end + getpagesize());
+    return addr >= end && addr < (end + getpagesize());
+  }
+
+  bool in_segment_p(cell addr) {
+    return addr >= start && addr < end;
   }
 
-  bool in_segment_p(cell addr) { return (addr >= start && addr < end); }
+  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);
+    }
+  }
 };
 
 }