@@ -458,6 +458,7 @@ const char* JfrEmergencyDump::chunk_path(const char* repository_path) {
458458*/
459459static void release_locks (Thread* thread) {
460460 assert (thread != nullptr , " invariant" );
461+ assert (!thread->is_Java_thread () || JavaThread::cast (thread)->thread_state () == _thread_in_vm, " invariant" );
461462
462463#ifdef ASSERT
463464 Mutex* owned_lock = thread->owned_locks ();
@@ -519,13 +520,14 @@ static void release_locks(Thread* thread) {
519520
520521class JavaThreadInVMAndNative : public StackObj {
521522 private:
522- JavaThread* const _jt;
523+ JavaThread* _jt;
523524 JavaThreadState _original_state;
524525 public:
525526
526- JavaThreadInVMAndNative (Thread* t) : _jt(t-> is_Java_thread () ? JavaThread::cast(t) : nullptr),
527+ JavaThreadInVMAndNative (Thread* t) : _jt(nullptr ),
527528 _original_state (_thread_max_state) {
528- if (_jt != nullptr ) {
529+ if (t != nullptr && t->is_Java_thread ()) {
530+ _jt = JavaThread::cast (t);
529531 _original_state = _jt->thread_state ();
530532 if (_original_state != _thread_in_vm) {
531533 _jt->set_thread_state (_thread_in_vm);
@@ -535,6 +537,7 @@ class JavaThreadInVMAndNative : public StackObj {
535537
536538 ~JavaThreadInVMAndNative () {
537539 if (_original_state != _thread_max_state) {
540+ assert (_jt != nullptr , " invariant" );
538541 _jt->set_thread_state (_original_state);
539542 }
540543 }
@@ -574,11 +577,13 @@ static bool guard_reentrancy() {
574577 Thread* const thread = Thread::current_or_null_safe ();
575578 const traceid tid = thread != nullptr ? JFR_JVM_THREAD_ID (thread) : max_julong;
576579 if (AtomicAccess::cmpxchg (&_jfr_shutdown_tid, shutdown_tid, tid) != shutdown_tid) {
580+ JavaThreadInVMAndNative jtivm (thread);
577581 if (thread != nullptr ) {
578- JavaThreadInVMAndNative jtivm (thread);
579582 release_locks (thread);
580583 }
581584 log_info (jfr, system)(" A jfr emergency dump is already in progress, waiting for thread id " UINT64_FORMAT_X, AtomicAccess::load (&_jfr_shutdown_tid));
585+ // Transition to a safe safepoint state for the infinite sleep. A nop for non-java threads.
586+ jtivm.transition_to_native ();
582587 os::infinite_sleep (); // stay here until we exit normally or crash.
583588 ShouldNotReachHere ();
584589 }
0 commit comments