RFR: 8212663: Remove conservative at_safepoint assert when JFR writes type sets during class unloading

Erik Österlund erik.osterlund at oracle.com
Fri Oct 19 08:48:21 UTC 2018

Hi David,

On 2018-10-19 09:52, David Holmes wrote:
> Hi Erik,
> On 19/10/2018 5:25 PM, Erik Österlund wrote:
>> Hi David,
>> Isn't the single thread call context the assumed default?
> Not sure what you mean.
>> In particular, this is called by SystemDictionary::do_unloading() 
>> only. And none of that stuff would work if called by multiple threads.
>> So while it is indeed possible to distinguish the ZDriver thread as a 
>> special type of concurrent GC thread that also handles unloading, and 
>> verify there can only be one such thread with that role, for this 
>> assert, I'm not sure if it is worth the hassle as all code in the 
>> unloading path is single threaded anyway, and I can't see what is 
>> special about this code apart from that there was an assert there 
>> before and the other single threaded code did not. Do you agree?
> The author of the current code considered it desriable to check the 
> code was only called at a safepoint. That might mean it only executes 
> in the VMThread or it might not - the single-threaded aspect of this 
> code is not evident to me just from the code. If checking for a 
> safepoint was really a proxy for checking it was executed by the 
> VMThread, and concurrent unloading now uses a different thread, then 
> it didn't seem unreasonable to ask if the assertion could be modified 
> to cover that rather than just removed.

Don't get me wrong; I don't think the question is unreasonable. I do see 
your point, and the question is reasonable.
I suppose what I'm saying is that the whole call tree under 
SystemDictionary::do_unloading() is built for being called by a single 
thread (and will continue being so in the concurrent unloading world), 
including this JFR code, but I don't know how much it would help 
protecting us from messing up by sprinkling asserts throughout that call 
tree making sure we are indeed not calling do_unloading in parallel 
accidentally. Having said that, maybe an extra seat belt won't hurt either.

> If it's really too much trouble than that's fine, but it was worth 
> asking the question.

How about using assert_locked_or_safepoint(ClassLoaderDataGraph_lock); 
instead? The unloading thread will hold that lock throughout the 
unloading path.

Like this:


> Cheers,
> David
>> Thanks,
>> /Erik
>> On 2018-10-19 03:51, David Holmes wrote:
>>> Hi Erik,
>>> On 19/10/2018 1:00 AM, Erik Österlund wrote:
>>>> Hi,
>>>> JFR writes type sets during class unloading. It currently asserts 
>>>> this is done in a safepoint. But in fact, it suffices that it is 
>>>> done by a single thread. This assert needs to be relaxed for 
>>>> concurrent class unloading.
>>> Okay but you removed it completely. Is there not something you can 
>>> assert to verify your single thread requirement:
>>> Thread::current()->is_VM_thread() || Thread::current()->is_ 
>>> classUnloader_thread()
>>> ??
>>> Cheers,
>>> David
>>>> Webrev:
>>>> http://cr.openjdk.java.net/~eosterlund/8212663/webrev.00/
>>>> Bug:
>>>> https://bugs.openjdk.java.net/browse/JDK-8212663
>>>> Thanks,
>>>> /Erik

More information about the hotspot-runtime-dev mailing list