--- old/src/os/windows/vm/os_windows.cpp 2015-12-21 09:39:24.674612931 -0800 +++ new/src/os/windows/vm/os_windows.cpp 2015-12-21 09:39:24.574612934 -0800 @@ -3414,6 +3414,36 @@ return os::uncommit_memory(addr, size); } +static bool protect_pages_individually(char* addr, size_t bytes, unsigned int p, DWORD *old_status) { + uint count = 0; + bool ret = false; + size_t bytes_remaining = bytes; + char * next_protect_addr = addr; + + // Use VirtualQuery() to get the chunk size. + while (bytes_remaining) { + MEMORY_BASIC_INFORMATION alloc_info; + ret = VirtualQuery(next_protect_addr, &alloc_info, sizeof(alloc_info)) != 0; + if (!ret) { + return false; + } + + size_t bytes_to_protect = MIN2(bytes_remaining, (size_t)alloc_info.RegionSize); + // We used different API at allocate_pages_individually() based on UseNUMAInterleaving, + // but we don't distinguish here as both cases are protected by same API. + ret = VirtualProtect(next_protect_addr, bytes_to_protect, p, old_status) != 0; + assert(ret, "Failed protecting chunk #%u", count); + if (!ret) { + return false; + } + + bytes_remaining -= bytes_to_protect; + next_protect_addr += bytes_to_protect; + count++; + } + return ret; +} + // Set protections specified bool os::protect_memory(char* addr, size_t bytes, ProtType prot, bool is_committed) { @@ -3441,7 +3471,18 @@ // Pages in the region become guard pages. Any attempt to access a guard page // causes the system to raise a STATUS_GUARD_PAGE exception and turn off // the guard page status. Guard pages thus act as a one-time access alarm. - return VirtualProtect(addr, bytes, p, &old_status) != 0; + bool ret = protect_pages_individually(addr, bytes, p, &old_status); +#ifdef ASSERT + if (!ret) { + int err = os::get_last_error(); + char buf[256]; + size_t buf_len = os::lasterror(buf, sizeof(buf)); + warning("INFO: os::protect_memory(" PTR_FORMAT ", " SIZE_FORMAT + ") failed; error='%s' (DOS error/errno=%d)", addr, bytes, + buf_len != 0 ? buf : "", err); + } +#endif + return ret; } bool os::guard_memory(char* addr, size_t bytes) {