130 return load_barrier_on_oop_field_preloaded(addr, o); |
130 return load_barrier_on_oop_field_preloaded(addr, o); |
131 } |
131 } |
132 |
132 |
133 template <DecoratorSet decorators, typename BarrierSetT> |
133 template <DecoratorSet decorators, typename BarrierSetT> |
134 template <typename T> |
134 template <typename T> |
135 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap(oop new_value, T* addr, oop compare_value) { |
135 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap(T* addr, oop compare_value, oop new_value) { |
136 verify_decorators_present<ON_STRONG_OOP_REF>(); |
136 verify_decorators_present<ON_STRONG_OOP_REF>(); |
137 verify_decorators_absent<AS_NO_KEEPALIVE>(); |
137 verify_decorators_absent<AS_NO_KEEPALIVE>(); |
138 |
138 |
139 ZBarrier::load_barrier_on_oop_field(addr); |
139 ZBarrier::load_barrier_on_oop_field(addr); |
140 return Raw::oop_atomic_cmpxchg_in_heap(new_value, addr, compare_value); |
140 return Raw::oop_atomic_cmpxchg_in_heap(addr, compare_value, new_value); |
141 } |
141 } |
142 |
142 |
143 template <DecoratorSet decorators, typename BarrierSetT> |
143 template <DecoratorSet decorators, typename BarrierSetT> |
144 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap_at(oop new_value, oop base, ptrdiff_t offset, oop compare_value) { |
144 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap_at(oop base, ptrdiff_t offset, oop compare_value, oop new_value) { |
145 verify_decorators_present<ON_STRONG_OOP_REF | ON_UNKNOWN_OOP_REF>(); |
145 verify_decorators_present<ON_STRONG_OOP_REF | ON_UNKNOWN_OOP_REF>(); |
146 verify_decorators_absent<AS_NO_KEEPALIVE>(); |
146 verify_decorators_absent<AS_NO_KEEPALIVE>(); |
147 |
147 |
148 // Through Unsafe.CompareAndExchangeObject()/CompareAndSetObject() we can receive |
148 // Through Unsafe.CompareAndExchangeObject()/CompareAndSetObject() we can receive |
149 // calls with ON_UNKNOWN_OOP_REF set. However, we treat these as ON_STRONG_OOP_REF, |
149 // calls with ON_UNKNOWN_OOP_REF set. However, we treat these as ON_STRONG_OOP_REF, |
150 // with the motivation that if you're doing Unsafe operations on a Reference.referent |
150 // with the motivation that if you're doing Unsafe operations on a Reference.referent |
151 // field, then you're on your own anyway. |
151 // field, then you're on your own anyway. |
152 ZBarrier::load_barrier_on_oop_field(field_addr(base, offset)); |
152 ZBarrier::load_barrier_on_oop_field(field_addr(base, offset)); |
153 return Raw::oop_atomic_cmpxchg_in_heap_at(new_value, base, offset, compare_value); |
153 return Raw::oop_atomic_cmpxchg_in_heap_at(base, offset, compare_value, new_value); |
154 } |
154 } |
155 |
155 |
156 template <DecoratorSet decorators, typename BarrierSetT> |
156 template <DecoratorSet decorators, typename BarrierSetT> |
157 template <typename T> |
157 template <typename T> |
158 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_xchg_in_heap(T* addr, oop new_value) { |
158 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_xchg_in_heap(T* addr, oop new_value) { |
220 return load_barrier_on_oop_field_preloaded(addr, o); |
220 return load_barrier_on_oop_field_preloaded(addr, o); |
221 } |
221 } |
222 |
222 |
223 template <DecoratorSet decorators, typename BarrierSetT> |
223 template <DecoratorSet decorators, typename BarrierSetT> |
224 template <typename T> |
224 template <typename T> |
225 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) { |
225 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(T* addr, oop compare_value, oop new_value) { |
226 verify_decorators_present<ON_STRONG_OOP_REF>(); |
226 verify_decorators_present<ON_STRONG_OOP_REF>(); |
227 verify_decorators_absent<AS_NO_KEEPALIVE>(); |
227 verify_decorators_absent<AS_NO_KEEPALIVE>(); |
228 |
228 |
229 return Raw::oop_atomic_cmpxchg_not_in_heap(new_value, addr, compare_value); |
229 return Raw::oop_atomic_cmpxchg_not_in_heap(addr, compare_value, new_value); |
230 } |
230 } |
231 |
231 |
232 template <DecoratorSet decorators, typename BarrierSetT> |
232 template <DecoratorSet decorators, typename BarrierSetT> |
233 template <typename T> |
233 template <typename T> |
234 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_xchg_not_in_heap(T* addr, oop new_value) { |
234 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_xchg_not_in_heap(T* addr, oop new_value) { |