src/share/vm/gc_implementation/g1/g1OopClosures.hpp

Print this page
rev 2691 : [mq]: g1-reference-processing

*** 32,41 **** --- 32,42 ---- class DirtyCardToOopClosure; class CMBitMap; class CMMarkStack; class G1ParScanThreadState; class CMTask; + class ReferenceProcessor; // A class that scans oops in a given heap region (much as OopsInGenClosure // scans oops in a generation.) class OopsInHeapRegionClosure: public OopsInGenClosure { protected:
*** 57,77 **** bool apply_to_weak_ref_discovered_field() { return true; } }; class G1ParPushHeapRSClosure : public G1ParClosureSuper { public: ! G1ParPushHeapRSClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : ! G1ParClosureSuper(g1, par_scan_state) { } template <class T> void do_oop_nv(T* p); virtual void do_oop(oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } }; class G1ParScanClosure : public G1ParClosureSuper { public: ! G1ParScanClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : ! G1ParClosureSuper(g1, par_scan_state) { } template <class T> void do_oop_nv(T* p); virtual void do_oop(oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } }; --- 58,90 ---- bool apply_to_weak_ref_discovered_field() { return true; } }; class G1ParPushHeapRSClosure : public G1ParClosureSuper { public: ! G1ParPushHeapRSClosure(G1CollectedHeap* g1, ! G1ParScanThreadState* par_scan_state, ! ReferenceProcessor* rp) : ! G1ParClosureSuper(g1, par_scan_state) ! { ! assert(_ref_processor == NULL, "sanity"); ! _ref_processor = rp; ! } ! template <class T> void do_oop_nv(T* p); virtual void do_oop(oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } }; class G1ParScanClosure : public G1ParClosureSuper { public: ! G1ParScanClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, ReferenceProcessor* rp) : ! G1ParClosureSuper(g1, par_scan_state) ! { ! assert(_ref_processor == NULL, "sanity"); ! _ref_processor = rp; ! } ! template <class T> void do_oop_nv(T* p); virtual void do_oop(oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } };
*** 90,102 **** return oop((intptr_t)ref & ~G1_PARTIAL_ARRAY_MASK); } class G1ParScanPartialArrayClosure : public G1ParClosureSuper { G1ParScanClosure _scanner; public: ! G1ParScanPartialArrayClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : ! G1ParClosureSuper(g1, par_scan_state), _scanner(g1, par_scan_state) { } template <class T> void do_oop_nv(T* p); virtual void do_oop(oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } }; --- 103,124 ---- return oop((intptr_t)ref & ~G1_PARTIAL_ARRAY_MASK); } class G1ParScanPartialArrayClosure : public G1ParClosureSuper { G1ParScanClosure _scanner; + public: ! G1ParScanPartialArrayClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, ReferenceProcessor* rp) : ! G1ParClosureSuper(g1, par_scan_state), _scanner(g1, par_scan_state, rp) ! { ! assert(_ref_processor == NULL, "sanity"); ! } ! ! G1ParScanClosure* scanner() { ! return &_scanner; ! } ! template <class T> void do_oop_nv(T* p); virtual void do_oop(oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } };
*** 114,162 **** template<bool do_gen_barrier, G1Barrier barrier, bool do_mark_object> class G1ParCopyClosure : public G1ParCopyHelper { G1ParScanClosure _scanner; template <class T> void do_oop_work(T* p); public: ! G1ParCopyClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : ! _scanner(g1, par_scan_state), G1ParCopyHelper(g1, par_scan_state, &_scanner) { } template <class T> void do_oop_nv(T* p) { do_oop_work(p); } virtual void do_oop(oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } }; typedef G1ParCopyClosure<false, G1BarrierNone, false> G1ParScanExtRootClosure; typedef G1ParCopyClosure<true, G1BarrierNone, false> G1ParScanPermClosure; ! typedef G1ParCopyClosure<false, G1BarrierRS, false> G1ParScanHeapRSClosure; typedef G1ParCopyClosure<false, G1BarrierNone, true> G1ParScanAndMarkExtRootClosure; typedef G1ParCopyClosure<true, G1BarrierNone, true> G1ParScanAndMarkPermClosure; - typedef G1ParCopyClosure<false, G1BarrierRS, true> G1ParScanAndMarkHeapRSClosure; ! // This is the only case when we set skip_cset_test. Basically, this ! // closure is (should?) only be called directly while we're draining ! // the overflow and task queues. In that case we know that the ! // reference in question points into the collection set, otherwise we ! // would not have pushed it on the queue. The following is defined in ! // g1_specialized_oop_closures.hpp. ! // typedef G1ParCopyClosure<false, G1BarrierEvac, false, true> G1ParScanHeapEvacClosure; ! // We need a separate closure to handle references during evacuation ! // failure processing, as we cannot asume that the reference already ! // points into the collection set (like G1ParScanHeapEvacClosure does). typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacFailureClosure; class FilterIntoCSClosure: public OopClosure { G1CollectedHeap* _g1; OopClosure* _oc; DirtyCardToOopClosure* _dcto_cl; public: FilterIntoCSClosure( DirtyCardToOopClosure* dcto_cl, ! G1CollectedHeap* g1, OopClosure* oc) : _dcto_cl(dcto_cl), _g1(g1), _oc(oc) ! {} template <class T> void do_oop_nv(T* p); virtual void do_oop(oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } bool apply_to_weak_ref_discovered_field() { return true; } bool do_header() { return false; } --- 136,204 ---- template<bool do_gen_barrier, G1Barrier barrier, bool do_mark_object> class G1ParCopyClosure : public G1ParCopyHelper { G1ParScanClosure _scanner; + template <class T> void do_oop_work(T* p); + public: ! G1ParCopyClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, ! ReferenceProcessor* rp) : ! _scanner(g1, par_scan_state, rp), ! G1ParCopyHelper(g1, par_scan_state, &_scanner) ! { ! assert(_ref_processor == NULL, "sanity"); ! } ! ! G1ParScanClosure* scanner() { return &_scanner; } ! template <class T> void do_oop_nv(T* p) { do_oop_work(p); } virtual void do_oop(oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } }; typedef G1ParCopyClosure<false, G1BarrierNone, false> G1ParScanExtRootClosure; typedef G1ParCopyClosure<true, G1BarrierNone, false> G1ParScanPermClosure; ! typedef G1ParCopyClosure<false, G1BarrierNone, true> G1ParScanAndMarkExtRootClosure; typedef G1ParCopyClosure<true, G1BarrierNone, true> G1ParScanAndMarkPermClosure; ! // The following closure types are no longer used but are retained ! // for historical reasons: ! // typedef G1ParCopyClosure<false, G1BarrierRS, false> G1ParScanHeapRSClosure; ! // typedef G1ParCopyClosure<false, G1BarrierRS, true> G1ParScanAndMarkHeapRSClosure; ! ! // The following closure type is defined in g1_specialized_oop_closures.hpp: ! // ! // typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacClosure; ! ! // We use a separate closure to handle references during evacuation ! // failure processing. ! // We could have used another instance of G1ParScanHeapEvacClosure ! // (since that closure no longer assumes that the references it ! // handles point into the collection set). ! typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacFailureClosure; class FilterIntoCSClosure: public OopClosure { G1CollectedHeap* _g1; OopClosure* _oc; DirtyCardToOopClosure* _dcto_cl; public: FilterIntoCSClosure( DirtyCardToOopClosure* dcto_cl, ! G1CollectedHeap* g1, ! OopClosure* oc, ! ReferenceProcessor* rp) : _dcto_cl(dcto_cl), _g1(g1), _oc(oc) ! { ! assert(_ref_processor == NULL, "sanity"); ! _ref_processor = rp; ! } ! template <class T> void do_oop_nv(T* p); virtual void do_oop(oop* p) { do_oop_nv(p); } virtual void do_oop(narrowOop* p) { do_oop_nv(p); } bool apply_to_weak_ref_discovered_field() { return true; } bool do_header() { return false; }