< prev index next >

src/share/vm/runtime/interfaceSupport.hpp

Print this page
rev 13142 : 8183198: Factor out thread state serialization into a proper helper function
Reviewed-by:

*** 88,101 **** static void verify_stack(); static void verify_last_frame(); # endif public: ! // OS dependent stuff ! #include OS_HEADER(interfaceSupport) }; // Basic class for all thread transition classes. --- 88,123 ---- static void verify_stack(); static void verify_last_frame(); # endif public: ! static void serialize_thread_state_with_handler(JavaThread* thread) { ! serialize_thread_state_internal(thread, true); ! } ! // Should only call this if we know that we have a proper SEH set up. ! static void serialize_thread_state(JavaThread* thread) { ! serialize_thread_state_internal(thread, false); ! } + private: + static void serialize_thread_state_internal(JavaThread* thread, bool needs_exception_handler) { + // Make sure new state is seen by VM thread + if (os::is_MP()) { + if (UseMembar) { + // Force a fence between the write above and read below + OrderAccess::fence(); + } else { + // store to serialize page so VM thread can do pseudo remote membar + if (needs_exception_handler) { + os::write_memory_serialize_page_with_handler(thread); + } else { + os::write_memory_serialize_page(thread); + } + } + } + } }; // Basic class for all thread transition classes.
*** 116,135 **** assert((from & 1) == 0 && (to & 1) == 0, "odd numbers are transitions states"); assert(thread->thread_state() == from, "coming from wrong thread state"); // Change to transition state thread->set_thread_state((JavaThreadState)(from + 1)); ! // Make sure new state is seen by VM thread ! if (os::is_MP()) { ! if (UseMembar) { ! // Force a fence between the write above and read below ! OrderAccess::fence(); ! } else { ! // store to serialize page so VM thread can do pseudo remote membar ! os::write_memory_serialize_page(thread); ! } ! } if (SafepointSynchronize::do_call_back()) { SafepointSynchronize::block(thread); } thread->set_thread_state(to); --- 138,148 ---- assert((from & 1) == 0 && (to & 1) == 0, "odd numbers are transitions states"); assert(thread->thread_state() == from, "coming from wrong thread state"); // 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);
*** 147,166 **** assert(thread->thread_state() == from, "coming from wrong thread state"); assert((from & 1) == 0 && (to & 1) == 0, "odd numbers are transitions states"); // Change to transition state thread->set_thread_state((JavaThreadState)(from + 1)); ! // Make sure new state is seen by VM thread ! if (os::is_MP()) { ! if (UseMembar) { ! // Force a fence between the write above and read below ! OrderAccess::fence(); ! } else { ! // Must use this rather than serialization page in particular on Windows ! InterfaceSupport::serialize_memory(thread); ! } ! } if (SafepointSynchronize::do_call_back()) { SafepointSynchronize::block(thread); } thread->set_thread_state(to); --- 160,170 ---- assert(thread->thread_state() == from, "coming from wrong thread state"); assert((from & 1) == 0 && (to & 1) == 0, "odd numbers are transitions states"); // 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);
*** 180,199 **** assert((to & 1) == 0, "odd numbers are transitions states"); assert(thread->thread_state() == _thread_in_native, "coming from wrong thread state"); // Change to transition state thread->set_thread_state(_thread_in_native_trans); ! // Make sure new state is seen by GC thread ! if (os::is_MP()) { ! if (UseMembar) { ! // Force a fence between the write above and read below ! OrderAccess::fence(); ! } else { ! // Must use this rather than serialization page in particular on Windows ! InterfaceSupport::serialize_memory(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()) { --- 184,194 ---- assert((to & 1) == 0, "odd numbers are transitions states"); assert(thread->thread_state() == _thread_in_native, "coming from wrong thread state"); // Change to transition state thread->set_thread_state(_thread_in_native_trans); ! 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()) {
< prev index next >