RFR: 8069016: Add BarrierSet downcast support
Kim Barrett
kim.barrett at oracle.com
Mon Feb 16 23:16:38 UTC 2015
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