< 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 >