< 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 >