< prev index next >

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

Print this page

        

*** 59,68 **** --- 59,72 ---- #endif #ifdef TARGET_ARCH_ppc # include "bytes_ppc.hpp" #endif + #if INCLUDE_ALL_GCS + #include "gc_implementation/shenandoah/shenandoahBarrierSet.hpp" + #endif + // Implementation of all inlined member functions defined in oop.hpp // We need a separate file to avoid circular references inline void oopDesc::release_set_mark(markOop m) { OrderAccess::release_store_ptr(&_mark, m);
*** 315,341 **** // These functions are only used to exchange oop fields in instances, // not headers. inline oop oopDesc::atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest) { if (UseCompressedOops) { // encode exchange value from oop to T narrowOop val = encode_heap_oop(exchange_value); narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest); // decode old from T to oop ! return decode_heap_oop(old); } else { ! return (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest); } } // In order to put or get a field out of an instance, must first check // if the field has been compressed and uncompress it. inline oop oopDesc::obj_field(int offset) const { ! return UseCompressedOops ? load_decode_heap_oop(obj_field_addr<narrowOop>(offset)) : load_decode_heap_oop(obj_field_addr<oop>(offset)); } inline volatile oop oopDesc::obj_field_volatile(int offset) const { volatile oop value = obj_field(offset); OrderAccess::acquire(); return value; --- 319,361 ---- // These functions are only used to exchange oop fields in instances, // not headers. inline oop oopDesc::atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest) { + oop result; if (UseCompressedOops) { // encode exchange value from oop to T narrowOop val = encode_heap_oop(exchange_value); narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest); // decode old from T to oop ! result = decode_heap_oop(old); } else { ! result = (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest); ! } ! #if INCLUDE_ALL_GCS ! if (UseShenandoahGC) { ! if (exchange_value != NULL) { ! ShenandoahBarrierSet::barrier_set()->storeval_barrier(exchange_value); ! } ! result = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(result); } + #endif + return result; } // In order to put or get a field out of an instance, must first check // if the field has been compressed and uncompress it. inline oop oopDesc::obj_field(int offset) const { ! oop obj = UseCompressedOops ? load_decode_heap_oop(obj_field_addr<narrowOop>(offset)) : load_decode_heap_oop(obj_field_addr<oop>(offset)); + #if INCLUDE_ALL_GCS + if (UseShenandoahGC) { + obj = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(obj); + } + #endif + return obj; } inline volatile oop oopDesc::obj_field_volatile(int offset) const { volatile oop value = obj_field(offset); OrderAccess::acquire(); return value;
*** 390,404 **** inline address oopDesc::address_field(int offset) const { return *address_field_addr(offset); } inline void oopDesc::address_field_put(int offset, address contents) { *address_field_addr(offset) = contents; } inline oop oopDesc::obj_field_acquire(int offset) const { ! return UseCompressedOops ? decode_heap_oop((narrowOop) OrderAccess::load_acquire(obj_field_addr<narrowOop>(offset))) : decode_heap_oop((oop) OrderAccess::load_ptr_acquire(obj_field_addr<oop>(offset))); } inline void oopDesc::release_obj_field_put(int offset, oop value) { UseCompressedOops ? oop_store((volatile narrowOop*)obj_field_addr<narrowOop>(offset), value) : oop_store((volatile oop*) obj_field_addr<oop>(offset), value); --- 410,430 ---- inline address oopDesc::address_field(int offset) const { return *address_field_addr(offset); } inline void oopDesc::address_field_put(int offset, address contents) { *address_field_addr(offset) = contents; } inline oop oopDesc::obj_field_acquire(int offset) const { ! oop obj = UseCompressedOops ? decode_heap_oop((narrowOop) OrderAccess::load_acquire(obj_field_addr<narrowOop>(offset))) : decode_heap_oop((oop) OrderAccess::load_ptr_acquire(obj_field_addr<oop>(offset))); + #if INCLUDE_ALL_GCS + if (UseShenandoahGC) { + obj = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(obj); + } + #endif + return obj; } inline void oopDesc::release_obj_field_put(int offset, oop value) { UseCompressedOops ? oop_store((volatile narrowOop*)obj_field_addr<narrowOop>(offset), value) : oop_store((volatile oop*) obj_field_addr<oop>(offset), value);
*** 567,576 **** --- 593,607 ---- inline oop oopDesc::atomic_compare_exchange_oop(oop exchange_value, volatile HeapWord *dest, oop compare_value, bool prebarrier) { + #if INCLUDE_ALL_GCS + if (UseShenandoahGC && ShenandoahCASBarrier) { + return ShenandoahBarrierSet::barrier_set()->oop_atomic_cmpxchg_in_heap(exchange_value, dest, compare_value); + } + #endif if (UseCompressedOops) { if (prebarrier) { update_barrier_set_pre((narrowOop*)dest, exchange_value); } // encode exchange and compare value from oop to T
< prev index next >