23
24 #ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
26
27 #include "gc/shenandoah/shenandoahTaskqueue.hpp"
28
29 class ShenandoahHeap;
30 class ShenandoahStrDedupQueue;
31
32 enum UpdateRefsMode {
33 NONE, // No reference updating
34 RESOLVE, // Only a read-barrier (no reference updating)
35 SIMPLE, // Reference updating using simple store
36 CONCURRENT // Reference updating using CAS
37 };
38
39 class ShenandoahMarkRefsSuperClosure : public MetadataVisitingOopIterateClosure {
40 private:
41 ShenandoahObjToScanQueue* _queue;
42 ShenandoahHeap* _heap;
43
44 protected:
45 template <class T, UpdateRefsMode UPDATE_MODE, bool STRING_DEDUP>
46 void work(T *p);
47
48 public:
49 ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp);
50
51 inline void set_base_object(oop obj) { /* Not needed */ }
52 };
53
54 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
55 private:
56 template <class T>
57 inline void do_oop_work(T* p) { work<T, CONCURRENT, false /* string dedup */>(p); }
58
59 public:
60 ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
61 ShenandoahMarkRefsSuperClosure(q, rp) {};
62
212
213 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
214 virtual void do_oop(oop* p) { do_oop_work(p); }
215 };
216
217 class ShenandoahUpdateHeapRefsMatrixClosure : public ShenandoahUpdateHeapRefsSuperClosure {
218 public:
219 ShenandoahUpdateHeapRefsMatrixClosure() : ShenandoahUpdateHeapRefsSuperClosure() {}
220
221 template <class T>
222 inline void do_oop_work(T* p) { work<T, true>(p); }
223 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
224 virtual void do_oop(oop* p) { do_oop_work(p); }
225 };
226
227 class ShenandoahTraversalSuperClosure : public MetadataVisitingOopIterateClosure {
228 private:
229 ShenandoahTraversalGC* const _traversal_gc;
230 Thread* const _thread;
231 ShenandoahObjToScanQueue* const _queue;
232 oop _base_obj;
233 protected:
234 ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
235 MetadataVisitingOopIterateClosure(rp),
236 _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
237 _thread(Thread::current()), _queue(q), _base_obj(NULL) {
238 }
239
240 template <class T, bool STRING_DEDUP, bool DEGEN, bool MATRIX>
241 void work(T* p);
242
243 public:
244 inline void set_base_object(oop obj) {
245 _base_obj = obj;
246 }
247 };
248
249 class ShenandoahTraversalClosure : public ShenandoahTraversalSuperClosure {
250 private:
251 template <class T>
252 inline void do_oop_work(T* p) { work<T, false, false, false>(p); }
253
254 public:
255 ShenandoahTraversalClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
256 ShenandoahTraversalSuperClosure(q, rp) {}
257
|
23
24 #ifndef SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
26
27 #include "gc/shenandoah/shenandoahTaskqueue.hpp"
28
29 class ShenandoahHeap;
30 class ShenandoahStrDedupQueue;
31
32 enum UpdateRefsMode {
33 NONE, // No reference updating
34 RESOLVE, // Only a read-barrier (no reference updating)
35 SIMPLE, // Reference updating using simple store
36 CONCURRENT // Reference updating using CAS
37 };
38
39 class ShenandoahMarkRefsSuperClosure : public MetadataVisitingOopIterateClosure {
40 private:
41 ShenandoahObjToScanQueue* _queue;
42 ShenandoahHeap* _heap;
43 ShenandoahMarkingContext* const _mark_context;
44
45 protected:
46 template <class T, UpdateRefsMode UPDATE_MODE, bool STRING_DEDUP>
47 void work(T *p);
48
49 public:
50 ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp);
51
52 inline void set_base_object(oop obj) { /* Not needed */ }
53 };
54
55 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
56 private:
57 template <class T>
58 inline void do_oop_work(T* p) { work<T, CONCURRENT, false /* string dedup */>(p); }
59
60 public:
61 ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
62 ShenandoahMarkRefsSuperClosure(q, rp) {};
63
213
214 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
215 virtual void do_oop(oop* p) { do_oop_work(p); }
216 };
217
218 class ShenandoahUpdateHeapRefsMatrixClosure : public ShenandoahUpdateHeapRefsSuperClosure {
219 public:
220 ShenandoahUpdateHeapRefsMatrixClosure() : ShenandoahUpdateHeapRefsSuperClosure() {}
221
222 template <class T>
223 inline void do_oop_work(T* p) { work<T, true>(p); }
224 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
225 virtual void do_oop(oop* p) { do_oop_work(p); }
226 };
227
228 class ShenandoahTraversalSuperClosure : public MetadataVisitingOopIterateClosure {
229 private:
230 ShenandoahTraversalGC* const _traversal_gc;
231 Thread* const _thread;
232 ShenandoahObjToScanQueue* const _queue;
233 ShenandoahMarkingContext* const _mark_context;
234 oop _base_obj;
235 protected:
236 ShenandoahTraversalSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
237 MetadataVisitingOopIterateClosure(rp),
238 _traversal_gc(ShenandoahHeap::heap()->traversal_gc()),
239 _thread(Thread::current()), _queue(q),
240 _mark_context(ShenandoahHeap::heap()->next_marking_context()),
241 _base_obj(NULL) {
242 }
243
244 template <class T, bool STRING_DEDUP, bool DEGEN, bool MATRIX>
245 void work(T* p);
246
247 public:
248 inline void set_base_object(oop obj) {
249 _base_obj = obj;
250 }
251 };
252
253 class ShenandoahTraversalClosure : public ShenandoahTraversalSuperClosure {
254 private:
255 template <class T>
256 inline void do_oop_work(T* p) { work<T, false, false, false>(p); }
257
258 public:
259 ShenandoahTraversalClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
260 ShenandoahTraversalSuperClosure(q, rp) {}
261
|