< prev index next >

src/hotspot/share/gc/g1/g1OopClosures.hpp

Print this page
rev 52316 : imported patch 8212911-unify-reference-handling-during-gc
rev 52317 : imported patch 8212911-stefanj-review
rev 52319 : imported patch 8213142-use-raii-to-set-scanning-from-young

*** 34,43 **** --- 34,44 ---- class G1RemSet; class G1ConcurrentMark; class DirtyCardToOopClosure; class G1CMBitMap; class G1ParScanThreadState; + class G1ScanEvacuatedObjClosure; class G1CMTask; class ReferenceProcessor; class G1ScanClosureBase : public BasicOopIterateClosure { protected:
*** 80,98 **** template <class T> void do_oop_work(T* p); virtual void do_oop(oop* p) { do_oop_work(p); } virtual void do_oop(narrowOop* p) { do_oop_work(p); } }; // This closure is applied to the fields of the objects that have just been copied during evacuation. class G1ScanEvacuatedObjClosure : public G1ScanClosureBase { ! bool _scanning_in_young; public: G1ScanEvacuatedObjClosure(G1CollectedHeap* g1h, G1ParScanThreadState* par_scan_state) : ! G1ScanClosureBase(g1h, par_scan_state), _scanning_in_young(false) { } ! ! void set_scanning_in_young(bool scanning_in_young) { _scanning_in_young = scanning_in_young; } template <class T> void do_oop_work(T* p); virtual void do_oop(oop* p) { do_oop_work(p); } virtual void do_oop(narrowOop* p) { do_oop_work(p); } --- 81,106 ---- template <class T> void do_oop_work(T* p); virtual void do_oop(oop* p) { do_oop_work(p); } virtual void do_oop(narrowOop* p) { do_oop_work(p); } }; + // This closure is applied to the fields of the objects that have just been copied during evacuation. class G1ScanEvacuatedObjClosure : public G1ScanClosureBase { ! friend class G1ScanInYoungSetter; ! ! enum ScanningInYoungValues { ! False = 0, ! True, ! Uninitialized ! }; ! ! ScanningInYoungValues _scanning_in_young; public: G1ScanEvacuatedObjClosure(G1CollectedHeap* g1h, G1ParScanThreadState* par_scan_state) : ! G1ScanClosureBase(g1h, par_scan_state), _scanning_in_young(Uninitialized) { } template <class T> void do_oop_work(T* p); virtual void do_oop(oop* p) { do_oop_work(p); } virtual void do_oop(narrowOop* p) { do_oop_work(p); }
*** 102,111 **** --- 110,134 ---- void set_ref_discoverer(ReferenceDiscoverer* rd) { set_ref_discoverer_internal(rd); } }; + // RAII object to properly set the _scanning_in_young field in G1ScanEvacuatedObjClosure. + class G1ScanInYoungSetter : public StackObj { + G1ScanEvacuatedObjClosure* _closure; + + public: + G1ScanInYoungSetter(G1ScanEvacuatedObjClosure* closure, bool new_value) : _closure(closure) { + assert(_closure->_scanning_in_young == G1ScanEvacuatedObjClosure::Uninitialized, "Must not be set"); + _closure->_scanning_in_young = new_value ? G1ScanEvacuatedObjClosure::True : G1ScanEvacuatedObjClosure::False; + } + + ~G1ScanInYoungSetter() { + DEBUG_ONLY(_closure->_scanning_in_young = G1ScanEvacuatedObjClosure::Uninitialized;) + } + }; + // Add back base class for metadata class G1ParCopyHelper : public OopClosure { protected: G1CollectedHeap* _g1h; G1ParScanThreadState* _par_scan_state;
< prev index next >