< prev index next >
src/share/vm/gc/g1/heapRegion.cpp
Print this page
rev 12513 : 8071278: Fix the closure mess in G1RemSet::refine_card()
Summary: Remove the use of many nested closure in the code to refine a card.
Reviewed-by: kbarrett, sjohanss
*** 1,7 ****
/*
! * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 53,66 ****
G1ParPushHeapRSClosure* cl,
CardTableModRefBS::PrecisionStyle precision) :
DirtyCardToOopClosure(hr, cl, precision, NULL),
_hr(hr), _rs_scan(cl), _g1(g1) { }
- FilterOutOfRegionClosure::FilterOutOfRegionClosure(HeapRegion* r,
- OopClosure* oc) :
- _r_bottom(r->bottom()), _r_end(r->end()), _oc(oc) { }
-
void HeapRegionDCTOC::walk_mem_region(MemRegion mr,
HeapWord* bottom,
HeapWord* top) {
G1CollectedHeap* g1h = _g1;
size_t oop_size;
--- 53,62 ----
*** 351,361 ****
// Humongous objects are allocated directly in the old-gen. Need
// special handling for concurrent processing encountering an
// in-progress allocation.
static bool do_oops_on_card_in_humongous(MemRegion mr,
! FilterOutOfRegionClosure* cl,
HeapRegion* hr,
G1CollectedHeap* g1h) {
assert(hr->is_humongous(), "precondition");
HeapRegion* sr = hr->humongous_start_region();
oop obj = oop(sr->bottom());
--- 347,357 ----
// Humongous objects are allocated directly in the old-gen. Need
// special handling for concurrent processing encountering an
// in-progress allocation.
static bool do_oops_on_card_in_humongous(MemRegion mr,
! G1UpdateRSOrPushRefOopClosure* cl,
HeapRegion* hr,
G1CollectedHeap* g1h) {
assert(hr->is_humongous(), "precondition");
HeapRegion* sr = hr->humongous_start_region();
oop obj = oop(sr->bottom());
*** 392,402 ****
}
return true;
}
bool HeapRegion::oops_on_card_seq_iterate_careful(MemRegion mr,
! FilterOutOfRegionClosure* cl) {
assert(MemRegion(bottom(), end()).contains(mr), "Card region not in heap region");
G1CollectedHeap* g1h = G1CollectedHeap::heap();
// Special handling for humongous regions.
if (is_humongous()) {
--- 388,398 ----
}
return true;
}
bool HeapRegion::oops_on_card_seq_iterate_careful(MemRegion mr,
! G1UpdateRSOrPushRefOopClosure* cl) {
assert(MemRegion(bottom(), end()).contains(mr), "Card region not in heap region");
G1CollectedHeap* g1h = G1CollectedHeap::heap();
// Special handling for humongous regions.
if (is_humongous()) {
*** 763,772 ****
--- 759,783 ----
}
}
}
};
+ // Closure that applies the given two closures in sequence.
+ class G1Mux2Closure : public OopClosure {
+ OopClosure* _c1;
+ OopClosure* _c2;
+ public:
+ G1Mux2Closure(OopClosure *c1, OopClosure *c2) { _c1 = c1; _c2 = c2; }
+ template <class T> inline void do_oop_work(T* p) {
+ // Apply first closure; then apply the second.
+ _c1->do_oop(p);
+ _c2->do_oop(p);
+ }
+ virtual inline void do_oop(oop* p) { do_oop_work(p); }
+ virtual inline void do_oop(narrowOop* p) { do_oop_work(p); }
+ };
+
// This really ought to be commoned up into OffsetTableContigSpace somehow.
// We would need a mechanism to make that code skip dead objects.
void HeapRegion::verify(VerifyOption vo,
bool* failures) const {
< prev index next >