1 /*
   2  * Copyright (c) 2015, Red Hat, Inc. and/or its affiliates.
   3  *
   4  * This code is free software; you can redistribute it and/or modify it
   5  * under the terms of the GNU General Public License version 2 only, as
   6  * published by the Free Software Foundation.
   7  *
   8  * This code is distributed in the hope that it will be useful, but WITHOUT
   9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  11  * version 2 for more details (a copy is included in the LICENSE file that
  12  * accompanied this code).
  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_implementation/shenandoah/shenandoahTaskqueue.hpp"
  28 
  29 class ShenandoahHeap;
  30 class ShenandoahStrDedupQueue;
  31 class ShenandoahMarkingContext;
  32 
  33 enum UpdateRefsMode {
  34   NONE,       // No reference updating
  35   RESOLVE,    // Only a read-barrier (no reference updating)
  36   SIMPLE,     // Reference updating using simple store
  37   CONCURRENT  // Reference updating using CAS
  38 };
  39 
  40 class ShenandoahMarkRefsSuperClosure : public MetadataAwareOopClosure {
  41 private:
  42   ShenandoahObjToScanQueue* _queue;
  43   ShenandoahStrDedupQueue*  _dedup_queue;
  44   ShenandoahHeap* _heap;
  45   ShenandoahMarkingContext* const _mark_context;
  46 
  47 public:
  48   ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp);
  49   ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp);
  50 
  51   template <class T, UpdateRefsMode UPDATE_MODE, bool STRING_DEDUP>
  52   void work(T *p);
  53 };
  54 
  55 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
  56 public:
  57   ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
  58           ShenandoahMarkRefsSuperClosure(q, rp) {};
  59 
  60   template <class T>
  61   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, false /* string dedup */>(p); }
  62   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  63   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  64   inline bool do_metadata_nv()      { return false; }
  65   virtual bool do_metadata()        { return false; }
  66 };
  67 
  68 class ShenandoahMarkUpdateRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
  69 public:
  70   ShenandoahMarkUpdateRefsDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
  71           ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
  72 
  73   template <class T>
  74   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, true /* string dedup */>(p); }
  75   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  76   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  77   inline bool do_metadata_nv()      { return false; }
  78   virtual bool do_metadata()        { return false; }
  79 };
  80 
  81 class ShenandoahMarkUpdateRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
  82 public:
  83   ShenandoahMarkUpdateRefsMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
  84     ShenandoahMarkRefsSuperClosure(q, rp) {};
  85 
  86   template <class T>
  87   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, false /* string dedup */>(p); }
  88   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  89   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  90   inline bool do_metadata_nv()      { return true; }
  91   virtual bool do_metadata()        { return true; }
  92 };
  93 
  94 class ShenandoahMarkUpdateRefsMetadataDedupClosure : public ShenandoahMarkRefsSuperClosure {
  95 public:
  96   ShenandoahMarkUpdateRefsMetadataDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
  97   ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
  98 
  99   template <class T>
 100   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, true /* string dedup */>(p); }
 101   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 102   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 103   inline bool do_metadata_nv()      { return true; }
 104   virtual bool do_metadata()        { return true; }
 105 };
 106 
 107 class ShenandoahMarkRefsClosure : public ShenandoahMarkRefsSuperClosure {
 108 public:
 109   ShenandoahMarkRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 110     ShenandoahMarkRefsSuperClosure(q, rp) {};
 111 
 112   template <class T>
 113   inline void do_oop_nv(T* p)       { work<T, NONE, false /* string dedup */>(p); }
 114   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 115   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 116   inline bool do_metadata_nv()      { return false; }
 117   virtual bool do_metadata()        { return false; }
 118 };
 119 
 120 class ShenandoahMarkRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
 121 public:
 122   ShenandoahMarkRefsDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
 123     ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
 124 
 125   template <class T>
 126   inline void do_oop_nv(T* p)       { work<T, NONE, true /* string dedup */>(p); }
 127   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 128   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 129   inline bool do_metadata_nv()      { return false; }
 130   virtual bool do_metadata()        { return false; }
 131 };
 132 
 133 class ShenandoahMarkResolveRefsClosure : public ShenandoahMarkRefsSuperClosure {
 134 public:
 135   ShenandoahMarkResolveRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 136     ShenandoahMarkRefsSuperClosure(q, rp) {};
 137 
 138   template <class T>
 139   inline void do_oop_nv(T* p)       { work<T, RESOLVE, false /* string dedup */>(p); }
 140   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 141   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 142   inline bool do_metadata_nv()      { return false; }
 143   virtual bool do_metadata()        { return false; }
 144 };
 145 
 146 class ShenandoahMarkResolveRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
 147 public:
 148   ShenandoahMarkResolveRefsDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
 149     ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
 150 
 151   template <class T>
 152   inline void do_oop_nv(T* p)       { work<T, RESOLVE, true /* string dedup */>(p); }
 153   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 154   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 155   inline bool do_metadata_nv()      { return false; }
 156   virtual bool do_metadata()        { return false; }
 157 };
 158 
 159 class ShenandoahMarkRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
 160 public:
 161   ShenandoahMarkRefsMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 162     ShenandoahMarkRefsSuperClosure(q, rp) {};
 163 
 164   template <class T>
 165   inline void do_oop_nv(T* p)       { work<T, NONE, false /* string dedup */>(p); }
 166   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 167   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 168   inline bool do_metadata_nv()      { return true; }
 169   virtual bool do_metadata()        { return true; }
 170 };
 171 
 172 class ShenandoahMarkRefsMetadataDedupClosure : public ShenandoahMarkRefsSuperClosure {
 173 public:
 174   ShenandoahMarkRefsMetadataDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
 175     ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
 176 
 177   template <class T>
 178   inline void do_oop_nv(T* p)       { work<T, NONE, true /* string dedup */>(p); }
 179   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 180   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 181   inline bool do_metadata_nv()      { return true; }
 182   virtual bool do_metadata()        { return true; }
 183 };
 184 
 185 class ShenandoahUpdateHeapRefsClosure : public ExtendedOopClosure {
 186 private:
 187   ShenandoahHeap* _heap;
 188 public:
 189   ShenandoahUpdateHeapRefsClosure();
 190 
 191   template <class T>
 192   void do_oop_nv(T* p);
 193 
 194   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 195   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 196 };
 197 
 198 
 199 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP