RFR: 8069016: Add BarrierSet downcast support

Jon Masamitsu jon.masamitsu at oracle.com
Fri Feb 20 08:04:00 UTC 2015


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

or

the parameters concrete_tag be changed to ctag

   56   explicit FakeRttiSupport(TagType concrete_tag) :
   57     _tag_set(tag_bit(concrete_tag)), _ctag(concrete_tag) { }

   62   FakeRttiSupport(TagType concrete_tag, uintx tag_set) :
   63     _tag_set(tag_set), _ctag(validate_tag(concrete_tag)) { }

and function concrete_tag() be changed to ctag().

http://cr.openjdk.java.net/~kbarrett/8069016/webrev.00/src/share/vm/memory/barrierSet.hpp.frames.html

   82   // Test whether this object is of the type corresponding to bsn.
   83   bool is_a(BarrierSet::Name bsn) const { return _fake_rtti.has_tag(bsn)


For "is_a()" would a more accurate description be

// Check if the BarrierSet::Name has a tag in the tag_set

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.

Rest looks good.

Jon


On 2/16/2015 3:16 PM, Kim Barrett wrote:
> Please review this change that ensures all barrier set downcasts are
> checked when running in debug mode. This is a step toward some
> cleanups and changes to the barrier set class hierarchy, improving
> error checking and making it easier to find places where assumptions
> are being made that would be invalidated by changes.
>
> I will need a sponsor for this change.
>
> CR:
> https://bugs.openjdk.java.net/browse/JDK-8069016
>
> Webrev:
> http://cr.openjdk.java.net/~kbarrett/8069016/webrev.00
>
> Changeset includes
>
> * New FakeRttiSupport utility class template.  This provides some
>    infrastructure for performing the checks. It is intended to
>    ease similar changes in some other class hierarchies where ad hoc
>    checking or unchecked downcasts are common, such as the
>    CollectedHeap hierarchy.
>
> * Re-implementation of BarrierSet's "fake RTTI" to use
>    FakeRttiSupport.  As part of this, BarrierSet::is_a() is now just an
>    integer bit test rather than a virtual function that needs to walk
>    up the class hierarchy.
>
> * Adds barrier_set_cast function template, which uses the improved
>    is_a() test to assert the validity of the conversion.
>
> * Adds BarrierSet::CardTableForRS barrier set name tag, so that all
>    existing classes have an associated tag.
>
> * Changes all C-style barrier set downcasts to use barrier_set_cast.  In
>    most cases, this is just a mechanical translation.  In some cases some
>    existing checks have been eliminated in favor of the check made by the
>    new mechanism.  In a few places more extensive changes have been made,
>    as detailed below:
>
> ** In various g1_write_barrier_post() implementations, downcast to
>     G1SATBCardTableLoggingModRefBS rather than G1SATBCardTableModRefBS,
>     since the code being generated includes logging.
>
> ** In PSMarkSweep::invoke_no_policy(), don't bother conditionalizing
>     clear/invalidate of barrier set on whether the bs is a modrefbs; it
>     always will be for parallel scavenge collector.  Similarly in
>     PSParallelCompact::post_compact().
>
> ** For VerifyLiveClosure constructor initialization of _bs member, just
>     use barrier_set_cast of the heap's barrier. If the previous is_a
>     conditionalization failed it would just lead to a later segfault
>     when attempting to dereference through the NULL _bs member.
>
> Testing:
> JPRT, local JTREG of test/[closed]/{gc,runtime},
> local RefWorkload using CMS, G1, ParallelOld
>



More information about the hotspot-gc-dev mailing list