< prev index next >

src/share/vm/oops/oop.inline.hpp

Print this page
rev 11463 : Backport Traversal GC


 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 {


< prev index next >