< prev index next >

src/share/vm/gc_implementation/shenandoah/shenandoahOopClosures.hpp

Print this page
rev 11463 : Backport Traversal GC

*** 22,36 **** --- 22,39 ---- */ #ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP + #include "memory/iterator.hpp" #include "gc_implementation/shenandoah/shenandoahTaskqueue.hpp" class ShenandoahHeap; class ShenandoahStrDedupQueue; class ShenandoahMarkingContext; + class ShenandoahTraversalGC; + class OopClosure; enum UpdateRefsMode { NONE, // No reference updating RESOLVE, // Only a read-barrier (no reference updating) SIMPLE, // Reference updating using simple store
*** 198,203 **** --- 201,356 ---- virtual void do_oop(narrowOop* p) { do_oop_nv(p); } virtual void do_oop(oop* p) { do_oop_nv(p); } }; + class ShenandoahTraversalSuperClosure : public MetadataAwareOopClosure { + private: + ShenandoahTraversalGC* const _traversal_gc; + ShenandoahStrDedupQueue* const _dedup_queue; + Thread* const _thread; + ShenandoahObjToScanQueue* const _queue; + ShenandoahMarkingContext* const _mark_context; + protected: + ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq = NULL); + + template <class T, bool STRING_DEDUP, bool DEGEN, bool ATOMIC_UPDATE> + void work(T* p); + + }; + + class ShenandoahTraversalRootsClosure : public ShenandoahTraversalSuperClosure { + private: + template <class T> + inline void do_oop_work(T* p) { work<T, false, false, false>(p); } + + public: + ShenandoahTraversalRootsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : + ShenandoahTraversalSuperClosure(q, rp) {} + + virtual void do_oop(narrowOop* p) { do_oop_work(p); } + virtual void do_oop(oop* p) { do_oop_work(p); } + + virtual bool do_metadata() { return false; } + }; + + class ShenandoahTraversalClosure : public ShenandoahTraversalSuperClosure { + private: + template <class T> + inline void do_oop_work(T* p) { work<T, false, false, true>(p); } + + public: + ShenandoahTraversalClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : + ShenandoahTraversalSuperClosure(q, rp) {} + + virtual void do_oop(narrowOop* p) { do_oop_work(p); } + virtual void do_oop(oop* p) { do_oop_work(p); } + + virtual bool do_metadata() { return false; } + }; + + class ShenandoahTraversalMetadataClosure : public ShenandoahTraversalSuperClosure { + private: + template <class T> + inline void do_oop_work(T* p) { work<T, false, false, true>(p); } + + public: + ShenandoahTraversalMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : + ShenandoahTraversalSuperClosure(q, rp) {} + + virtual void do_oop(narrowOop* p) { do_oop_work(p); } + virtual void do_oop(oop* p) { do_oop_work(p); } + + virtual bool do_metadata() { return true; } + }; + + class ShenandoahTraversalDedupClosure : public ShenandoahTraversalSuperClosure { + private: + template <class T> + inline void do_oop_work(T* p) { work<T, true, false, true>(p); } + + public: + ShenandoahTraversalDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) : + ShenandoahTraversalSuperClosure(q, rp, dq) {} + + virtual void do_oop(narrowOop* p) { do_oop_work(p); } + virtual void do_oop(oop* p) { do_oop_work(p); } + + virtual bool do_metadata() { return false; } + }; + + class ShenandoahTraversalMetadataDedupClosure : public ShenandoahTraversalSuperClosure { + private: + template <class T> + inline void do_oop_work(T* p) { work<T, true, false, true>(p); } + + public: + ShenandoahTraversalMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) : + ShenandoahTraversalSuperClosure(q, rp, dq) {} + + virtual void do_oop(narrowOop* p) { do_oop_work(p); } + virtual void do_oop(oop* p) { do_oop_work(p); } + + virtual bool do_metadata() { return true; } + }; + + class ShenandoahTraversalDegenClosure : public ShenandoahTraversalSuperClosure { + private: + template <class T> + inline void do_oop_work(T* p) { work<T, false, true, false>(p); } + + public: + ShenandoahTraversalDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : + ShenandoahTraversalSuperClosure(q, rp) {} + + virtual void do_oop(narrowOop* p) { do_oop_work(p); } + virtual void do_oop(oop* p) { do_oop_work(p); } + + virtual bool do_metadata() { return false; } + }; + + class ShenandoahTraversalMetadataDegenClosure : public ShenandoahTraversalSuperClosure { + private: + template <class T> + inline void do_oop_work(T* p) { work<T, false, true, false>(p); } + + public: + ShenandoahTraversalMetadataDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) : + ShenandoahTraversalSuperClosure(q, rp) {} + + virtual void do_oop(narrowOop* p) { do_oop_work(p); } + virtual void do_oop(oop* p) { do_oop_work(p); } + + virtual bool do_metadata() { return true; } + }; + + class ShenandoahTraversalDedupDegenClosure : public ShenandoahTraversalSuperClosure { + private: + template <class T> + inline void do_oop_work(T* p) { work<T, true, true, false>(p); } + + public: + ShenandoahTraversalDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) : + ShenandoahTraversalSuperClosure(q, rp, dq) {} + + virtual void do_oop(narrowOop* p) { do_oop_work(p); } + virtual void do_oop(oop* p) { do_oop_work(p); } + + virtual bool do_metadata() { return false; } + }; + + class ShenandoahTraversalMetadataDedupDegenClosure : public ShenandoahTraversalSuperClosure { + private: + template <class T> + inline void do_oop_work(T* p) { work<T, true, true, false>(p); } + + public: + ShenandoahTraversalMetadataDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) : + ShenandoahTraversalSuperClosure(q, rp, dq) {} + + virtual void do_oop(narrowOop* p) { do_oop_work(p); } + virtual void do_oop(oop* p) { do_oop_work(p); } + + virtual bool do_metadata() { return true; } + }; + #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
< prev index next >