RFR(xxs): 8213236: A partial removed/deleted JavaThread cannot transition

Daniel D. Daugherty daniel.daugherty at oracle.com
Thu Nov 1 15:58:44 UTC 2018


On 11/1/18 7:57 AM, Robbin Ehn wrote:
> Hi all please review,
>
> In 8212933 we moved the cancellation of a handshake to the VM thread, 
> for sanity
> an assert was added to make sure the JavaThread do not cancel. 
> (technically this
> works also, but to keep a simple model it should be done by the VM 
> thread)
>
> A JavaThread that is terminated but not yet free should not follow the 
> safepoint
> protocol. Since the VM thread running the safepoint cannot see such a 
> thread
> it's confusing and error-prone doing safepoint checks and transitions 
> from a
> thread not 'attached' to the VM.
>
> Issue:
> https://bugs.openjdk.java.net/browse/JDK-8213236

I updated the bug to be a bit more clear about what the problem is.
Please let me know if my analysis is correct or not...


>
> Code:
> diff -r 13ad2bfee99e src/hotspot/share/runtime/vmThread.cpp
> --- a/src/hotspot/share/runtime/vmThread.cpp    Thu Nov 01 09:57:57 
> 2018 +0100
> +++ b/src/hotspot/share/runtime/vmThread.cpp    Thu Nov 01 12:40:47 
> 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 off threadslist");

This should be "should be terminated". is_terminated()
doesn't necessarily mean the JavaThread is not on the
global ThreadsList.


> +  { MutexLockerEx mu(VMOperationQueue_lock, 
> Mutex::_no_safepoint_check_flag);

Yup. I agree with this addition of Mutex::_no_safepoint_check_flag.

However, I think there is one more:

src/hotspot/share/runtime/thread.cpp:
   before_exit(thread);

   thread->exit(true);

   // Stop VM thread.
   {
     // 4945125 The vm thread comes to a safepoint during exit.
     // GC vm_operations can get caught at the safepoint, and the
     // heap is unparseable if they are caught. Grab the Heap_lock
     // to prevent this. The GC vm_operations will not be able to
     // 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);

     VMThread::wait_for_vm_thread_exit();

You fixed the one in wait_for_vm_thread_exit(), but I think
that this: "MutexLocker ml(Heap_lock)" is also a problem.

Dan



> _should_terminate = true;
>      VMOperationQueue_lock->notify();
>    }
>
> Passes t1-2.
>
> Thanks Robbin



More information about the hotspot-runtime-dev mailing list