src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp
changeset 59252 623722a6aeb9
parent 59251 4cbfa5077d68
child 59270 d5a1c6545a2b
equal deleted inserted replaced
59251:4cbfa5077d68 59252:623722a6aeb9
    97   Raw::oop_store(addr, value);
    97   Raw::oop_store(addr, value);
    98 }
    98 }
    99 
    99 
   100 template <DecoratorSet decorators, typename BarrierSetT>
   100 template <DecoratorSet decorators, typename BarrierSetT>
   101 template <typename T>
   101 template <typename T>
   102 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(oop new_value, T* addr, oop compare_value) {
   102 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_not_in_heap(T* addr, oop compare_value, oop new_value) {
   103   oop res;
   103   oop res;
   104   oop expected = compare_value;
   104   oop expected = compare_value;
   105   do {
   105   do {
   106     compare_value = expected;
   106     compare_value = expected;
   107     res = Raw::oop_atomic_cmpxchg(new_value, addr, compare_value);
   107     res = Raw::oop_atomic_cmpxchg(addr, compare_value, new_value);
   108     expected = res;
   108     expected = res;
   109   } while ((compare_value != expected) && (resolve_forwarded(compare_value) == resolve_forwarded(expected)));
   109   } while ((compare_value != expected) && (resolve_forwarded(compare_value) == resolve_forwarded(expected)));
   110   if (res != NULL) {
   110   if (res != NULL) {
   111     return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(res);
   111     return ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(res);
   112   } else {
   112   } else {
   114   }
   114   }
   115 }
   115 }
   116 
   116 
   117 template <DecoratorSet decorators, typename BarrierSetT>
   117 template <DecoratorSet decorators, typename BarrierSetT>
   118 template <typename T>
   118 template <typename T>
   119 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap_impl(oop new_value, T* addr, oop compare_value) {
   119 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap_impl(T* addr, oop compare_value, oop new_value) {
   120   ShenandoahBarrierSet::barrier_set()->storeval_barrier(new_value);
   120   ShenandoahBarrierSet::barrier_set()->storeval_barrier(new_value);
   121   oop result = oop_atomic_cmpxchg_not_in_heap(new_value, addr, compare_value);
   121   oop result = oop_atomic_cmpxchg_not_in_heap(addr, compare_value, new_value);
   122   const bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0;
   122   const bool keep_alive = (decorators & AS_NO_KEEPALIVE) == 0;
   123   if (keep_alive && ShenandoahSATBBarrier && !CompressedOops::is_null(result) &&
   123   if (keep_alive && ShenandoahSATBBarrier && !CompressedOops::is_null(result) &&
   124       (result == compare_value) &&
   124       (result == compare_value) &&
   125       ShenandoahHeap::heap()->is_concurrent_mark_in_progress()) {
   125       ShenandoahHeap::heap()->is_concurrent_mark_in_progress()) {
   126     ShenandoahBarrierSet::barrier_set()->enqueue(result);
   126     ShenandoahBarrierSet::barrier_set()->enqueue(result);
   128   return result;
   128   return result;
   129 }
   129 }
   130 
   130 
   131 template <DecoratorSet decorators, typename BarrierSetT>
   131 template <DecoratorSet decorators, typename BarrierSetT>
   132 template <typename T>
   132 template <typename T>
   133 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap(oop new_value, T* addr, oop compare_value) {
   133 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap(T* addr, oop compare_value, oop new_value) {
   134   oop result = oop_atomic_cmpxchg_in_heap_impl(new_value, addr, compare_value);
   134   oop result = oop_atomic_cmpxchg_in_heap_impl(addr, compare_value, new_value);
   135   keep_alive_if_weak(decorators, result);
   135   keep_alive_if_weak(decorators, result);
   136   return result;
   136   return result;
   137 }
   137 }
   138 
   138 
   139 template <DecoratorSet decorators, typename BarrierSetT>
   139 template <DecoratorSet decorators, typename BarrierSetT>
   140 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap_at(oop new_value, oop base, ptrdiff_t offset, oop compare_value) {
   140 inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap_at(oop base, ptrdiff_t offset, oop compare_value, oop new_value) {
   141   oop result = oop_atomic_cmpxchg_in_heap_impl(new_value, AccessInternal::oop_field_addr<decorators>(base, offset), compare_value);
   141   oop result = oop_atomic_cmpxchg_in_heap_impl(AccessInternal::oop_field_addr<decorators>(base, offset), compare_value, new_value);
   142   keep_alive_if_weak(AccessBarrierSupport::resolve_possibly_unknown_oop_ref_strength<decorators>(base, offset), result);
   142   keep_alive_if_weak(AccessBarrierSupport::resolve_possibly_unknown_oop_ref_strength<decorators>(base, offset), result);
   143   return result;
   143   return result;
   144 }
   144 }
   145 
   145 
   146 template <DecoratorSet decorators, typename BarrierSetT>
   146 template <DecoratorSet decorators, typename BarrierSetT>