src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp
changeset 58219 bc0648405d67
parent 58218 0d7877278adf
child 58266 501df37ce76b
equal deleted inserted replaced
58218:0d7877278adf 58219:bc0648405d67
   114   } else {
   114   } else {
   115     return obj;
   115     return obj;
   116   }
   116   }
   117 }
   117 }
   118 
   118 
   119 
   119 oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj, oop* load_addr) {
   120 oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj) {
   120   return load_reference_barrier_mutator_work(obj, load_addr);
       
   121 }
       
   122 
       
   123 oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj, narrowOop* load_addr) {
       
   124   return load_reference_barrier_mutator_work(obj, load_addr);
       
   125 }
       
   126 
       
   127 template <class T>
       
   128 oop ShenandoahBarrierSet::load_reference_barrier_mutator_work(oop obj, T* load_addr) {
   121   assert(ShenandoahLoadRefBarrier, "should be enabled");
   129   assert(ShenandoahLoadRefBarrier, "should be enabled");
   122   assert(_heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL), "evac should be in progress");
   130   shenandoah_assert_in_cset(load_addr, obj);
   123   shenandoah_assert_in_cset(NULL, obj);
       
   124 
   131 
   125   oop fwd = resolve_forwarded_not_null(obj);
   132   oop fwd = resolve_forwarded_not_null(obj);
   126   if (obj == fwd) {
   133   if (obj == fwd) {
       
   134     assert(_heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL),
       
   135            "evac should be in progress");
       
   136 
   127     ShenandoahEvacOOMScope oom_evac_scope;
   137     ShenandoahEvacOOMScope oom_evac_scope;
   128 
   138 
   129     Thread* thread = Thread::current();
   139     Thread* thread = Thread::current();
   130     oop res_oop = _heap->evacuate_object(obj, thread);
   140     oop res_oop = _heap->evacuate_object(obj, thread);
   131 
   141 
   157         }
   167         }
   158         cur = cur + cur_oop->size();
   168         cur = cur + cur_oop->size();
   159       }
   169       }
   160     }
   170     }
   161 
   171 
   162     return res_oop;
   172     fwd = res_oop;
   163   }
   173   }
       
   174 
       
   175   if (load_addr != NULL && fwd != obj) {
       
   176     // Since we are here and we know the load address, update the reference.
       
   177     ShenandoahHeap::cas_oop(fwd, load_addr, obj);
       
   178   }
       
   179 
   164   return fwd;
   180   return fwd;
   165 }
   181 }
   166 
   182 
   167 oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj) {
   183 oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj) {
   168   assert(ShenandoahLoadRefBarrier, "should be enabled");
   184   assert(ShenandoahLoadRefBarrier, "should be enabled");