src/hotspot/share/gc/z/zBarrierSet.inline.hpp
changeset 59252 623722a6aeb9
parent 59251 4cbfa5077d68
equal deleted inserted replaced
59251:4cbfa5077d68 59252:623722a6aeb9
   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) {