11/*
2- * Copyright (c) 2003, 2025 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2003, 2026 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * This code is free software; you can redistribute it and/or modify it
@@ -217,6 +217,10 @@ class EnterInterpOnlyModeClosure : public HandshakeClosure {
217217
218218 assert (state != nullptr , " sanity check" );
219219 assert (state->get_thread () == jt, " handshake unsafe conditions" );
220+ assert (jt->jvmti_thread_state () == state, " sanity check" );
221+ assert (!jt->is_interp_only_mode (), " sanity check" );
222+ assert (!state->is_interp_only_mode (), " sanity check" );
223+
220224 if (!state->is_pending_interp_only_mode ()) {
221225 _completed = true ;
222226 return ; // The pending flag has been already cleared, so bail out.
@@ -361,7 +365,8 @@ void VM_ChangeSingleStep::doit() {
361365
362366void JvmtiEventControllerPrivate::enter_interp_only_mode (JvmtiThreadState *state) {
363367 EC_TRACE ((" [%s] # Entering interpreter only mode" ,
364- JvmtiTrace::safe_get_thread_name (state->get_thread_or_saved ())));
368+ JvmtiTrace::safe_get_thread_name (state->get_thread ())));
369+
365370 JavaThread *target = state->get_thread ();
366371 Thread *current = Thread::current ();
367372
@@ -371,8 +376,13 @@ void JvmtiEventControllerPrivate::enter_interp_only_mode(JvmtiThreadState *state
371376 }
372377 // This flag will be cleared in EnterInterpOnlyModeClosure handshake.
373378 state->set_pending_interp_only_mode (true );
374- if (target == nullptr ) { // an unmounted virtual thread
375- return ; // EnterInterpOnlyModeClosure will be executed right after mount.
379+
380+ // There are two cases when entering interp_only_mode is postponed:
381+ // 1. Unmounted virtual thread - EnterInterpOnlyModeClosure::do_thread will be executed at mount;
382+ // 2. Carrier thread with mounted virtual thread - EnterInterpOnlyModeClosure::do_thread will be executed at unmount.
383+ if (target == nullptr || // an unmounted virtual thread
384+ JvmtiEnvBase::is_thread_carrying_vthread (target, state->get_thread_oop ())) { // a vthread carrying thread
385+ return ; // EnterInterpOnlyModeClosure will be executed right after mount or unmount.
376386 }
377387 EnterInterpOnlyModeClosure hs (state);
378388 if (target->is_handshake_safe_for (current)) {
@@ -388,7 +398,8 @@ void JvmtiEventControllerPrivate::enter_interp_only_mode(JvmtiThreadState *state
388398void
389399JvmtiEventControllerPrivate::leave_interp_only_mode (JvmtiThreadState *state) {
390400 EC_TRACE ((" [%s] # Leaving interpreter only mode" ,
391- JvmtiTrace::safe_get_thread_name (state->get_thread_or_saved ())));
401+ JvmtiTrace::safe_get_thread_name (state->get_thread ())));
402+
392403 if (state->is_pending_interp_only_mode ()) {
393404 state->set_pending_interp_only_mode (false ); // Just clear the pending flag.
394405 assert (!state->is_interp_only_mode (), " sanity check" );
@@ -409,7 +420,7 @@ JvmtiEventControllerPrivate::trace_changed(JvmtiThreadState *state, jlong now_en
409420 if (changed & bit) {
410421 // it changed, print it
411422 log_trace (jvmti)(" [%s] # %s event %s" ,
412- JvmtiTrace::safe_get_thread_name (state->get_thread_or_saved ()),
423+ JvmtiTrace::safe_get_thread_name (state->get_thread ()),
413424 (now_enabled & bit)? " Enabling" : " Disabling" , JvmtiTrace::event_name ((jvmtiEvent)ei));
414425 }
415426 }
@@ -932,7 +943,7 @@ JvmtiEventControllerPrivate::set_user_enabled(JvmtiEnvBase *env, JavaThread *thr
932943void
933944JvmtiEventControllerPrivate::set_frame_pop (JvmtiEnvThreadState *ets, JvmtiFramePop fpop) {
934945 EC_TRACE ((" [%s] # set frame pop - frame=%d" ,
935- JvmtiTrace::safe_get_thread_name (ets->get_thread_or_saved ()),
946+ JvmtiTrace::safe_get_thread_name (ets->get_thread ()),
936947 fpop.frame_number () ));
937948
938949 ets->get_frame_pops ()->set (fpop);
@@ -943,7 +954,7 @@ JvmtiEventControllerPrivate::set_frame_pop(JvmtiEnvThreadState *ets, JvmtiFrameP
943954void
944955JvmtiEventControllerPrivate::clear_frame_pop (JvmtiEnvThreadState *ets, JvmtiFramePop fpop) {
945956 EC_TRACE ((" [%s] # clear frame pop - frame=%d" ,
946- JvmtiTrace::safe_get_thread_name (ets->get_thread_or_saved ()),
957+ JvmtiTrace::safe_get_thread_name (ets->get_thread ()),
947958 fpop.frame_number () ));
948959
949960 ets->get_frame_pops ()->clear (fpop);
@@ -953,7 +964,7 @@ JvmtiEventControllerPrivate::clear_frame_pop(JvmtiEnvThreadState *ets, JvmtiFram
953964void
954965JvmtiEventControllerPrivate::clear_all_frame_pops (JvmtiEnvThreadState *ets) {
955966 EC_TRACE ((" [%s] # clear all frame pops" ,
956- JvmtiTrace::safe_get_thread_name (ets->get_thread_or_saved ())
967+ JvmtiTrace::safe_get_thread_name (ets->get_thread ())
957968 ));
958969
959970 ets->get_frame_pops ()->clear_all ();
@@ -965,7 +976,7 @@ JvmtiEventControllerPrivate::clear_to_frame_pop(JvmtiEnvThreadState *ets, JvmtiF
965976 int cleared_cnt = ets->get_frame_pops ()->clear_to (fpop);
966977
967978 EC_TRACE ((" [%s] # clear to frame pop - frame=%d, count=%d" ,
968- JvmtiTrace::safe_get_thread_name (ets->get_thread_or_saved ()),
979+ JvmtiTrace::safe_get_thread_name (ets->get_thread ()),
969980 fpop.frame_number (),
970981 cleared_cnt ));
971982
0 commit comments