< prev index next >
src/hotspot/os/bsd/os_bsd.cpp
Print this page
@@ -1905,16 +1905,20 @@
// All it does is to check if there are enough free pages
// left at the time of mmap(). This could be a potential
// problem.
bool os::pd_commit_memory(char* addr, size_t size, bool exec) {
int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE;
-#ifdef __OpenBSD__
+#if defined(__OpenBSD__)
// XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
Events::log(NULL, "Protecting memory [" INTPTR_FORMAT "," INTPTR_FORMAT "] with protection modes %x", p2i(addr), p2i(addr+size), prot);
if (::mprotect(addr, size, prot) == 0) {
return true;
}
+#elif defined(__APPLE__)
+ if (::mprotect(addr, size, prot) == 0) {
+ return true;
+ }
#else
uintptr_t res = (uintptr_t) ::mmap(addr, size, prot,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
if (res != (uintptr_t) MAP_FAILED) {
return true;
@@ -1993,15 +1997,26 @@
char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
return end;
}
-bool os::pd_uncommit_memory(char* addr, size_t size) {
-#ifdef __OpenBSD__
+bool os::pd_uncommit_memory(char* addr, size_t size, bool exec) {
+#if defined(__OpenBSD__)
// XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD
Events::log(NULL, "Protecting memory [" INTPTR_FORMAT "," INTPTR_FORMAT "] with PROT_NONE", p2i(addr), p2i(addr+size));
return ::mprotect(addr, size, PROT_NONE) == 0;
+#elif defined(__APPLE__)
+ if (exec) {
+ if (::madvise(addr, size, MADV_FREE) != 0) {
+ return false;
+ }
+ return ::mprotect(addr, size, PROT_NONE) == 0;
+ } else {
+ uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
+ MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
+ return res != (uintptr_t) MAP_FAILED;
+ }
#else
uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0);
return res != (uintptr_t) MAP_FAILED;
#endif
@@ -2012,24 +2027,30 @@
}
// If this is a growable mapping, remove the guard pages entirely by
// munmap()ping them. If not, just call uncommit_memory().
bool os::remove_stack_guard_pages(char* addr, size_t size) {
- return os::uncommit_memory(addr, size);
+ return os::uncommit_memory(addr, size, !ExecMem);
}
// If 'fixed' is true, anon_mmap() will attempt to reserve anonymous memory
// at 'requested_addr'. If there are existing memory mappings at the same
// location, however, they will be overwritten. If 'fixed' is false,
// 'requested_addr' is only treated as a hint, the return value may or
// may not start from the requested address. Unlike Bsd mmap(), this
// function returns NULL to indicate failure.
-static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed) {
+static char* anon_mmap(char* requested_addr, size_t bytes, bool fixed, bool executable) {
char * addr;
int flags;
flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS;
+#ifdef __APPLE__
+ if (executable) {
+ guarantee(!fixed, "MAP_JIT (for execute) is incompatible with MAP_FIXED");
+ flags |= MAP_JIT;
+ }
+#endif
if (fixed) {
assert((uintptr_t)requested_addr % os::Bsd::page_size() == 0, "unaligned address");
flags |= MAP_FIXED;
}
@@ -2045,12 +2066,13 @@
static int anon_munmap(char * addr, size_t size) {
return ::munmap(addr, size) == 0;
}
char* os::pd_reserve_memory(size_t bytes, char* requested_addr,
- size_t alignment_hint) {
- return anon_mmap(requested_addr, bytes, (requested_addr != NULL));
+ size_t alignment_hint,
+ bool executable) {
+ return anon_mmap(requested_addr, bytes, (requested_addr != NULL), executable);
}
bool os::pd_release_memory(char* addr, size_t size) {
return anon_munmap(addr, size);
}
@@ -2156,11 +2178,11 @@
// Repeatedly allocate blocks until the block is allocated at the
// right spot.
// Bsd mmap allows caller to pass an address as hint; give it a try first,
// if kernel honors the hint then we can return immediately.
- char * addr = anon_mmap(requested_addr, bytes, false);
+ char * addr = anon_mmap(requested_addr, bytes, false/*fixed*/, false/*executable*/);
if (addr == requested_addr) {
return requested_addr;
}
if (addr != NULL) {
< prev index next >