RFR: 8337548: Parallel class loading can pass is_superclass true for interfaces [v3]

Coleen Phillimore coleenp at openjdk.org
Fri Jan 31 14:18:11 UTC 2025


On Fri, 31 Jan 2025 14:06:36 GMT, Coleen Phillimore <coleenp at openjdk.org> wrote:

>> src/hotspot/share/classfile/systemDictionary.cpp line 433:
>> 
>>> 431:   // Also rarely, if parallel loading completes loading at this point, we can also check the super class name.
>>> 432:   if (check_is_superclass) {
>>> 433:     InstanceKlass* klassk = loader_data->dictionary()->find_class(THREAD, class_name);
>> 
>> Maybe the comment should be moved like this. That will give it better context.
>> 
>> 
>>  if (check_is_superclass) {
>>     InstanceKlass* klassk = loader_data->dictionary()->find_class(THREAD, class_name);
>>     if (klassk != nullptr) {
>>       // We can come here for two reasons:
>>       // (a) RedefineClasses -- the class is already loaded
>>       // (b) Rarely, the class might have been loaded by a parallel thread
>>       // We can do a quick check against the already assigned superclass's name and loader.
>>       if (((quicksuperk = klassk->java_super()) != nullptr) &&
>>           ((quicksuperk->name() == next_name) &&
>>           (quicksuperk->class_loader() == class_loader()))) {
>>         return quicksuperk;
>>       }
>> 
>> 
>> Also, I am not sure `check_is_superclass` is a better name than `is_superclass`. When you have the chain:
>> 
>> 
>> resolve_super_or_fail(Symbol* class_name, Symbol* super_name, ...   bool is_superclass, ...)
>> -> resolve_with_circularity_detection(class_name, super_name, class_loader, is_superclass, THREAD)
>> 
>> 
>> The caller of `resolve_super_or_fail()` only knows that `super_name` is an (immediate) superclass of `class_name`. It doesn't know (or need to care) that someone down the call chain would have to do some "check" in for optimization purposes.
>> 
>> I think it's fine to move this quick check outside of the lock. I don't think we should worry about removing locks that are obviously not needed. If we somehow depended on the lock always being taken, that would be a bug elsewhere and we will find out during testing.
>
> Okay, I renamed is_superclass to check_is_superclass when I the code wasn't sure if it was the superclass, but now it's only true when it's sure it's the superclass.  So now is_superclass is nicer.
> 
> I like your new comment, so have added it.

also I'm glad you suggested restructuring this code because now I can remove some parenthesis and read it.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/23322#discussion_r1937383505


More information about the hotspot-runtime-dev mailing list