< prev index next >

src/hotspot/share/runtime/safepointMechanism.cpp

Print this page
rev 47414 : Move polling page allocation to SafepointMechanism initialization
rev 47415 : Add Thread Local handshakes and thread local polling

*** 24,44 **** #include "precompiled.hpp" #include "logging/log.hpp" #include "runtime/globals.hpp" #include "runtime/os.hpp" ! #include "runtime/safepointMechanism.hpp" #include "utilities/globalDefinitions.hpp" 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); log_info(os)("SafePoint Polling address: " INTPTR_FORMAT, p2i(polling_page)); os::set_polling_page((address)(polling_page)); } void SafepointMechanism::initialize_serialize_page() { if (!UseMembar) { const size_t page_size = os::vm_page_size(); --- 24,73 ---- #include "precompiled.hpp" #include "logging/log.hpp" #include "runtime/globals.hpp" #include "runtime/os.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() { + 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<intptr_t>(bad_page); + _poll_armed_value = reinterpret_cast<void*>(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)); + } + } + + void SafepointMechanism::initialize_header(JavaThread* thread) { + disarm_local_poll(thread); } void SafepointMechanism::initialize_serialize_page() { if (!UseMembar) { const size_t page_size = os::vm_page_size();
< prev index next >