< prev index next >
src/hotspot/share/runtime/thread.cpp
Print this page
rev 56101 : 8227745: Enable Escape Analysis for better performance when debugging
Reviewed-by: ???
*** 1656,1666 ****
set_callee_target(NULL);
set_vm_result(NULL);
set_vm_result_2(NULL);
set_vframe_array_head(NULL);
set_vframe_array_last(NULL);
! set_deferred_locals(NULL);
set_deopt_mark(NULL);
set_deopt_compiled_method(NULL);
set_monitor_chunks(NULL);
_on_thread_list = false;
set_thread_state(_thread_new);
--- 1656,1666 ----
set_callee_target(NULL);
set_vm_result(NULL);
set_vm_result_2(NULL);
set_vframe_array_head(NULL);
set_vframe_array_last(NULL);
! reset_deferred_updates();
set_deopt_mark(NULL);
set_deopt_compiled_method(NULL);
set_monitor_chunks(NULL);
_on_thread_list = false;
set_thread_state(_thread_new);
*** 1830,1840 ****
jvmtiDeferredLocalVariableSet* dlv = deferred->at(0);
deferred->remove_at(0);
// individual jvmtiDeferredLocalVariableSet are CHeapObj's
delete dlv;
} while (deferred->length() != 0);
! delete deferred;
}
// All Java related clean up happens in exit
ThreadSafepointState::destroy(this);
if (_thread_stat != NULL) delete _thread_stat;
--- 1830,1840 ----
jvmtiDeferredLocalVariableSet* dlv = deferred->at(0);
deferred->remove_at(0);
// individual jvmtiDeferredLocalVariableSet are CHeapObj's
delete dlv;
} while (deferred->length() != 0);
! delete deferred_updates();
}
// All Java related clean up happens in exit
ThreadSafepointState::destroy(this);
if (_thread_stat != NULL) delete _thread_stat;
*** 2324,2333 ****
--- 2324,2338 ----
// so check for other async requests.
if (check_asyncs) {
check_and_handle_async_exceptions();
}
+ if (is_ea_obj_deopt_suspend()) {
+ frame_anchor()->make_walkable(this);
+ wait_for_object_deoptimization();
+ }
+
JFR_ONLY(SUSPEND_THREAD_CONDITIONAL(this);)
}
void JavaThread::send_thread_stop(oop java_throwable) {
assert(Thread::current()->is_VM_thread(), "should be in the vm thread");
*** 2517,2526 ****
--- 2522,2558 ----
if (state != _thread_in_native) {
SafepointMechanism::block_if_requested(this);
}
}
+ void JavaThread::wait_for_object_deoptimization() {
+ assert(!has_last_Java_frame() || frame_anchor()->walkable(), "should have walkable stack");
+ assert(this == Thread::current(), "invariant");
+ JavaThreadState state = thread_state();
+
+ do {
+ set_thread_state(_thread_blocked);
+ set_suspend_equivalent();
+ MonitorLocker ml(JvmtiObjReallocRelock_lock, Monitor::_no_safepoint_check_flag);
+ if (is_ea_obj_deopt_suspend()) {
+ ml.wait();
+ }
+ if (handle_special_suspend_equivalent_condition()) {
+ MutexUnlocker mu(JvmtiObjReallocRelock_lock, Monitor::_no_safepoint_check_flag);
+ java_suspend_self();
+ }
+ set_thread_state_fence(state);
+ } while (is_ea_obj_deopt_suspend());
+
+ // Since we are not using a regular thread-state transition helper here,
+ // we must manually emit the instruction barrier after leaving a safe state.
+ OrderAccess::cross_modify_fence();
+ if (state != _thread_in_native) {
+ SafepointMechanism::block_if_requested(this);
+ }
+ }
+
#ifdef ASSERT
// Verify the JavaThread has not yet been published in the Threads::list, and
// hence doesn't need protection from concurrent access at this stage.
void JavaThread::verify_not_published() {
// Cannot create a ThreadsListHandle here and check !tlh.includes(this)
*** 2546,2555 ****
--- 2578,2591 ----
thread->java_suspend_self_with_safepoint_check();
} else {
SafepointMechanism::block_if_requested(thread);
}
+ if (thread->is_ea_obj_deopt_suspend()) {
+ thread->wait_for_object_deoptimization();
+ }
+
JFR_ONLY(SUSPEND_THREAD_CONDITIONAL(thread);)
}
// Slow path when the native==>VM/Java barriers detect a safepoint is in
// progress or when _suspend_flags is non-zero.
*** 3405,3414 ****
--- 3441,3459 ----
// a scan.
cf->do_code_blob(_scanned_compiled_method);
}
}
+ #if defined(ASSERT) && COMPILER2_OR_JVMCI
+ static void deopt_objs_alot_thread_entry(JavaThread* thread, TRAPS) {
+ Deoptimization::deoptimize_objects_alot_loop();
+ }
+
+ DeoptimizeObjectsALotThread::DeoptimizeObjectsALotThread()
+ : JavaThread(&deopt_objs_alot_thread_entry) {
+ }
+ #endif // defined(ASSERT) && COMPILER2_OR_JVMCI
// ======= Threads ========
// The Threads class links together all active threads, and provides
// operations over all threads. It is protected by the Threads_lock,
< prev index next >