src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.hpp
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 55015 738285c4d1e1
child 58679 9c3209ff7550
equal deleted inserted replaced
58677:13588c901957 58678:9cf78a70fa4f
    39     EVAC_BARRIER
    39     EVAC_BARRIER
    40   };
    40   };
    41 private:
    41 private:
    42 
    42 
    43   ShenandoahHeap* _heap;
    43   ShenandoahHeap* _heap;
       
    44   BufferNode::Allocator _satb_mark_queue_buffer_allocator;
    44   ShenandoahSATBMarkQueueSet _satb_mark_queue_set;
    45   ShenandoahSATBMarkQueueSet _satb_mark_queue_set;
    45 
    46 
    46 public:
    47 public:
    47   ShenandoahBarrierSet(ShenandoahHeap* heap);
    48   ShenandoahBarrierSet(ShenandoahHeap* heap);
    48 
    49 
    60 
    61 
    61   bool is_a(BarrierSet::Name bsn);
    62   bool is_a(BarrierSet::Name bsn);
    62 
    63 
    63   bool is_aligned(HeapWord* hw);
    64   bool is_aligned(HeapWord* hw);
    64 
    65 
    65   void write_ref_array(HeapWord* start, size_t count);
    66   template <class T> void
       
    67   write_ref_array_pre_work(T* src, T* dst, size_t count, bool dest_uninitialized);
    66 
    68 
    67   template <class T> void
    69   inline void arraycopy_pre(oop* src, oop* dst, size_t count);
    68   write_ref_array_pre_work(T* dst, size_t count);
    70   inline void arraycopy_pre(narrowOop* src, narrowOop* dst, size_t count);
    69 
    71   inline void arraycopy_update(oop* src, size_t count);
    70   void write_ref_array_pre(oop* dst, size_t count, bool dest_uninitialized);
    72   inline void arraycopy_update(narrowOop* src, size_t count);
    71 
    73   inline void clone_barrier(oop src);
    72   void write_ref_array_pre(narrowOop* dst, size_t count, bool dest_uninitialized);
    74   void clone_barrier_runtime(oop src);
    73 
    75 
    74   // We export this to make it available in cases where the static
    76   // We export this to make it available in cases where the static
    75   // type of the barrier set is known.  Note that it is non-virtual.
    77   // type of the barrier set is known.  Note that it is non-virtual.
    76   template <class T> inline void inline_write_ref_field_pre(T* field, oop new_val);
    78   template <class T> inline void inline_write_ref_field_pre(T* field, oop new_val);
    77 
    79 
    79   void write_ref_field_pre_work(oop* field, oop new_val);
    81   void write_ref_field_pre_work(oop* field, oop new_val);
    80   void write_ref_field_pre_work(narrowOop* field, oop new_val);
    82   void write_ref_field_pre_work(narrowOop* field, oop new_val);
    81   void write_ref_field_pre_work(void* field, oop new_val);
    83   void write_ref_field_pre_work(void* field, oop new_val);
    82 
    84 
    83   void write_ref_field_work(void* v, oop o, bool release = false);
    85   void write_ref_field_work(void* v, oop o, bool release = false);
    84   void write_region(MemRegion mr);
    86 
       
    87   oop oop_load_from_native_barrier(oop obj);
    85 
    88 
    86   virtual void on_thread_create(Thread* thread);
    89   virtual void on_thread_create(Thread* thread);
    87   virtual void on_thread_destroy(Thread* thread);
    90   virtual void on_thread_destroy(Thread* thread);
    88   virtual void on_thread_attach(Thread* thread);
    91   virtual void on_thread_attach(Thread* thread);
    89   virtual void on_thread_detach(Thread* thread);
    92   virtual void on_thread_detach(Thread* thread);
    93 
    96 
    94   void storeval_barrier(oop obj);
    97   void storeval_barrier(oop obj);
    95   void keep_alive_barrier(oop obj);
    98   void keep_alive_barrier(oop obj);
    96 
    99 
    97   oop load_reference_barrier(oop obj);
   100   oop load_reference_barrier(oop obj);
    98   oop load_reference_barrier_mutator(oop obj);
       
    99   oop load_reference_barrier_not_null(oop obj);
   101   oop load_reference_barrier_not_null(oop obj);
       
   102 
       
   103   oop load_reference_barrier_mutator(oop obj, oop* load_addr);
       
   104   oop load_reference_barrier_mutator(oop obj, narrowOop* load_addr);
       
   105 
       
   106   template <class T>
       
   107   oop load_reference_barrier_mutator_work(oop obj, T* load_addr);
   100 
   108 
   101   void enqueue(oop obj);
   109   void enqueue(oop obj);
   102 
   110 
   103 private:
   111 private:
   104   template <class T, bool STOREVAL_WRITE_BARRIER>
   112   template <class T>
   105   void write_ref_array_loop(HeapWord* start, size_t count);
   113   inline void arraycopy_pre_work(T* src, T* dst, size_t count);
       
   114   template <class T, bool HAS_FWD, bool EVAC, bool ENQUEUE>
       
   115   inline void arraycopy_work(T* src, size_t count);
       
   116   template <class T>
       
   117   inline void arraycopy_update_impl(T* src, size_t count);
   106 
   118 
   107   oop load_reference_barrier_impl(oop obj);
   119   oop load_reference_barrier_impl(oop obj);
   108 
   120 
   109   static void keep_alive_if_weak(DecoratorSet decorators, oop value) {
   121   static void keep_alive_if_weak(DecoratorSet decorators, oop value) {
   110     assert((decorators & ON_UNKNOWN_OOP_REF) == 0, "Reference strength must be known");
   122     assert((decorators & ON_UNKNOWN_OOP_REF) == 0, "Reference strength must be known");
   112     const bool peek              = (decorators & AS_NO_KEEPALIVE) != 0;
   124     const bool peek              = (decorators & AS_NO_KEEPALIVE) != 0;
   113     if (!peek && !on_strong_oop_ref && value != NULL) {
   125     if (!peek && !on_strong_oop_ref && value != NULL) {
   114       ShenandoahBarrierSet::barrier_set()->keep_alive_barrier(value);
   126       ShenandoahBarrierSet::barrier_set()->keep_alive_barrier(value);
   115     }
   127     }
   116   }
   128   }
   117 
       
   118   template <typename T>
       
   119   bool arraycopy_loop_1(T* src, T* dst, size_t length, Klass* bound,
       
   120                         bool checkcast, bool satb, bool disjoint, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
       
   121 
       
   122   template <typename T, bool CHECKCAST>
       
   123   bool arraycopy_loop_2(T* src, T* dst, size_t length, Klass* bound,
       
   124                         bool satb, bool disjoint, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
       
   125 
       
   126   template <typename T, bool CHECKCAST, bool SATB>
       
   127   bool arraycopy_loop_3(T* src, T* dst, size_t length, Klass* bound,
       
   128                         bool disjoint, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode);
       
   129 
       
   130   template <typename T, bool CHECKCAST, bool SATB, ShenandoahBarrierSet::ArrayCopyStoreValMode STOREVAL_MODE>
       
   131   bool arraycopy_loop(T* src, T* dst, size_t length, Klass* bound, bool disjoint);
       
   132 
       
   133   template <typename T, bool CHECKCAST, bool SATB, ShenandoahBarrierSet::ArrayCopyStoreValMode STOREVAL_MODE>
       
   134   bool arraycopy_element(T* cur_src, T* cur_dst, Klass* bound, Thread* const thread, ShenandoahMarkingContext* const ctx);
       
   135 
   129 
   136 public:
   130 public:
   137   // Callbacks for runtime accesses.
   131   // Callbacks for runtime accesses.
   138   template <DecoratorSet decorators, typename BarrierSetT = ShenandoahBarrierSet>
   132   template <DecoratorSet decorators, typename BarrierSetT = ShenandoahBarrierSet>
   139   class AccessBarrier: public BarrierSet::AccessBarrier<decorators, BarrierSetT> {
   133   class AccessBarrier: public BarrierSet::AccessBarrier<decorators, BarrierSetT> {
   175 
   169 
   176     // Needed for loads on non-heap weak references
   170     // Needed for loads on non-heap weak references
   177     template <typename T>
   171     template <typename T>
   178     static oop oop_load_not_in_heap(T* addr);
   172     static oop oop_load_not_in_heap(T* addr);
   179 
   173 
       
   174     // Used for catching bad stores
       
   175     template <typename T>
       
   176     static void oop_store_not_in_heap(T* addr, oop value);
       
   177 
   180     template <typename T>
   178     template <typename T>
   181     static oop oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value);
   179     static oop oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value);
   182 
   180 
   183     template <typename T>
   181     template <typename T>
   184     static oop oop_atomic_xchg_not_in_heap(oop new_value, T* addr);
   182     static oop oop_atomic_xchg_not_in_heap(oop new_value, T* addr);