Tue, 31 Mar 2015 11:36:37 +0200
8068036: assert(is_available(index)) failed in G1 cset
Summary: Some verification code iterated over the heap using the region mapping array. This is not allowed. Changed to use the regular iteration method with closure.
Reviewed-by: jwilhelm, brutisso
1.1 --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Mar 19 15:25:54 2015 +0100 1.2 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Tue Mar 31 11:36:37 2015 +0200 1.3 @@ -6017,56 +6017,68 @@ 1.4 guarantee(!cl.failures(), "bitmap verification"); 1.5 } 1.6 1.7 -bool G1CollectedHeap::check_cset_fast_test() { 1.8 - bool failures = false; 1.9 - for (uint i = 0; i < _hrm.length(); i += 1) { 1.10 - HeapRegion* hr = _hrm.at(i); 1.11 - InCSetState cset_state = (InCSetState) _in_cset_fast_test.get_by_index((uint) i); 1.12 +class G1CheckCSetFastTableClosure : public HeapRegionClosure { 1.13 + private: 1.14 + bool _failures; 1.15 + public: 1.16 + G1CheckCSetFastTableClosure() : HeapRegionClosure(), _failures(false) { } 1.17 + 1.18 + virtual bool doHeapRegion(HeapRegion* hr) { 1.19 + uint i = hr->hrm_index(); 1.20 + InCSetState cset_state = (InCSetState) G1CollectedHeap::heap()->_in_cset_fast_test.get_by_index(i); 1.21 if (hr->isHumongous()) { 1.22 if (hr->in_collection_set()) { 1.23 gclog_or_tty->print_cr("\n## humongous region %u in CSet", i); 1.24 - failures = true; 1.25 - break; 1.26 + _failures = true; 1.27 + return true; 1.28 } 1.29 if (cset_state.is_in_cset()) { 1.30 gclog_or_tty->print_cr("\n## inconsistent cset state %d for humongous region %u", cset_state.value(), i); 1.31 - failures = true; 1.32 - break; 1.33 + _failures = true; 1.34 + return true; 1.35 } 1.36 if (hr->continuesHumongous() && cset_state.is_humongous()) { 1.37 gclog_or_tty->print_cr("\n## inconsistent cset state %d for continues humongous region %u", cset_state.value(), i); 1.38 - failures = true; 1.39 - break; 1.40 + _failures = true; 1.41 + return true; 1.42 } 1.43 } else { 1.44 if (cset_state.is_humongous()) { 1.45 gclog_or_tty->print_cr("\n## inconsistent cset state %d for non-humongous region %u", cset_state.value(), i); 1.46 - failures = true; 1.47 - break; 1.48 + _failures = true; 1.49 + return true; 1.50 } 1.51 if (hr->in_collection_set() != cset_state.is_in_cset()) { 1.52 gclog_or_tty->print_cr("\n## in CSet %d / cset state %d inconsistency for region %u", 1.53 hr->in_collection_set(), cset_state.value(), i); 1.54 - failures = true; 1.55 - break; 1.56 + _failures = true; 1.57 + return true; 1.58 } 1.59 if (cset_state.is_in_cset()) { 1.60 if (hr->is_young() != (cset_state.is_young())) { 1.61 gclog_or_tty->print_cr("\n## is_young %d / cset state %d inconsistency for region %u", 1.62 hr->is_young(), cset_state.value(), i); 1.63 - failures = true; 1.64 - break; 1.65 + _failures = true; 1.66 + return true; 1.67 } 1.68 if (hr->is_old() != (cset_state.is_old())) { 1.69 gclog_or_tty->print_cr("\n## is_old %d / cset state %d inconsistency for region %u", 1.70 hr->is_old(), cset_state.value(), i); 1.71 - failures = true; 1.72 - break; 1.73 + _failures = true; 1.74 + return true; 1.75 } 1.76 } 1.77 } 1.78 - } 1.79 - return !failures; 1.80 + return false; 1.81 + } 1.82 + 1.83 + bool failures() const { return _failures; } 1.84 +}; 1.85 + 1.86 +bool G1CollectedHeap::check_cset_fast_test() { 1.87 + G1CheckCSetFastTableClosure cl; 1.88 + _hrm.iterate(&cl); 1.89 + return !cl.failures(); 1.90 } 1.91 #endif // PRODUCT 1.92
2.1 --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Thu Mar 19 15:25:54 2015 +0100 2.2 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Tue Mar 31 11:36:37 2015 +0200 2.3 @@ -213,6 +213,9 @@ 2.4 // Other related classes. 2.5 friend class G1MarkSweep; 2.6 2.7 + // Testing classes. 2.8 + friend class G1CheckCSetFastTableClosure; 2.9 + 2.10 private: 2.11 // The one and only G1CollectedHeap, so static functions can find it. 2.12 static G1CollectedHeap* _g1h;