< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahOopClosures.hpp

Print this page
rev 51546 : Some optimization to traversal-marking
rev 51548 : Avoid indirection to next-mark-context


  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 


< prev index next >