# HG changeset patch # User rehn # Date 1541164385 -3600 # Node ID e256b3b62e209ffb7fbb19cad7f5739c1550f218 # Parent 5c679ec60888c54daeba5e6e4666f6a05326fe2f 8213236: A partial removed/deleted JavaThread cannot transition Reviewed-by: dholmes, dcubed, eosterlund diff -r 5c679ec60888 -r e256b3b62e20 src/hotspot/share/runtime/thread.cpp --- a/src/hotspot/share/runtime/thread.cpp Fri Nov 02 08:33:59 2018 +0100 +++ b/src/hotspot/share/runtime/thread.cpp Fri Nov 02 14:13:05 2018 +0100 @@ -4286,7 +4286,7 @@ // queue until after the vm thread is dead. After this point, // we'll never emerge out of the safepoint before the VM exits. - MutexLocker ml(Heap_lock); + MutexLockerEx ml(Heap_lock, Mutex::_no_safepoint_check_flag); VMThread::wait_for_vm_thread_exit(); assert(SafepointSynchronize::is_at_safepoint(), "VM thread should exit at Safepoint"); diff -r 5c679ec60888 -r e256b3b62e20 src/hotspot/share/runtime/vmThread.cpp --- a/src/hotspot/share/runtime/vmThread.cpp Fri Nov 02 08:33:59 2018 +0100 +++ b/src/hotspot/share/runtime/vmThread.cpp Fri Nov 02 14:13:05 2018 +0100 @@ -319,7 +319,9 @@ // Notify the VMThread that the last non-daemon JavaThread has terminated, // and wait until operation is performed. void VMThread::wait_for_vm_thread_exit() { - { MutexLocker mu(VMOperationQueue_lock); + assert(Thread::current()->is_Java_thread(), "Should be a JavaThread"); + assert(((JavaThread*)Thread::current())->is_terminated(), "Should be terminated"); + { MutexLockerEx mu(VMOperationQueue_lock, Mutex::_no_safepoint_check_flag); _should_terminate = true; VMOperationQueue_lock->notify(); }