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); |