< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahHeap.inline.hpp

Print this page
rev 56289 : 8231086: Shenandoah: Stronger invariant for object-arraycopy


 116       if (forwarded_oop == heap_oop) {
 117         forwarded_oop = evacuate_object(heap_oop, Thread::current());
 118       }
 119       oop prev = cas_oop(forwarded_oop, p, heap_oop);
 120       if (prev == heap_oop) {
 121         return forwarded_oop;
 122       } else {
 123         return NULL;
 124       }
 125     }
 126     return heap_oop;
 127   } else {
 128     return NULL;
 129   }
 130 }
 131 
 132 inline oop ShenandoahHeap::cas_oop(oop n, oop* addr, oop c) {
 133   return (oop) Atomic::cmpxchg(n, addr, c);
 134 }
 135 





 136 inline oop ShenandoahHeap::cas_oop(oop n, narrowOop* addr, oop c) {
 137   narrowOop cmp = CompressedOops::encode(c);
 138   narrowOop val = CompressedOops::encode(n);
 139   return CompressedOops::decode((narrowOop) Atomic::cmpxchg(val, addr, cmp));
 140 }
 141 
 142 template <class T>
 143 inline oop ShenandoahHeap::maybe_update_with_forwarded_not_null(T* p, oop heap_oop) {
 144   shenandoah_assert_not_in_cset_loc_except(p, !is_in(p) || is_full_gc_in_progress() || is_degenerated_gc_in_progress());
 145   shenandoah_assert_correct(p, heap_oop);
 146 
 147   if (in_collection_set(heap_oop)) {
 148     oop forwarded_oop = ShenandoahBarrierSet::resolve_forwarded_not_null(heap_oop);
 149     if (forwarded_oop == heap_oop) {
 150       // E.g. during evacuation.
 151       return forwarded_oop;
 152     }
 153 
 154     shenandoah_assert_forwarded_except(p, heap_oop, is_full_gc_in_progress() || is_degenerated_gc_in_progress());
 155     shenandoah_assert_not_forwarded(p, forwarded_oop);




 116       if (forwarded_oop == heap_oop) {
 117         forwarded_oop = evacuate_object(heap_oop, Thread::current());
 118       }
 119       oop prev = cas_oop(forwarded_oop, p, heap_oop);
 120       if (prev == heap_oop) {
 121         return forwarded_oop;
 122       } else {
 123         return NULL;
 124       }
 125     }
 126     return heap_oop;
 127   } else {
 128     return NULL;
 129   }
 130 }
 131 
 132 inline oop ShenandoahHeap::cas_oop(oop n, oop* addr, oop c) {
 133   return (oop) Atomic::cmpxchg(n, addr, c);
 134 }
 135 
 136 inline oop ShenandoahHeap::cas_oop(oop n, narrowOop* addr, narrowOop c) {
 137   narrowOop val = CompressedOops::encode(n);
 138   return CompressedOops::decode((narrowOop) Atomic::cmpxchg(val, addr, c));
 139 }
 140 
 141 inline oop ShenandoahHeap::cas_oop(oop n, narrowOop* addr, oop c) {
 142   narrowOop cmp = CompressedOops::encode(c);
 143   narrowOop val = CompressedOops::encode(n);
 144   return CompressedOops::decode((narrowOop) Atomic::cmpxchg(val, addr, cmp));
 145 }
 146 
 147 template <class T>
 148 inline oop ShenandoahHeap::maybe_update_with_forwarded_not_null(T* p, oop heap_oop) {
 149   shenandoah_assert_not_in_cset_loc_except(p, !is_in(p) || is_full_gc_in_progress() || is_degenerated_gc_in_progress());
 150   shenandoah_assert_correct(p, heap_oop);
 151 
 152   if (in_collection_set(heap_oop)) {
 153     oop forwarded_oop = ShenandoahBarrierSet::resolve_forwarded_not_null(heap_oop);
 154     if (forwarded_oop == heap_oop) {
 155       // E.g. during evacuation.
 156       return forwarded_oop;
 157     }
 158 
 159     shenandoah_assert_forwarded_except(p, heap_oop, is_full_gc_in_progress() || is_degenerated_gc_in_progress());
 160     shenandoah_assert_not_forwarded(p, forwarded_oop);


< prev index next >