< prev index next >

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

Print this page
rev 50076 : Fold Partial GC into Traversal GC


  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_SHENANDOAHBARRIERSET_HPP
  25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_HPP
  26 
  27 #include "gc/shared/accessBarrierSupport.hpp"
  28 #include "gc/shared/barrierSet.hpp"
  29 #include "gc/shenandoah/shenandoahHeap.hpp"
  30 #include "gc/shenandoah/shenandoahSATBMarkQueueSet.hpp"
  31 
  32 class ShenandoahBarrierSet: public BarrierSet {
  33 private:
  34 
  35   enum ArrayCopyStoreValMode {
  36     NONE,
  37     READ_BARRIER,
  38     WRITE_BARRIER_MAYBE_ENQUEUE,
  39     WRITE_BARRIER_ALWAYS_ENQUEUE
  40   };
  41 
  42   static ShenandoahSATBMarkQueueSet _satb_mark_queue_set;
  43 
  44   ShenandoahHeap* _heap;
  45 
  46 public:
  47 
  48   ShenandoahBarrierSet(ShenandoahHeap* heap);
  49 
  50   static SATBMarkQueueSet& satb_mark_queue_set() {
  51     return _satb_mark_queue_set;
  52   }
  53 
  54   void print_on(outputStream* st) const;
  55 
  56   bool is_a(BarrierSet::Name bsn);
  57 
  58   bool is_aligned(HeapWord* hw);
  59   void resize_covered_region(MemRegion mr);


  97 
  98   virtual oop write_barrier(oop obj);
  99   static oopDesc* write_barrier_IRT(oopDesc* src);
 100   static oopDesc* write_barrier_JRT(oopDesc* src);
 101 
 102   virtual oop storeval_barrier(oop obj);
 103 
 104   virtual void keep_alive_barrier(oop obj);
 105 
 106   bool obj_equals(oop obj1, oop obj2);
 107 
 108 #ifdef ASSERT
 109   virtual void verify_safe_oop(oop p);
 110 #endif
 111 
 112   static void enqueue(oop obj);
 113 
 114 private:
 115   bool need_update_refs_barrier();
 116 
 117   template <class T, bool UPDATE_MATRIX, bool STOREVAL_WRITE_BARRIER, bool ALWAYS_ENQUEUE>
 118   void write_ref_array_loop(HeapWord* start, size_t count);
 119 
 120   oop write_barrier_impl(oop obj);
 121 
 122   static void keep_alive_if_weak(DecoratorSet decorators, oop value) {
 123     assert((decorators & ON_UNKNOWN_OOP_REF) == 0, "Reference strength must be known");
 124     const bool on_strong_oop_ref = (decorators & ON_STRONG_OOP_REF) != 0;
 125     const bool peek              = (decorators & AS_NO_KEEPALIVE) != 0;
 126     if (!peek && !on_strong_oop_ref && value != NULL) {
 127       ((ShenandoahBarrierSet*) BarrierSet::barrier_set())->keep_alive_barrier(value);
 128     }
 129   }
 130 
 131   template <typename T>
 132   bool arraycopy_loop_1(T* src, T* dst, size_t length, Klass* bound,
 133                         bool checkcast, bool satb, bool matrix, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
 134 
 135   template <typename T, bool CHECKCAST>
 136   bool arraycopy_loop_2(T* src, T* dst, size_t length, Klass* bound,
 137                         bool satb, bool matrix, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);




  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_SHENANDOAHBARRIERSET_HPP
  25 #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_HPP
  26 
  27 #include "gc/shared/accessBarrierSupport.hpp"
  28 #include "gc/shared/barrierSet.hpp"
  29 #include "gc/shenandoah/shenandoahHeap.hpp"
  30 #include "gc/shenandoah/shenandoahSATBMarkQueueSet.hpp"
  31 
  32 class ShenandoahBarrierSet: public BarrierSet {
  33 private:
  34 
  35   enum ArrayCopyStoreValMode {
  36     NONE,
  37     READ_BARRIER,
  38     WRITE_BARRIER

  39   };
  40 
  41   static ShenandoahSATBMarkQueueSet _satb_mark_queue_set;
  42 
  43   ShenandoahHeap* _heap;
  44 
  45 public:
  46 
  47   ShenandoahBarrierSet(ShenandoahHeap* heap);
  48 
  49   static SATBMarkQueueSet& satb_mark_queue_set() {
  50     return _satb_mark_queue_set;
  51   }
  52 
  53   void print_on(outputStream* st) const;
  54 
  55   bool is_a(BarrierSet::Name bsn);
  56 
  57   bool is_aligned(HeapWord* hw);
  58   void resize_covered_region(MemRegion mr);


  96 
  97   virtual oop write_barrier(oop obj);
  98   static oopDesc* write_barrier_IRT(oopDesc* src);
  99   static oopDesc* write_barrier_JRT(oopDesc* src);
 100 
 101   virtual oop storeval_barrier(oop obj);
 102 
 103   virtual void keep_alive_barrier(oop obj);
 104 
 105   bool obj_equals(oop obj1, oop obj2);
 106 
 107 #ifdef ASSERT
 108   virtual void verify_safe_oop(oop p);
 109 #endif
 110 
 111   static void enqueue(oop obj);
 112 
 113 private:
 114   bool need_update_refs_barrier();
 115 
 116   template <class T, bool UPDATE_MATRIX, bool STOREVAL_WRITE_BARRIER>
 117   void write_ref_array_loop(HeapWord* start, size_t count);
 118 
 119   oop write_barrier_impl(oop obj);
 120 
 121   static void keep_alive_if_weak(DecoratorSet decorators, oop value) {
 122     assert((decorators & ON_UNKNOWN_OOP_REF) == 0, "Reference strength must be known");
 123     const bool on_strong_oop_ref = (decorators & ON_STRONG_OOP_REF) != 0;
 124     const bool peek              = (decorators & AS_NO_KEEPALIVE) != 0;
 125     if (!peek && !on_strong_oop_ref && value != NULL) {
 126       ((ShenandoahBarrierSet*) BarrierSet::barrier_set())->keep_alive_barrier(value);
 127     }
 128   }
 129 
 130   template <typename T>
 131   bool arraycopy_loop_1(T* src, T* dst, size_t length, Klass* bound,
 132                         bool checkcast, bool satb, bool matrix, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
 133 
 134   template <typename T, bool CHECKCAST>
 135   bool arraycopy_loop_2(T* src, T* dst, size_t length, Klass* bound,
 136                         bool satb, bool matrix, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);


< prev index next >