< prev index next >

src/hotspot/share/runtime/interfaceSupport.hpp

Print this page
rev 47413 : Introduce SafepointMechanism
rev 47415 : Add Thread Local handshakes and thread local polling

*** 28,38 **** #include "gc/shared/gcLocker.hpp" #include "runtime/handles.inline.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/orderAccess.hpp" #include "runtime/os.hpp" ! #include "runtime/safepoint.hpp" #include "runtime/thread.inline.hpp" #include "runtime/vmThread.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/macros.hpp" #include "utilities/preserveException.hpp" --- 28,38 ---- #include "gc/shared/gcLocker.hpp" #include "runtime/handles.inline.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/orderAccess.hpp" #include "runtime/os.hpp" ! #include "runtime/safepointMechanism.inline.hpp" #include "runtime/thread.inline.hpp" #include "runtime/vmThread.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/macros.hpp" #include "utilities/preserveException.hpp"
*** 140,152 **** // Change to transition state thread->set_thread_state((JavaThreadState)(from + 1)); InterfaceSupport::serialize_thread_state(thread); ! if (SafepointSynchronize::do_call_back()) { ! SafepointSynchronize::block(thread); ! } thread->set_thread_state(to); CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();) } --- 140,150 ---- // Change to transition state thread->set_thread_state((JavaThreadState)(from + 1)); InterfaceSupport::serialize_thread_state(thread); ! SafepointMechanism::block_if_requested(thread); thread->set_thread_state(to); CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();) }
*** 162,174 **** // Change to transition state thread->set_thread_state((JavaThreadState)(from + 1)); InterfaceSupport::serialize_thread_state_with_handler(thread); ! if (SafepointSynchronize::do_call_back()) { ! SafepointSynchronize::block(thread); ! } thread->set_thread_state(to); CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();) } --- 160,170 ---- // Change to transition state thread->set_thread_state((JavaThreadState)(from + 1)); InterfaceSupport::serialize_thread_state_with_handler(thread); ! SafepointMechanism::block_if_requested(thread); thread->set_thread_state(to); CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();) }
*** 189,199 **** InterfaceSupport::serialize_thread_state_with_handler(thread); // We never install asynchronous exceptions when coming (back) in // to the runtime from native code because the runtime is not set // up to handle exceptions floating around at arbitrary points. ! if (SafepointSynchronize::do_call_back() || thread->is_suspend_after_native()) { JavaThread::check_safepoint_and_suspend_for_native_trans(thread); // Clear unhandled oops anywhere where we could block, even if we don't. CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();) } --- 185,195 ---- InterfaceSupport::serialize_thread_state_with_handler(thread); // We never install asynchronous exceptions when coming (back) in // to the runtime from native code because the runtime is not set // up to handle exceptions floating around at arbitrary points. ! if (SafepointMechanism::poll(thread) || thread->is_suspend_after_native()) { JavaThread::check_safepoint_and_suspend_for_native_trans(thread); // Clear unhandled oops anywhere where we could block, even if we don't. CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();) }
*** 205,214 **** --- 201,242 ---- void trans_from_java(JavaThreadState to) { transition_from_java(_thread, to); } void trans_from_native(JavaThreadState to) { transition_from_native(_thread, to); } void trans_and_fence(JavaThreadState from, JavaThreadState to) { transition_and_fence(_thread, from, to); } }; + class ThreadInVMForHandshake : public ThreadStateTransition { + const JavaThreadState _original_state; + + void transition_back() { + // This can be invoked from transition states and must return to the original state properly + assert(_thread->thread_state() == _thread_in_vm, "should only call when leaving VM after handshake"); + _thread->set_thread_state(_thread_in_vm_trans); + + InterfaceSupport::serialize_thread_state(_thread); + + SafepointMechanism::block_if_requested(_thread); + + _thread->set_thread_state(_original_state); + } + + public: + + ThreadInVMForHandshake(JavaThread* thread) : ThreadStateTransition(thread), + _original_state(thread->thread_state()) { + + if (thread->has_last_Java_frame()) { + thread->frame_anchor()->make_walkable(thread); + } + + thread->set_thread_state(_thread_in_vm); + } + + ~ThreadInVMForHandshake() { + transition_back(); + } + + }; class ThreadInVMfromJava : public ThreadStateTransition { public: ThreadInVMfromJava(JavaThread* thread) : ThreadStateTransition(thread) { trans_from_java(_thread_in_vm);
< prev index next >