< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahOopClosures.hpp
Print this page
rev 50076 : Fold Partial GC into Traversal GC
@@ -45,10 +45,12 @@
ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp);
ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp);
template <class T, UpdateRefsMode UPDATE_MODE, bool STRING_DEDUP>
void work(T *p);
+
+ inline void set_base_object(oop obj) { /* Not needed */ }
};
class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
public:
ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
@@ -208,58 +210,46 @@
inline void do_oop_nv(T* p) { work<T, true>(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
virtual void do_oop(oop* p) { do_oop_nv(p); }
};
-class ShenandoahPartialEvacuateUpdateHeapClosure : public ExtendedOopClosure {
-private:
- ShenandoahPartialGC* _partial_gc;
- Thread* _thread;
- ShenandoahObjToScanQueue* _queue;
-public:
- ShenandoahPartialEvacuateUpdateHeapClosure(ShenandoahObjToScanQueue* q) :
- _partial_gc(ShenandoahHeap::heap()->partial_gc()),
- _thread(Thread::current()), _queue(q) {}
-
- template <class T>
- void do_oop_nv(T* p);
-
- void do_oop(oop* p) { do_oop_nv(p); }
- void do_oop(narrowOop* p) { do_oop_nv(p); }
-};
-
class ShenandoahTraversalSuperClosure : public MetadataAwareOopClosure {
private:
ShenandoahTraversalGC* _traversal_gc;
Thread* _thread;
ShenandoahObjToScanQueue* _queue;
ShenandoahStrDedupQueue* _dedup_queue;
-
+ oop _base_obj;
protected:
ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
MetadataAwareOopClosure(rp),
_traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
- _thread(Thread::current()), _queue(q), _dedup_queue(NULL) {
+ _thread(Thread::current()), _queue(q), _dedup_queue(NULL), _base_obj(NULL) {
}
ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
MetadataAwareOopClosure(rp),
_traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
_thread(Thread::current()), _queue(q), _dedup_queue(dq) {
}
- template <class T, bool STRING_DEDUP, bool DEGEN>
+ template <class T, bool STRING_DEDUP, bool DEGEN, bool MATRIX>
void work(T* p);
+
+public:
+ inline void set_base_object(oop obj) {
+ _base_obj = obj;
+ }
};
class ShenandoahTraversalClosure : public ShenandoahTraversalSuperClosure {
public:
ShenandoahTraversalClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
ShenandoahTraversalSuperClosure(q, rp) {}
template <class T>
- inline void do_oop_nv(T* p) { work<T, false, false>(p); }
+ inline void do_oop_nv(T* p) { work<T, false, false, false>(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
virtual void do_oop(oop* p) { do_oop_nv(p); }
inline bool do_metadata_nv() { return false; }
@@ -270,11 +260,11 @@
public:
ShenandoahTraversalMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
ShenandoahTraversalSuperClosure(q, rp) {}
template <class T>
- inline void do_oop_nv(T* p) { work<T, false, false>(p); }
+ inline void do_oop_nv(T* p) { work<T, false, false, false>(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
virtual void do_oop(oop* p) { do_oop_nv(p); }
inline bool do_metadata_nv() { return true; }
@@ -285,11 +275,11 @@
public:
ShenandoahTraversalDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
ShenandoahTraversalSuperClosure(q, rp, dq) {}
template <class T>
- inline void do_oop_nv(T* p) { work<T, true, false>(p); }
+ inline void do_oop_nv(T* p) { work<T, true, false, false>(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
virtual void do_oop(oop* p) { do_oop_nv(p); }
inline bool do_metadata_nv() { return false; }
@@ -300,11 +290,11 @@
public:
ShenandoahTraversalMetadataDedupClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
ShenandoahTraversalSuperClosure(q, rp, dq) {}
template <class T>
- inline void do_oop_nv(T* p) { work<T, true, false>(p); }
+ inline void do_oop_nv(T* p) { work<T, true, false, false>(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
virtual void do_oop(oop* p) { do_oop_nv(p); }
inline bool do_metadata_nv() { return true; }
@@ -315,11 +305,11 @@
public:
ShenandoahTraversalDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
ShenandoahTraversalSuperClosure(q, rp) {}
template <class T>
- inline void do_oop_nv(T* p) { work<T, false, true>(p); }
+ inline void do_oop_nv(T* p) { work<T, false, true, false>(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
virtual void do_oop(oop* p) { do_oop_nv(p); }
inline bool do_metadata_nv() { return false; }
@@ -330,11 +320,11 @@
public:
ShenandoahTraversalMetadataDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
ShenandoahTraversalSuperClosure(q, rp) {}
template <class T>
- inline void do_oop_nv(T* p) { work<T, false, true>(p); }
+ inline void do_oop_nv(T* p) { work<T, false, true, false>(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
virtual void do_oop(oop* p) { do_oop_nv(p); }
inline bool do_metadata_nv() { return true; }
@@ -345,11 +335,11 @@
public:
ShenandoahTraversalDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
ShenandoahTraversalSuperClosure(q, rp, dq) {}
template <class T>
- inline void do_oop_nv(T* p) { work<T, true, true>(p); }
+ inline void do_oop_nv(T* p) { work<T, true, true, false>(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
virtual void do_oop(oop* p) { do_oop_nv(p); }
inline bool do_metadata_nv() { return false; }
@@ -360,11 +350,131 @@
public:
ShenandoahTraversalMetadataDedupDegenClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
ShenandoahTraversalSuperClosure(q, rp, dq) {}
template <class T>
- inline void do_oop_nv(T* p) { work<T, true, true>(p); }
+ inline void do_oop_nv(T* p) { work<T, true, true, false>(p); }
+
+ virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
+ virtual void do_oop(oop* p) { do_oop_nv(p); }
+
+ inline bool do_metadata_nv() { return true; }
+ virtual bool do_metadata() { return true; }
+};
+
+class ShenandoahTraversalMatrixClosure : public ShenandoahTraversalSuperClosure {
+public:
+ ShenandoahTraversalMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
+ ShenandoahTraversalSuperClosure(q, rp) {}
+
+ template <class T>
+ inline void do_oop_nv(T* p) { work<T, false, false, true>(p); }
+
+ virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
+ virtual void do_oop(oop* p) { do_oop_nv(p); }
+
+ inline bool do_metadata_nv() { return false; }
+ virtual bool do_metadata() { return false; }
+};
+
+class ShenandoahTraversalMetadataMatrixClosure : public ShenandoahTraversalSuperClosure {
+public:
+ ShenandoahTraversalMetadataMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
+ ShenandoahTraversalSuperClosure(q, rp) {}
+
+ template <class T>
+ inline void do_oop_nv(T* p) { work<T, false, false, true>(p); }
+
+ virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
+ virtual void do_oop(oop* p) { do_oop_nv(p); }
+
+ inline bool do_metadata_nv() { return true; }
+ virtual bool do_metadata() { return true; }
+};
+
+class ShenandoahTraversalDedupMatrixClosure : public ShenandoahTraversalSuperClosure {
+public:
+ ShenandoahTraversalDedupMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
+ ShenandoahTraversalSuperClosure(q, rp, dq) {}
+
+ template <class T>
+ inline void do_oop_nv(T* p) { work<T, true, false, true>(p); }
+
+ virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
+ virtual void do_oop(oop* p) { do_oop_nv(p); }
+
+ inline bool do_metadata_nv() { return false; }
+ virtual bool do_metadata() { return false; }
+};
+
+class ShenandoahTraversalMetadataDedupMatrixClosure : public ShenandoahTraversalSuperClosure {
+public:
+ ShenandoahTraversalMetadataDedupMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
+ ShenandoahTraversalSuperClosure(q, rp, dq) {}
+
+ template <class T>
+ inline void do_oop_nv(T* p) { work<T, true, false, true>(p); }
+
+ virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
+ virtual void do_oop(oop* p) { do_oop_nv(p); }
+
+ inline bool do_metadata_nv() { return true; }
+ virtual bool do_metadata() { return true; }
+};
+
+class ShenandoahTraversalDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
+public:
+ ShenandoahTraversalDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
+ ShenandoahTraversalSuperClosure(q, rp) {}
+
+ template <class T>
+ inline void do_oop_nv(T* p) { work<T, false, true, true>(p); }
+
+ virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
+ virtual void do_oop(oop* p) { do_oop_nv(p); }
+
+ inline bool do_metadata_nv() { return false; }
+ virtual bool do_metadata() { return false; }
+};
+
+class ShenandoahTraversalMetadataDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
+public:
+ ShenandoahTraversalMetadataDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
+ ShenandoahTraversalSuperClosure(q, rp) {}
+
+ template <class T>
+ inline void do_oop_nv(T* p) { work<T, false, true, true>(p); }
+
+ virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
+ virtual void do_oop(oop* p) { do_oop_nv(p); }
+
+ inline bool do_metadata_nv() { return true; }
+ virtual bool do_metadata() { return true; }
+};
+
+class ShenandoahTraversalDedupDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
+public:
+ ShenandoahTraversalDedupDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
+ ShenandoahTraversalSuperClosure(q, rp, dq) {}
+
+ template <class T>
+ inline void do_oop_nv(T* p) { work<T, true, true, true>(p); }
+
+ virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
+ virtual void do_oop(oop* p) { do_oop_nv(p); }
+
+ inline bool do_metadata_nv() { return false; }
+ virtual bool do_metadata() { return false; }
+};
+
+class ShenandoahTraversalMetadataDedupDegenMatrixClosure : public ShenandoahTraversalSuperClosure {
+public:
+ ShenandoahTraversalMetadataDedupDegenMatrixClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp, ShenandoahStrDedupQueue* dq) :
+ ShenandoahTraversalSuperClosure(q, rp, dq) {}
+
+ template <class T>
+ inline void do_oop_nv(T* p) { work<T, true, true, true>(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
virtual void do_oop(oop* p) { do_oop_nv(p); }
inline bool do_metadata_nv() { return true; }
< prev index next >