< prev index next >

src/hotspot/os/bsd/os_bsd.cpp

Print this page

        

*** 1905,1920 **** // 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__ // 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; } #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; --- 1905,1924 ---- // 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; ! #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,2007 **** 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__ // 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; #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 --- 1997,2022 ---- 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, 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,2035 **** } // 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); } // 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) { char * addr; int flags; flags = MAP_PRIVATE | MAP_NORESERVE | MAP_ANONYMOUS; if (fixed) { assert((uintptr_t)requested_addr % os::Bsd::page_size() == 0, "unaligned address"); flags |= MAP_FIXED; } --- 2027,2056 ---- } // 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, !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, 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,2056 **** 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)); } bool os::pd_release_memory(char* addr, size_t size) { return anon_munmap(addr, size); } --- 2066,2078 ---- 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, ! 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,2166 **** // 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); if (addr == requested_addr) { return requested_addr; } if (addr != NULL) { --- 2178,2188 ---- // 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/*fixed*/, false/*executable*/); if (addr == requested_addr) { return requested_addr; } if (addr != NULL) {
< prev index next >