RFR: 8226228: Make Threads_lock an always safepoint checked lock.

Daniel D. Daugherty daniel.daugherty at oracle.com
Sun Jun 23 12:47:27 UTC 2019


Chiming in on one comment:

> +   virtual bool is_active_Java_thread() const {
> +     return on_thread_list() && !is_terminated();
> +   }
>
> Not sure why the termination check is needed here. As we terminate 
> after being removed from the threads_list we won't get past the 
> on_thread_list() check for a terminated thread. ?? 

on_thread_list is set when the JavaThread is added to the ThreadsList
and is never cleared. is_terminated() pre-dates the addition of the
on_thread_list flag which I think we added in the Thread-SMR project.

When we added the on_thread_list flag, we thought about changing it
to false when the JavaThread was removed, but we already had the
whole is_terminated() machinery that has been debugged for race
conditions, etc...

Dan


On 6/22/19 9:34 PM, David Holmes wrote:
> Hi Robbin,
>
> On 17/06/2019 4:21 am, Robbin Ehn wrote:
>> Hi all, please review.
>>
>> A safepoint checked lock always check for safepoint if the locker is an
>> JavaThread. If it's not a JavaThread, the thread are not 
>> participating in the safepoint protocol thus safepoints are not checked.
>
> Okay.
>
>> A JavaThread that is not on _the_ ThreadsList is not participating in 
>> the safepoint protocol and for most purposes should be treat as 
>> NonJavaThread. This applies to whether we should check for a safepoint.
>
> Thinking about that one ... okay.
>
>> This changeset suggest adding a method for checking this.
>> We can use that method in the mutex code to determine if we should 
>> treat locker as JavaThread or a NonJavaThread.
>
> So the assumption here is that all uses of locking of Threads_lock 
> without a safepoint check, by a JavaThread, only occur when the 
> JavaThread is no longer on the _threads_list.
>
>> The only problematic scenario is when we are an active JavaThread in 
>> vmError.cpp but don't want to safepoint, but want the ThreadsList to 
>> be stable.
>> I choose a best effort approach.
>
> Unclear whether you are making things better, worse, or the same as 
> they are currently ? But looking at the change I don't see the point. 
> IIUC you are worried that using lock() rather than 
> lock_without_safepoint_check() will allow the error-reporting thread 
> to get trapped by a safepoint - right? But it is trying to acquire the 
> Threads_lock so it can already get trapped by a safepoint.
>
>> Alternatives could be stop freeing the backing array if there is an
>> an error or letting the thread running the error code become an
>> inactive JavaThread thus avoiding safepointing.
>
> Sounds complicated ...
>
>> This fix also helps converting Heap_lock to an always lock (Heap_lock 
>> needed changes not included).
>>
>> Issue:
>> https://bugs.openjdk.java.net/browse/JDK-8226228
>> Code:
>> http://cr.openjdk.java.net/~rehn/8226228/webrev/index.html
>
> Dan already picked up on a few typos and comment issues so I'll try 
> not repeat those.
>
> src/hotspot/share/runtime/mutex.cpp
>
>   71     // Is it a JavaThread participating in the safeopint protocol.
>
> Typo: safeopint
>
>   72     if (self->is_active_Java_thread()) {
>
> Given we check this in a loop, and given we may also check this at 
> line #51, and I'm assuming this is not a property that can change, 
> perhaps we should cache this up front into a local variable?
>
> ---
>
> src/hotspot/share/runtime/thread.cpp
>
> -     Threads_lock->lock_without_safepoint_check();
> +     Threads_lock->lock();
>       ShouldNotReachHere();
>     }
>   }
>
> I share Dan's concern that going through the lock() path with all of 
> its JavaThread related checks and actions, might not be appropriate at 
> this stage of VM termination? Same with the change in 
> VM_Exit::wait_if_vm_exited(). These paths are not well tested - I 
> added assert(false) to them both and passed tiers 1-3.
>
> +   virtual bool is_active_Java_thread() const {
> +     return on_thread_list() && !is_terminated();
> +   }
>
> Not sure why the termination check is needed here. As we terminate 
> after being removed from the threads_list we won't get past the 
> on_thread_list() check for a terminated thread. ??
>
>> Passes t1-3.
>
> As noted above this is necessary but not sufficient testing for the 
> code paths modified here. Some stress testing involving threads that 
> are in-native when the VM tries to exit is needed - but I have no idea 
> whether such tests already exist.
>
> Thanks,
> David
>
>> Thanks, Robbin



More information about the hotspot-runtime-dev mailing list