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