--- old/src/hotspot/share/runtime/safepointMechanism.cpp 2017-10-11 15:25:42.032607039 +0200 +++ new/src/hotspot/share/runtime/safepointMechanism.cpp 2017-10-11 15:25:41.789596604 +0200 @@ -26,17 +26,46 @@ #include "logging/log.hpp" #include "runtime/globals.hpp" #include "runtime/os.hpp" -#include "runtime/safepointMechanism.hpp" +#include "runtime/safepointMechanism.inline.hpp" #include "utilities/globalDefinitions.hpp" +SafepointMechanism::PollingType SafepointMechanism::_polling_type = SafepointMechanism::_global_page_poll; +void* SafepointMechanism::_poll_armed_value; +void* SafepointMechanism::_poll_disarmed_value; + void SafepointMechanism::default_initialize() { - const size_t page_size = os::vm_page_size(); - char* polling_page = os::reserve_memory(page_size, NULL, page_size); - os::commit_memory_or_exit(polling_page, page_size, false, "Unable to commit Safepoint polling page"); - bool res = os::protect_memory(polling_page, page_size, os::MEM_PROT_READ); + if (ThreadLocalHandshakes) { + set_uses_thread_local_poll(); + const size_t page_size = os::vm_page_size(); + const size_t allocation_size = 2 * page_size; + char* polling_page = os::reserve_memory(allocation_size, NULL, page_size); + os::commit_memory_or_exit(polling_page, allocation_size, false, "Unable to commit Safepoint polling page"); + + char* bad_page = polling_page; + char* good_page = polling_page + page_size; + + os::protect_memory(bad_page, page_size, os::MEM_PROT_NONE); + os::protect_memory(good_page, page_size, os::MEM_PROT_READ); + + log_info(os)("SafePoint Polling address, bad (protected) page:" INTPTR_FORMAT ", good (unprotected) page:" INTPTR_FORMAT, p2i(bad_page), p2i(good_page)); + os::set_polling_page((address)(bad_page)); + + intptr_t poll_page_val = reinterpret_cast(bad_page); + _poll_armed_value = reinterpret_cast(poll_page_val | poll_bit()); + _poll_disarmed_value = good_page; + } else { + const size_t page_size = os::vm_page_size(); + char* polling_page = os::reserve_memory(page_size, NULL, page_size); + os::commit_memory_or_exit(polling_page, page_size, false, "Unable to commit Safepoint polling page"); + os::protect_memory(polling_page, page_size, os::MEM_PROT_READ); + + log_info(os)("SafePoint Polling address: " INTPTR_FORMAT, p2i(polling_page)); + os::set_polling_page((address)(polling_page)); + } +} - log_info(os)("SafePoint Polling address: " INTPTR_FORMAT, p2i(polling_page)); - os::set_polling_page((address)(polling_page)); +void SafepointMechanism::initialize_header(JavaThread* thread) { + disarm_local_poll(thread); } void SafepointMechanism::initialize_serialize_page() {