RFR: 8069016: Add BarrierSet downcast support
Jon Masamitsu
jon.masamitsu at oracle.com
Fri Feb 20 21:27:15 UTC 2015
On 2/20/2015 11:48 AM, Kim Barrett wrote:
> Jon, thanks for looking at this.
>
> On Feb 20, 2015, at 3:04 AM, Jon Masamitsu <jon.masamitsu at oracle.com> wrote:
>>
>> http://cr.openjdk.java.net/~kbarrett/8069016/webrev.00/src/share/vm/utilities/fakeRttiSupport.hpp.html
>>
>> 86 TagType _ctag;
>>
>> I'd prefer that the variable be named _concrete_tag
> Sure, I'll change to _concrete_tag.
>
>> http://cr.openjdk.java.net/~kbarrett/8069016/webrev.00/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.hpp.udiff.html
>>
>> + // Concrete tag should be BarrierSet::CardTableExtension.
>> + // That will presently break things in a bunch of places though.
>>
>> Can you expand on these comments. Where would the breakage occur?
>>
>>
>> http://cr.openjdk.java.net/~kbarrett/8069016/webrev.00/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp.udiff.html
>>
>> - BarrierSet* bs = heap->barrier_set();
>> - if (bs->is_a(BarrierSet::ModRef)) {
>> - ModRefBarrierSet* modBS = (ModRefBarrierSet*)bs;
>> + ModRefBarrierSet* modBS = barrier_set_cast<ModRefBarrierSet>(heap->barrier_set());
>>
>>
>> Is this one of the place that breaks because the barrier set is really a CardTableExtension?
>>
>> http://cr.openjdk.java.net/~kbarrett/8069016/webrev.00/src/share/vm/memory/cardTableModRefBS.hpp.udiff.html
>>
>> + // Concrete tag should be BarrierSet::CardTableForRS.
>> + // That will presently break things in a bunch of places though.
>>
>>
>> Expand on this comment also about what will break.
> The concrete tag is used as a dispatch key in many places.
>
> I'm not sure all of those places handle BarrierSet::CardTableExtension
> properly. One place that I think would probably "only" be a
> performance regression is barrierSet.inline.hpp, where the concrete
> tag is used to decide whether to devirtualize the call.
>
> Since BarrierSet::CardTableForRS is new and not propogated everywhere,
> using it as the concrete tag would certainly break things badly for
> relevant collectors.
>
> There is a CR for the CardTableExtension case:
> https://bugs.openjdk.java.net/browse/JDK-8072817
>
> My current thinking is to address some of this by modifications to the
> barrier set class hierarchy and the elimination of the use of the
> concrete tag in favor of (now fast) is_a() tests. For example, change
> the devirtualization in barrierSet.inline.hpp to use
> is_a(BarrierSet::CardTableModRef). That doesn't presently work,
> because the G1 barrier sets are derived from there; changing that
> would be one of the class hierarchy changes I'm thinking about.
>
> A goal of introducing barrier_set_cast is to make such refactorings
> easier.
>
Thanks for the additional information. I would be happy with a comment
along the lines of
// Concrete tag should be BarrierSet::CardTableExtension.
// The concrete tag is used as a dispatch key in many places
// (some yet TBD) and CardTableExtension does not correctly
// dispatch in some of those uses. This will be addressed is
// as part of a reorganization of the BarrierSet hierarchy.
You can choose the exact words. I just thought "breaks
in a bunch of places" a little lean on information.
Reviewed.
Jon
More information about the hotspot-gc-dev
mailing list