290 volatile narrowOop* p, oop v) {
291 OrderAccess::release_store(p, encode_heap_oop(v));
292 }
293
294
295 // These functions are only used to exchange oop fields in instances,
296 // not headers.
297 inline oop oopDesc::atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest) {
298 oop result;
299 if (UseCompressedOops) {
300 // encode exchange value from oop to T
301 narrowOop val = encode_heap_oop(exchange_value);
302 narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest);
303 // decode old from T to oop
304 result = decode_heap_oop(old);
305 } else {
306 result = (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest);
307 }
308 #if INCLUDE_ALL_GCS
309 if (UseShenandoahGC) {
310 result = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(result);
311 }
312 #endif
313 return result;
314 }
315
316 // In order to put or get a field out of an instance, must first check
317 // if the field has been compressed and uncompress it.
318 inline oop oopDesc::obj_field(int offset) const {
319 oop obj = UseCompressedOops ?
320 load_decode_heap_oop(obj_field_addr<narrowOop>(offset)) :
321 load_decode_heap_oop(obj_field_addr<oop>(offset));
322 #if INCLUDE_ALL_GCS
323 if (UseShenandoahGC) {
324 obj = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(obj);
325 }
326 #endif
327 return obj;
328 }
329 inline volatile oop oopDesc::obj_field_volatile(int offset) const {
|
290 volatile narrowOop* p, oop v) {
291 OrderAccess::release_store(p, encode_heap_oop(v));
292 }
293
294
295 // These functions are only used to exchange oop fields in instances,
296 // not headers.
297 inline oop oopDesc::atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest) {
298 oop result;
299 if (UseCompressedOops) {
300 // encode exchange value from oop to T
301 narrowOop val = encode_heap_oop(exchange_value);
302 narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest);
303 // decode old from T to oop
304 result = decode_heap_oop(old);
305 } else {
306 result = (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest);
307 }
308 #if INCLUDE_ALL_GCS
309 if (UseShenandoahGC) {
310 if (exchange_value != NULL) {
311 ShenandoahBarrierSet::barrier_set()->storeval_barrier(exchange_value);
312 }
313 result = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(result);
314 }
315 #endif
316 return result;
317 }
318
319 // In order to put or get a field out of an instance, must first check
320 // if the field has been compressed and uncompress it.
321 inline oop oopDesc::obj_field(int offset) const {
322 oop obj = UseCompressedOops ?
323 load_decode_heap_oop(obj_field_addr<narrowOop>(offset)) :
324 load_decode_heap_oop(obj_field_addr<oop>(offset));
325 #if INCLUDE_ALL_GCS
326 if (UseShenandoahGC) {
327 obj = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(obj);
328 }
329 #endif
330 return obj;
331 }
332 inline volatile oop oopDesc::obj_field_volatile(int offset) const {
|