247 }
248 }
249
250 oop ShenandoahBarrierSet::load_reference_barrier_native(oop obj, oop* load_addr) {
251 return load_reference_barrier_native_impl(obj, load_addr);
252 }
253
254 oop ShenandoahBarrierSet::load_reference_barrier_native(oop obj, narrowOop* load_addr) {
255 // Assumption: narrow oop version should not be used anywhere.
256 ShouldNotReachHere();
257 return NULL;
258 }
259
260 template <class T>
261 oop ShenandoahBarrierSet::load_reference_barrier_native_impl(oop obj, T* load_addr) {
262 if (CompressedOops::is_null(obj)) {
263 return NULL;
264 }
265
266 ShenandoahMarkingContext* const marking_context = _heap->marking_context();
267 if (_heap->is_evacuation_in_progress() && !marking_context->is_marked(obj)) {
268 Thread* thr = Thread::current();
269 if (thr->is_Java_thread()) {
270 return NULL;
271 } else {
272 return obj;
273 }
274 }
275
276 oop fwd = load_reference_barrier_not_null(obj);
277 if (load_addr != NULL && fwd != obj) {
278 // Since we are here and we know the load address, update the reference.
279 ShenandoahHeap::cas_oop(fwd, load_addr, obj);
280 }
281
282 return fwd;
283 }
284
285 void ShenandoahBarrierSet::clone_barrier_runtime(oop src) {
286 if (_heap->has_forwarded_objects()) {
287 clone_barrier(src);
|
247 }
248 }
249
250 oop ShenandoahBarrierSet::load_reference_barrier_native(oop obj, oop* load_addr) {
251 return load_reference_barrier_native_impl(obj, load_addr);
252 }
253
254 oop ShenandoahBarrierSet::load_reference_barrier_native(oop obj, narrowOop* load_addr) {
255 // Assumption: narrow oop version should not be used anywhere.
256 ShouldNotReachHere();
257 return NULL;
258 }
259
260 template <class T>
261 oop ShenandoahBarrierSet::load_reference_barrier_native_impl(oop obj, T* load_addr) {
262 if (CompressedOops::is_null(obj)) {
263 return NULL;
264 }
265
266 ShenandoahMarkingContext* const marking_context = _heap->marking_context();
267 if (_heap->is_concurrent_root_in_progress() && !marking_context->is_marked(obj)) {
268 Thread* thr = Thread::current();
269 if (thr->is_Java_thread()) {
270 return NULL;
271 } else {
272 return obj;
273 }
274 }
275
276 oop fwd = load_reference_barrier_not_null(obj);
277 if (load_addr != NULL && fwd != obj) {
278 // Since we are here and we know the load address, update the reference.
279 ShenandoahHeap::cas_oop(fwd, load_addr, obj);
280 }
281
282 return fwd;
283 }
284
285 void ShenandoahBarrierSet::clone_barrier_runtime(oop src) {
286 if (_heap->has_forwarded_objects()) {
287 clone_barrier(src);
|