]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/segments.hpp
audio.engine.test: cleanup using
[factor.git] / vm / segments.hpp
index 6ff21709746673aaf9d45c3fd36ea3d1bf61f40b..81c8d71beb5a4eed8cbf8e2034e982087e727bb5 100644 (file)
@@ -1,20 +1,43 @@
-namespace factor
-{
+namespace factor {
 
-inline cell align_page(cell a)
-{
-       return align(a,getpagesize());
-}
+inline cell align_page(cell a) { return align(a, getpagesize()); }
+
+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 */
+// 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;
+  cell start;
+  cell size;
+  cell end;
+
+  segment(cell size, bool executable_p);
+  ~segment();
+
+  bool underflow_p(cell addr) {
+    return addr >= (start - getpagesize()) && addr < start;
+  }
+
+  bool overflow_p(cell addr) {
+    return addr >= end && addr < (end + getpagesize());
+  }
+
+  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);
+    }
 
-       explicit segment(cell size);
-       ~segment();
+    cell hi = end;
+    if (!set_memory_locked(hi, pagesize, locked)) {
+      fatal_error("Cannot (un)protect high guard page", hi);
+    }
+  }
 };
 
 }