--- old/src/hotspot/share/prims/jvmtiEventController.cpp 2020-08-26 23:27:57.014900734 +0900 +++ new/src/hotspot/share/prims/jvmtiEventController.cpp 2020-08-26 23:27:56.932898509 +0900 @@ -331,10 +331,13 @@ EC_TRACE(("[%s] # Entering interpreter only mode", JvmtiTrace::safe_get_thread_name(state->get_thread()))); EnterInterpOnlyModeClosure hs; - if (SafepointSynchronize::is_at_safepoint()) { - hs.do_thread(state->get_thread()); + assert(state->get_thread()->is_Java_thread(), "just checking"); + JavaThread *target = (JavaThread *)state->get_thread(); + Thread *current = Thread::current(); + if ((target == current) || (target->active_handshaker() == current)) { + hs.do_thread(target); } else { - Handshake::execute_direct(&hs, state->get_thread()); + Handshake::execute_direct(&hs, target); } } @@ -980,21 +983,21 @@ void JvmtiEventController::set_frame_pop(JvmtiEnvThreadState *ets, JvmtiFramePop fpop) { - MutexLocker mu(SafepointSynchronize::is_at_safepoint() ? NULL : JvmtiThreadState_lock); + assert(SafepointSynchronize::is_at_safepoint() || JvmtiThreadState_lock->is_locked(), "Safepoint or must be locked"); JvmtiEventControllerPrivate::set_frame_pop(ets, fpop); } void JvmtiEventController::clear_frame_pop(JvmtiEnvThreadState *ets, JvmtiFramePop fpop) { - MutexLocker mu(SafepointSynchronize::is_at_safepoint() ? NULL : JvmtiThreadState_lock); + assert(SafepointSynchronize::is_at_safepoint() || JvmtiThreadState_lock->is_locked(), "Safepoint or must be locked"); JvmtiEventControllerPrivate::clear_frame_pop(ets, fpop); } void JvmtiEventController::clear_to_frame_pop(JvmtiEnvThreadState *ets, JvmtiFramePop fpop) { - MutexLocker mu(SafepointSynchronize::is_at_safepoint() ? NULL : JvmtiThreadState_lock); + assert(SafepointSynchronize::is_at_safepoint() || JvmtiThreadState_lock->is_locked(), "Safepoint or must be locked"); JvmtiEventControllerPrivate::clear_to_frame_pop(ets, fpop); }