RFR: JDK-8222545: Safe klass asserts

Roman Kennke rkennke at redhat.com
Thu Apr 18 13:09:11 UTC 2019


Let me revisit the changes. I probably can avoid the changes in 
oop_oop_iterate() and I will think hard about the size() code-path too.

Roman

> On 18/04/2019 7:54 pm, Roman Kennke wrote:
>> To add a little more detail, I could move the change up into 
>> is_objArray(), but I don't want to expose it to any non-assert paths. 
>> Therefore I could do 2 different impls there, guarded by #ifdef ASSERT 
>> but I don't think it's a good idea to behave differently under ASSERT, 
>> that kindof defeats the point of assert, right?
>>
>> What do you think ?
> 
> I don't follow your argument. Under asserts you need to access the klass 
> pointer "safely" but otherwise you do not. So there are two behaviours 
> related to accessing the klass pointer anyway. I'd rather see that 
> encapsulated in the accessor.
> 
> I assume it's not just asserts but any debug only code that wants to 
> access the klass pointer.
> 
> 
> Thanks,
> David
> -----
> 
>> Roman
>>
>>
>> Am 17. April 2019 18:59:09 MESZ schrieb Roman Kennke 
>> <rkennke at redhat.com>:
>>
>>             Various code paths in oopDesc, Klass and their subclasses 
>> assert
>>             something that fetches the object's _klass field. With 
>> upcoming
>>             Shenandoah's changes this is not always safe and requires an
>>             additional
>>             indirection.
>>
>>             The trouble here is that we can, for example, call
>>             Klass::oop_oop_iterate() with a pre-resolved Klass*, 
>> instead of
>>             oopDesc::oop_iterate() which would call oopDesc::klass() on
>>             its own,
>>             which would be racy on some GC internal call paths, but we 
>> can't
>>             (currently) control some calls to klass() further down the
>>             call stack
>>             (all in asserts).
>>
>>             We'd also like a way to ensure that non-GC calls to klass()
>>             are sane.
>>
>>             Bug:
>>             https://bugs.openjdk.java.net/browse/JDK-8222545
>>             Webrev:
>>             http://cr.openjdk.java.net/~rkennke/JDK-8222545/webrev.00/
>>             Testing:
>>             hotspot_gc_shenandoah with and without the prototype,
>>             hotspot/tier1
>>
>>             The change introduces only two ASSERT-level GC-interfaces,
>>             and afaict,
>>             this with JDK-8222537 will be all that we need for the 
>> upcoming
>>             elimination of forward pointers in Shenandoah. Notice that
>>             one assert in
>>             objArrayKlass is strengthened from is_array() to
>>             is_objArray(), but that
>>             seems only sane in that context.
>>
>>             Can I please get reviews?
>>
>>
>>         This looks very awkward to me. Using:
>>
>>         Universe::heap()->safe_klass(obj)->is_objArray_klass()
>>
>>         instead of the obvious:
>>
>>         obj->is_objArray()
>>
>>         is very unintuitive. Can this not be handled inside is_objArray
>>         (and
>>         is_typeArray) ?
>>
>>
>>     Not really. Then it would get exposed to many more code paths, 
>> most of
>>     which don't actually need it/don't want it, and many of which are
>>     outside of asserts, and rely on the usual klass() with the sanity 
>> assert
>>     there instead. I am open for suggestions, but it would have to be
>>     restricted to ASSERT code IMO, and ideally with as few as possible GC
>>     interface additions.
>>
>>     Roman
>>
>>
>> -- 
>> Diese Nachricht wurde von meinem Android-Gerät mit K-9 Mail gesendet.



More information about the hotspot-gc-dev mailing list