RFR(s): 8077415: Remove duplicate variables holding the CollectedHeap

Kim Barrett kim.barrett at oracle.com
Sat Apr 11 19:05:47 UTC 2015


On Apr 10, 2015, at 10:51 AM, Per Liden <per.liden at oracle.com> wrote:
> 
> Hi,
> 
> Universe::_collectedHeap points to the current CollectedHeap. However, collectors also have their own static instances for no real good reason. This patch removes all but the Universe::_collectedHeap and let users call Universe::heap() where needed.
> 
> Bug: https://bugs.openjdk.java.net/browse/JDK-8077415
> 
> Webrev: http://cr.openjdk.java.net/~pliden/8077415/webrev.0/
> 
> (This patch build on top of http://cr.openjdk.java.net/~pliden/8077413/webrev.0/ which is currently out for review)
> 
> cheers,
> /Per

------------------------------------------------------------------------------
src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
3311 G1CollectedHeap* G1CollectedHeap::heap() {
3312   G1CollectedHeap* heap = (G1CollectedHeap*)Universe::heap();
3313   assert(heap != NULL, "Uninitialized access to G1CollectedHeap::heap()");
3314   assert(heap->kind() == CollectedHeap::G1CollectedHeap, "Not a G1CollectedHeap");
3315   return heap;
3316 }

Please don't do this.  If the heap isn't of the expected kind, then
the cast invokes undefined behavior and the heap->kind() check could
crash.  So the assert actually provides a false sense of safety.

It was for this kind of thing that I introduced FakeRttiSupport and
used it for BarrierSet downcasts.  I was intending to use it similarly
for CollectedHeap downcasts, but have not gotten around to doing so.
See barrier_set_cast<>().



More information about the hotspot-gc-dev mailing list