< prev index next >

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

Print this page
rev 13055 : Implement barriers for maintaining connection matrix.


  13  *
  14  * You should have received a copy of the GNU General Public License version
  15  * 2 along with this work; if not, write to the Free Software Foundation,
  16  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  17  *
  18  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  19  * or visit www.oracle.com if you need additional information or have any
  20  * questions.
  21  *
  22  */
  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 typedef BufferedOverflowTaskQueue<ObjArrayChunkedTask, mtGC> ShenandoahBufferedOverflowTaskQueue;
  30 typedef Padded<ShenandoahBufferedOverflowTaskQueue> SCMObjToScanQueue;
  31 
  32 class ShenandoahHeap;

  33 
  34 enum UpdateRefsMode {
  35   NONE,       // No reference updating
  36   RESOLVE,    // Only a read-barrier (no reference updating)
  37   SIMPLE,     // Reference updating using simple store
  38   CONCURRENT  // Reference updating using CAS
  39 };
  40 
  41 class ShenandoahMarkRefsSuperClosure : public MetadataAwareOopClosure {
  42 private:
  43   SCMObjToScanQueue* _queue;
  44   ShenandoahHeap* _heap;

  45 public:
  46   ShenandoahMarkRefsSuperClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp);
  47 
  48   template <class T, UpdateRefsMode UPDATE_MODE>
  49   void work(T *p);
  50 };
  51 
  52 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
  53 public:
  54   ShenandoahMarkUpdateRefsClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
  55           ShenandoahMarkRefsSuperClosure(q, rp) {};
  56 
  57   template <class T>
  58   inline void do_oop_nv(T* p)       { work<T, CONCURRENT>(p); }
  59   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  60   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  61   inline bool do_metadata_nv()      { return false; }
  62   virtual bool do_metadata()        { return false; }
  63 };
  64 
  65 class ShenandoahMarkUpdateRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
  66 public:
  67   ShenandoahMarkUpdateRefsMetadataClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
  68           ShenandoahMarkRefsSuperClosure(q, rp) {};
  69 
  70   template <class T>
  71   inline void do_oop_nv(T* p)       { work<T, CONCURRENT>(p); }
  72   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  73   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  74   inline bool do_metadata_nv()      { return true; }
  75   virtual bool do_metadata()        { return true; }
  76 };
  77 
  78 class ShenandoahMarkRefsClosure : public ShenandoahMarkRefsSuperClosure {
  79 public:
  80   ShenandoahMarkRefsClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
  81     ShenandoahMarkRefsSuperClosure(q, rp) {};
  82 
  83   template <class T>
  84   inline void do_oop_nv(T* p)       { work<T, NONE>(p); }
  85   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  86   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  87   inline bool do_metadata_nv()      { return false; }
  88   virtual bool do_metadata()        { return false; }
  89 };
  90 
  91 class ShenandoahMarkResolveRefsClosure : public ShenandoahMarkRefsSuperClosure {
  92 public:
  93   ShenandoahMarkResolveRefsClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
  94     ShenandoahMarkRefsSuperClosure(q, rp) {};
  95 
  96   template <class T>
  97   inline void do_oop_nv(T* p)       { work<T, RESOLVE>(p); }
  98   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  99   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 100   inline bool do_metadata_nv()      { return false; }
 101   virtual bool do_metadata()        { return false; }
 102 };
 103 
 104 class ShenandoahMarkRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
 105 public:
 106   ShenandoahMarkRefsMetadataClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
 107     ShenandoahMarkRefsSuperClosure(q, rp) {};
 108 
 109   template <class T>
 110   inline void do_oop_nv(T* p)       { work<T, NONE>(p); }




















































 111   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 112   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 113   inline bool do_metadata_nv()      { return true; }
 114   virtual bool do_metadata()        { return true; }
 115 };
 116 
 117 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP


  13  *
  14  * You should have received a copy of the GNU General Public License version
  15  * 2 along with this work; if not, write to the Free Software Foundation,
  16  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  17  *
  18  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  19  * or visit www.oracle.com if you need additional information or have any
  20  * questions.
  21  *
  22  */
  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 typedef BufferedOverflowTaskQueue<ObjArrayChunkedTask, mtGC> ShenandoahBufferedOverflowTaskQueue;
  30 typedef Padded<ShenandoahBufferedOverflowTaskQueue> SCMObjToScanQueue;
  31 
  32 class ShenandoahHeap;
  33 class ShenandoahConnectionMatrix;
  34 
  35 enum UpdateRefsMode {
  36   NONE,       // No reference updating
  37   RESOLVE,    // Only a read-barrier (no reference updating)
  38   SIMPLE,     // Reference updating using simple store
  39   CONCURRENT  // Reference updating using CAS
  40 };
  41 
  42 class ShenandoahMarkRefsSuperClosure : public MetadataAwareOopClosure {
  43 private:
  44   SCMObjToScanQueue* _queue;
  45   ShenandoahHeap* _heap;
  46   ShenandoahConnectionMatrix* _conn_matrix;
  47 public:
  48   ShenandoahMarkRefsSuperClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp);
  49 
  50   template <class T, UpdateRefsMode UPDATE_MODE, bool UPDATE_MATRIX>
  51   void work(T *p);
  52 };
  53 
  54 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
  55 public:
  56   ShenandoahMarkUpdateRefsClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
  57           ShenandoahMarkRefsSuperClosure(q, rp) {};
  58 
  59   template <class T>
  60   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, false>(p); }
  61   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  62   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  63   inline bool do_metadata_nv()      { return false; }
  64   virtual bool do_metadata()        { return false; }
  65 };
  66 
  67 class ShenandoahMarkUpdateRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
  68 public:
  69   ShenandoahMarkUpdateRefsMetadataClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
  70           ShenandoahMarkRefsSuperClosure(q, rp) {};
  71 
  72   template <class T>
  73   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, false>(p); }
  74   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  75   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  76   inline bool do_metadata_nv()      { return true; }
  77   virtual bool do_metadata()        { return true; }
  78 };
  79 
  80 class ShenandoahMarkRefsClosure : public ShenandoahMarkRefsSuperClosure {
  81 public:
  82   ShenandoahMarkRefsClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
  83     ShenandoahMarkRefsSuperClosure(q, rp) {};
  84 
  85   template <class T>
  86   inline void do_oop_nv(T* p)       { work<T, NONE, false>(p); }
  87   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  88   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  89   inline bool do_metadata_nv()      { return false; }
  90   virtual bool do_metadata()        { return false; }
  91 };
  92 
  93 class ShenandoahMarkResolveRefsClosure : public ShenandoahMarkRefsSuperClosure {
  94 public:
  95   ShenandoahMarkResolveRefsClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
  96     ShenandoahMarkRefsSuperClosure(q, rp) {};
  97 
  98   template <class T>
  99   inline void do_oop_nv(T* p)       { work<T, RESOLVE, false>(p); }
 100   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 101   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 102   inline bool do_metadata_nv()      { return false; }
 103   virtual bool do_metadata()        { return false; }
 104 };
 105 
 106 class ShenandoahMarkRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
 107 public:
 108   ShenandoahMarkRefsMetadataClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
 109     ShenandoahMarkRefsSuperClosure(q, rp) {};
 110 
 111   template <class T>
 112   inline void do_oop_nv(T* p)       { work<T, NONE, false>(p); }
 113   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 114   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 115   inline bool do_metadata_nv()      { return true; }
 116   virtual bool do_metadata()        { return true; }
 117 };
 118 
 119 class ShenandoahMarkUpdateRefsMatrixClosure : public ShenandoahMarkRefsSuperClosure {
 120 public:
 121   ShenandoahMarkUpdateRefsMatrixClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
 122           ShenandoahMarkRefsSuperClosure(q, rp) {};
 123 
 124   template <class T>
 125   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, true>(p); }
 126   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 127   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 128   inline bool do_metadata_nv()      { return false; }
 129   virtual bool do_metadata()        { return false; }
 130 };
 131 
 132 class ShenandoahMarkUpdateRefsMetadataMatrixClosure : public ShenandoahMarkRefsSuperClosure {
 133 public:
 134   ShenandoahMarkUpdateRefsMetadataMatrixClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
 135           ShenandoahMarkRefsSuperClosure(q, rp) {};
 136 
 137   template <class T>
 138   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, true>(p); }
 139   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 140   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 141   inline bool do_metadata_nv()      { return true; }
 142   virtual bool do_metadata()        { return true; }
 143 };
 144 
 145 class ShenandoahMarkRefsMatrixClosure : public ShenandoahMarkRefsSuperClosure {
 146 public:
 147   ShenandoahMarkRefsMatrixClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
 148     ShenandoahMarkRefsSuperClosure(q, rp) {};
 149 
 150   template <class T>
 151   inline void do_oop_nv(T* p)       { work<T, NONE, true>(p); }
 152   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 153   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 154   inline bool do_metadata_nv()      { return false; }
 155   virtual bool do_metadata()        { return false; }
 156 };
 157 
 158 class ShenandoahMarkRefsMetadataMatrixClosure : public ShenandoahMarkRefsSuperClosure {
 159 public:
 160   ShenandoahMarkRefsMetadataMatrixClosure(SCMObjToScanQueue* q, ReferenceProcessor* rp) :
 161     ShenandoahMarkRefsSuperClosure(q, rp) {};
 162 
 163   template <class T>
 164   inline void do_oop_nv(T* p)       { work<T, NONE, true>(p); }
 165   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 166   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 167   inline bool do_metadata_nv()      { return true; }
 168   virtual bool do_metadata()        { return true; }
 169 };
 170 
 171 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP
< prev index next >