]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: new function set_memory_locked(true/false)
authorBjörn Lindqvist <bjourne@gmail.com>
Mon, 24 Aug 2015 06:47:36 +0000 (08:47 +0200)
committerJohn Benediktsson <mrjbq7@gmail.com>
Mon, 24 Aug 2015 14:23:40 +0000 (07:23 -0700)
it wraps the mprotect/VirtualProtect platform differences and makes it
so you can unify some windows/unix code path forks

vm/code_blocks.cpp
vm/code_heap.cpp
vm/code_heap.hpp
vm/factor.hpp
vm/os-unix.cpp
vm/os-windows.cpp

index 9ebc46bcc81ba2ff5e4632af4a489d21fe53b31f..ee594635682fbbe7fbd71e2f3bf57c800e2c6318 100644 (file)
@@ -212,7 +212,7 @@ cell factor_vm::lookup_external_address(relocation_type rel_type,
     case RT_INLINE_CACHE_MISS:
       return (cell)&factor::inline_cache_miss;
     case RT_SAFEPOINT:
-      return (cell)code->safepoint_page;
+      return code->safepoint_page;
     default:
       return -1;
   }
index 20afd023d460346cd96c315362a811e500cdf49a..3dd4683bbe188464aab914f36900abf4b5d2f348 100644 (file)
@@ -14,7 +14,7 @@ code_heap::code_heap(cell size) {
   allocator = new free_list_allocator<code_block>(seg->end - start, start);
 
   /* See os-windows-x86.64.cpp for seh_area usage */
-  safepoint_page = (void*)seg->start;
+  safepoint_page = seg->start;
   seh_area = (char*)seg->start + getpagesize();
 }
 
index bf1237f81874e071da26fd1828d2e4eb83c04070..dc7484099004e6bc355c9b22088168cc63d0291c 100644 (file)
@@ -11,7 +11,7 @@ struct code_heap {
   segment* seg;
 
   /* Memory area reserved for safepoint guard page */
-  void* safepoint_page;
+  cell safepoint_page;
 
   /* Memory area reserved for SEH. Only used on Windows */
   char* seh_area;
@@ -51,7 +51,7 @@ struct code_heap {
 
   bool safepoint_p(cell addr) {
     cell page_mask = ~(getpagesize() - 1);
-    return (addr & page_mask) == (cell)safepoint_page;
+    return (addr & page_mask) == safepoint_page;
   }
 };
 
index 5c60258a01aaa8e4dbe5dd0d773d72387280e7ba..a370d1e3ba27daf6f176032d70456674a650ed92 100644 (file)
@@ -13,4 +13,6 @@ void unlock_console();
 void ignore_ctrl_c();
 void handle_ctrl_c();
 
+bool set_memory_locked(cell base, cell size, bool locked);
+
 }
index e1d443948569623a405a4238d6e857be695d8a6d..6d4a04a7a6c5131a2ddd1ed1dfe2dc3a75590728 100644 (file)
@@ -2,6 +2,12 @@
 
 namespace factor {
 
+bool set_memory_locked(cell base, cell size, bool locked) {
+  int prot = locked ? PROT_NONE : PROT_READ | PROT_WRITE;
+  int status = mprotect((char*)base, size, prot);
+  return status != -1;
+}
+
 THREADHANDLE start_thread(void* (*start_routine)(void*), void* args) {
   pthread_attr_t attr;
   pthread_t thread;
@@ -98,19 +104,17 @@ segment::segment(cell size_, bool executable_p) {
 }
 
 void segment::set_border_locked(bool locked) {
-  int prot = locked ? PROT_NONE : PROT_READ | PROT_WRITE;
   int pagesize = getpagesize();
-
   cell lo = start - pagesize;
-  if (mprotect((char*)lo, pagesize, prot) == -1) {
+  if (!set_memory_locked(lo, pagesize, locked)) {
     check_ENOMEM("mprotect low");
     fatal_error("Cannot (un)protect low guard page", lo);
   }
 
   cell hi = end;
-  if (mprotect((char*)hi, pagesize, prot) == -1) {
+  if (!set_memory_locked(hi, pagesize, locked)) {
     check_ENOMEM("mprotect high");
-    fatal_error("Cannot protect high guard page", lo);
+    fatal_error("Cannot (un)protect high guard page", hi);
   }
 }
 
@@ -122,13 +126,13 @@ segment::~segment() {
 }
 
 void code_heap::guard_safepoint() {
-  if (mprotect(safepoint_page, getpagesize(), PROT_NONE) == -1)
-    fatal_error("Cannot protect safepoint guard page", (cell)safepoint_page);
+  if (!set_memory_locked(safepoint_page, getpagesize(), true))
+    fatal_error("Cannot protect safepoint guard page", safepoint_page);
 }
 
 void code_heap::unguard_safepoint() {
-  if (mprotect(safepoint_page, getpagesize(), PROT_WRITE) == -1)
-    fatal_error("Cannot unprotect safepoint guard page", (cell)safepoint_page);
+  if (!set_memory_locked(safepoint_page, getpagesize(), false))
+    fatal_error("Cannot unprotect safepoint guard page", safepoint_page);
 }
 
 void factor_vm::dispatch_signal(void* uap, void(handler)()) {
index 343acbe2723d2ba00af78a71bd90f0cb6a3a5d22..586849e0a50765983989a2ed70deb3ba9ad27279 100644 (file)
@@ -4,6 +4,13 @@ namespace factor {
 
 HMODULE hFactorDll;
 
+bool set_memory_locked(cell base, cell size, bool locked) {
+  int prot = locked ? PAGE_NOACCESS : PAGE_READWRITE;
+  DWORD ignore;
+  int status = VirtualProtect((char*)base, size, prot, &ignore);
+  return status != 0;
+}
+
 void factor_vm::init_ffi() {
   hFactorDll = GetModuleHandle(NULL);
   if (!hFactorDll)
@@ -101,18 +108,15 @@ segment::segment(cell size_, bool executable_p) {
 }
 
 void segment::set_border_locked(bool locked) {
-  int prot = locked ? PAGE_NOACCESS : PAGE_READWRITE;
   int pagesize = getpagesize();
-  DWORD ignore;
-
   cell lo = start - pagesize;
-  if (!VirtualProtect((char*)lo, pagesize, prot, &ignore)) {
+  if (!set_memory_locked(lo, pagesize, locked)) {
     fatal_error("Cannot (un)protect low guard page", lo);
   }
 
   cell hi = end;
-  if (!VirtualProtect((char*)hi, pagesize, prot, &ignore)) {
-    fatal_error("Cannot (un)protect high guard page", lo);
+  if (!set_memory_locked(hi, pagesize, locked)) {
+    fatal_error("Cannot (un)protect high guard page", hi);
   }
 }
 
@@ -134,15 +138,13 @@ long getpagesize() {
 }
 
 void code_heap::guard_safepoint() {
-  DWORD ignore;
-  if (!VirtualProtect(safepoint_page, getpagesize(), PAGE_NOACCESS, &ignore))
-    fatal_error("Cannot protect safepoint guard page", (cell)safepoint_page);
+  if (!set_memory_locked(safepoint_page, getpagesize(), true))
+    fatal_error("Cannot protect safepoint guard page", safepoint_page);
 }
 
 void code_heap::unguard_safepoint() {
-  DWORD ignore;
-  if (!VirtualProtect(safepoint_page, getpagesize(), PAGE_READWRITE, &ignore))
-    fatal_error("Cannot unprotect safepoint guard page", (cell)safepoint_page);
+  if (!set_memory_locked(safepoint_page, getpagesize(), false))
+    fatal_error("Cannot unprotect safepoint guard page", safepoint_page);
 }
 
 void factor_vm::move_file(const vm_char* path1, const vm_char* path2) {