#include "platform.hpp"
#include "utilities.hpp"
#include "primitives.hpp"
+#include "errors.hpp"
#include "segments.hpp"
#include "gc_info.hpp"
-#include "errors.hpp"
#include "contexts.hpp"
#include "run.hpp"
#include "objects.hpp"
set_border_locked(true);
}
-void segment::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);
- }
-}
-
segment::~segment() {
int pagesize = getpagesize();
int retval = munmap((void*)(start - pagesize), pagesize + size + pagesize);
set_border_locked(true);
}
-void segment::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);
- }
-}
-
segment::~segment() {
SYSTEM_INFO si;
GetSystemInfo(&si);
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 */
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);
+ }
+ }
};
}