< prev index next >
src/share/vm/gc_implementation/shenandoah/shenandoahOopClosures.hpp
Print this page
rev 11463 : Backport Traversal GC
@@ -22,15 +22,18 @@
*/
#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,6 +201,156 @@
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 >