[Nestmates] RFR (S): Dynamic nestmate update

David Holmes david.holmes at oracle.com
Wed Oct 31 22:11:54 UTC 2018

Thanks Lois.


On 1/11/2018 6:30 AM, Lois Foltan wrote:
> On 10/31/2018 2:56 AM, David Holmes wrote:
>> Hi Lois,
>> I've pushed set_nest_host down into fill_instance_class, where it is 
>> set as early as possible - which is after apply_parsed_class_metadata 
>> as that sets the static nest attributes in the IK.
>> I also had to remove an assertion that's no longer valid at the time 
>> we try to assert it.
>> Full webrev: 
>> http://cr.openjdk.java.net/~dholmes/dynamic-nestmates/webrev.v3/
>> Incremental: 
>> http://cr.openjdk.java.net/~dholmes/dynamic-nestmates/webrev.v3-incr/
>> This seems early enough to address all your concerns re super access, 
>> initializers and JFR, even if we don't currently need to see the 
>> nest_host.
> Thanks David for making that change!  Looks good.
> Lois
>> Thanks,
>> David
>> On 31/10/2018 8:25 AM, David Holmes wrote:
>>> Hi Lois,
>>> On 31/10/2018 3:43 AM, Lois Foltan wrote:
>>>> On 10/30/2018 3:28 AM, David Holmes wrote:
>>>>> Hi Lois,
>>>>> Here's an update:
>>>>> http://cr.openjdk.java.net/~dholmes/dynamic-nestmates/webrev.v2
>>>>> Now we push the dynamic_nest_host through to the 
>>>>> KlassFactory::create_from_stream level, where we set the nest-host 
>>>>> directly after ClassFileParser.create_instance_klass has been 
>>>>> called. That should ensure the class is not findable until after 
>>>>> the nest-host has successfully been set, and doesn't require any 
>>>>> further cleanup (as far as I can see) if the setting of the 
>>>>> nest-host fails.
>>>> Thank you!  I think the parameter "nest_host" should be even pushed 
>>>> further into ClassFileParser::create_instance_klass() & then into 
>>>> ClassFileParser::fill_instance_klass().  The call to set_nest_host 
>>>> should occur in ClassFileParser::fill_instance_klass for a couple of 
>>>> reasons.
>>>>      - 1. check_super_class_access and check_super_interface_access 
>>>> could be affected by the setting of nest host?
>>> Not today - nest-based access checks are only for members. If we get 
>>> to sealed classes and allow dynamic nest members to relate to such 
>>> sealed classes then we are already in a position where the nest host 
>>> has to be known much earlier - and there are problems with that. This 
>>> could be a preemptive move towards supporting that.
>>>>      - 2. when the mirror is created and static fields are 
>>>> initialized one of those field's initializers could access a nest 
>>>> member?  Would this be an issue if nest_host is not set?
>>> This is default (and compile-time constant?) initialization of 
>>> fields. Any non-default initialization happens at <clinit> time which 
>>> is much later - well after the nest-host has been set.
>>>>      - 3. JFR might want to know this information by the time 
>>>> JFR_ONLY(INIT_ID(ik);) is invoked at the end of 
>>>> ClassFileParser::fill_instance_klass()
>>> Okay - that may be true in the future.
>>>> And this brings me to my nest code review comment for both of us. 
>>>> I'm passing 3 more parameters (nonfindable, is_weak and 
>>>> vm_annotations) from jvm_lookup_define_class() all the way down into 
>>>> ClassFileParser construction.  We may need to consider creating a 
>>>> new data structure much like ClassInfo or LinkInfo, something like 
>>>> ClassParseInfo that contains information for not only our new 
>>>> parameters but existing unsafe anonymous class information that is 
>>>> passed into SystemDictionary::parse_stream as well.  Let me know 
>>>> what you think?
>>> Yes - there is too much tramp data. Unclear whether to simply define 
>>> a new holder class and pass that around everywhere, or whether to try 
>>> and incorporate into existing strcutures e.g. perhaps attach it to 
>>> the ClassFileParser? Depends on where the different bits of data are 
>>> getting used.
>>> I'll simply pass the nest-host further down directly for now to test 
>>> out how this works.
>>>>> No changes to InstanceKlass::set_nest_host from previous version 
>>>>> (sorry I'm not setup to do incremental webrevs ... need to fix that).
>>>> A couple of minor comments for InstanceKlass::set_nest_host()
>>>> - line #325 - comment "are a" should be "are"
>>> Fixed.
>>>> - If host is NULL, would you consider setting _nest_host to the 
>>>> current instance class?  Aren't you your own nest host?
>>> In a static sense you are your own nest host if nothing else is 
>>> specified. But for this dynamic API a NULL host is a programming 
>>> error to me.
>>> Thanks,
>>> David
>>>>> I've also removed Mandy's temporary nestmate access check code in 
>>>>> reflection.cpp as it is not needed. So 
>>>>> InstanceKlass:raw_nest_host() is also removed.
>>>> Good, thank you, that had been something on my list to look at!
>>>>> I also reworked jvm_lookup_define_class a little - the use of 
>>>>> "const" caused flow-on problems that were simpler to avoid by not 
>>>>> using "const".
>>>> Looks good.
>>>> Thanks,
>>>> Lois
>>>>> Thanks,
>>>>> David
>>>>> On 30/10/2018 9:35 AM, David Holmes wrote:
>>>>>> Hi Lois,
>>>>>> On 30/10/2018 6:01 AM, Lois Foltan wrote:
>>>>>>> On 10/29/2018 2:37 AM, David Holmes wrote:
>>>>>>>> webrev: 
>>>>>>>> http://cr.openjdk.java.net/~dholmes/dynamic-nestmates/webrev/
>>>>>>>> This fleshes out Mandy's initial implementation with additional 
>>>>>>>> error checking on the VM side to match the defineClass API, and 
>>>>>>>> with an additional VM test.
>>>>>>>> Thanks,
>>>>>>>> David
>>>>>>> Hi David,
>>>>>>> I have a couple of concerns about this approach longer term for 
>>>>>>> setting the nest host post return from either 
>>>>>>> SystemDictionary::resolve_from_stream or 
>>>>>>> SystemDictionary::parse_stream within jvm_lookup_define_class().
>>>>>>> - for a findable class as soon as that class is added to the 
>>>>>>> SystemDictionary, is there any concern that another thread could 
>>>>>>> request that class and access it before its nest host is 
>>>>>>> legitimately set? Would it be better to pass nest host down into 
>>>>>>> ClassFileParser so it is known at the point the InstanceKlass is 
>>>>>>> created?
>>>>>> Good question. I hadn't looked at exactly how and when the 
>>>>>> defineClass logic set the nest host, I was only only updating the 
>>>>>> actual set_nest_host internal logic.
>>>>>> There are a couple of concerns here:
>>>>>> 1. Finding the class before the nest-host has been set
>>>>>> 2. Cleaning up in the case that setting the nest-host failed
>>>>>> I don't think either are currently handled correctly - and my 
>>>>>> change triggers #2. We need a way to make the complete logical 
>>>>>> operation atomic. That most likely requires pushing the setting of 
>>>>>> the nest-host deeper into the class loading logic - possibly 
>>>>>> immediately after IK creation as you suggest.
>>>>>>> - At the time class file nest members attributes are parsed and 
>>>>>>> the nest host setting within the byte stream matches the nest 
>>>>>>> host used when jvm_lookup_define_class() is invoked, than in my 
>>>>>>> opinion an error should not result.
>>>>>> I disagree. You're either using dynamic nest membership or you're 
>>>>>> using static nest membership - using both, even if the end result 
>>>>>> would be the same, seems an error in the programming model to me. 
>>>>>> Afterall if the defined class is already a valid static nest 
>>>>>> member then you don't need to use the NESTMATE property to inject 
>>>>>> it. And it is definitely an error to claim a static nest-host when 
>>>>>> the host does not statically list you as a member!
>>>>>>> - Finally, should the setting of nest_host be known at the point 
>>>>>>> class file load hook is processed?
>>>>>> I'm not sure what you mean. At what point in the current code 
>>>>>> would the byte[] passed to defineClass be replaced by one from the 
>>>>>> CLFH? As long as the byte[] is final before we actually 
>>>>>> set_nest_host, I don't think it matters.
>>>>>> Thanks,
>>>>>> David
>>>>>>> Thanks,
>>>>>>> Lois

More information about the valhalla-dev mailing list