1 /*
   2  * Copyright (c) 2015, 2018, Red Hat, Inc. All rights reserved.
   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 enum StringDedupMode {
  41   NO_DEDUP,      // Do not do anything for String deduplication
  42   ENQUEUE_DEDUP, // Enqueue candidate Strings for deduplication
  43 };
  44 
  45 class ShenandoahMarkRefsSuperClosure : public MetadataAwareOopClosure {
  46 private:
  47   ShenandoahObjToScanQueue* _queue;
  48   ShenandoahStrDedupQueue*  _dedup_queue;
  49   ShenandoahHeap* _heap;
  50   ShenandoahMarkingContext* const _mark_context;
  51 
  52 public:
  53   ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp);
  54   ShenandoahMarkRefsSuperClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp);
  55 
  56   template <class T, UpdateRefsMode UPDATE_MODE, StringDedupMode STRING_DEDUP>
  57   void work(T *p);
  58 };
  59 
  60 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
  61 public:
  62   ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
  63           ShenandoahMarkRefsSuperClosure(q, rp) {};
  64 
  65   template <class T>
  66   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, NO_DEDUP>(p); }
  67   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  68   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  69   inline bool do_metadata_nv()      { return false; }
  70   virtual bool do_metadata()        { return false; }
  71 };
  72 
  73 class ShenandoahMarkUpdateRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
  74 public:
  75   ShenandoahMarkUpdateRefsDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
  76           ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
  77 
  78   template <class T>
  79   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, ENQUEUE_DEDUP>(p); }
  80   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  81   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  82   inline bool do_metadata_nv()      { return false; }
  83   virtual bool do_metadata()        { return false; }
  84 };
  85 
  86 class ShenandoahMarkUpdateRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
  87 public:
  88   ShenandoahMarkUpdateRefsMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
  89     ShenandoahMarkRefsSuperClosure(q, rp) {};
  90 
  91   template <class T>
  92   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, NO_DEDUP>(p); }
  93   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
  94   virtual void do_oop(oop* p)       { do_oop_nv(p); }
  95   inline bool do_metadata_nv()      { return true; }
  96   virtual bool do_metadata()        { return true; }
  97 };
  98 
  99 class ShenandoahMarkUpdateRefsMetadataDedupClosure : public ShenandoahMarkRefsSuperClosure {
 100 public:
 101   ShenandoahMarkUpdateRefsMetadataDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
 102   ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
 103 
 104   template <class T>
 105   inline void do_oop_nv(T* p)       { work<T, CONCURRENT, ENQUEUE_DEDUP>(p); }
 106   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 107   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 108   inline bool do_metadata_nv()      { return true; }
 109   virtual bool do_metadata()        { return true; }
 110 };
 111 
 112 class ShenandoahMarkRefsClosure : public ShenandoahMarkRefsSuperClosure {
 113 public:
 114   ShenandoahMarkRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 115     ShenandoahMarkRefsSuperClosure(q, rp) {};
 116 
 117   template <class T>
 118   inline void do_oop_nv(T* p)       { work<T, NONE, NO_DEDUP>(p); }
 119   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 120   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 121   inline bool do_metadata_nv()      { return false; }
 122   virtual bool do_metadata()        { return false; }
 123 };
 124 
 125 class ShenandoahMarkRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
 126 public:
 127   ShenandoahMarkRefsDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
 128     ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
 129 
 130   template <class T>
 131   inline void do_oop_nv(T* p)       { work<T, NONE, ENQUEUE_DEDUP>(p); }
 132   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 133   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 134   inline bool do_metadata_nv()      { return false; }
 135   virtual bool do_metadata()        { return false; }
 136 };
 137 
 138 class ShenandoahMarkResolveRefsClosure : public ShenandoahMarkRefsSuperClosure {
 139 public:
 140   ShenandoahMarkResolveRefsClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 141     ShenandoahMarkRefsSuperClosure(q, rp) {};
 142 
 143   template <class T>
 144   inline void do_oop_nv(T* p)       { work<T, RESOLVE, NO_DEDUP>(p); }
 145   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 146   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 147   inline bool do_metadata_nv()      { return false; }
 148   virtual bool do_metadata()        { return false; }
 149 };
 150 
 151 class ShenandoahMarkResolveRefsDedupClosure : public ShenandoahMarkRefsSuperClosure {
 152 public:
 153   ShenandoahMarkResolveRefsDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
 154     ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
 155 
 156   template <class T>
 157   inline void do_oop_nv(T* p)       { work<T, RESOLVE, ENQUEUE_DEDUP>(p); }
 158   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 159   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 160   inline bool do_metadata_nv()      { return false; }
 161   virtual bool do_metadata()        { return false; }
 162 };
 163 
 164 class ShenandoahMarkRefsMetadataClosure : public ShenandoahMarkRefsSuperClosure {
 165 public:
 166   ShenandoahMarkRefsMetadataClosure(ShenandoahObjToScanQueue* q, ReferenceProcessor* rp) :
 167     ShenandoahMarkRefsSuperClosure(q, rp) {};
 168 
 169   template <class T>
 170   inline void do_oop_nv(T* p)       { work<T, NONE, NO_DEDUP>(p); }
 171   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 172   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 173   inline bool do_metadata_nv()      { return true; }
 174   virtual bool do_metadata()        { return true; }
 175 };
 176 
 177 class ShenandoahMarkRefsMetadataDedupClosure : public ShenandoahMarkRefsSuperClosure {
 178 public:
 179   ShenandoahMarkRefsMetadataDedupClosure(ShenandoahObjToScanQueue* q, ShenandoahStrDedupQueue* dq, ReferenceProcessor* rp) :
 180     ShenandoahMarkRefsSuperClosure(q, dq, rp) {};
 181 
 182   template <class T>
 183   inline void do_oop_nv(T* p)       { work<T, NONE, ENQUEUE_DEDUP>(p); }
 184   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 185   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 186   inline bool do_metadata_nv()      { return true; }
 187   virtual bool do_metadata()        { return true; }
 188 };
 189 
 190 class ShenandoahUpdateHeapRefsClosure : public ExtendedOopClosure {
 191 private:
 192   ShenandoahHeap* _heap;
 193 public:
 194   ShenandoahUpdateHeapRefsClosure();
 195 
 196   template <class T>
 197   void do_oop_nv(T* p);
 198 
 199   virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
 200   virtual void do_oop(oop* p)       { do_oop_nv(p); }
 201 };
 202 
 203 #endif // SHARE_VM_GC_SHENANDOAH_SHENANDOAHOOPCLOSURES_HPP