< prev index next >
src/share/vm/oops/oop.inline.hpp
Print this page
@@ -59,10 +59,14 @@
#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,27 +319,43 @@
// 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
- return decode_heap_oop(old);
+ result = decode_heap_oop(old);
} else {
- return (oop)Atomic::xchg_ptr(exchange_value, (oop*)dest);
+ 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 {
- return UseCompressedOops ?
+ 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,15 +410,21 @@
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 ?
+ 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,10 +593,15 @@
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 >