114 if (in_collection_set(heap_oop)) { 115 oop forwarded_oop = ShenandoahBarrierSet::resolve_forwarded_not_null(heap_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 assert(is_aligned(addr, HeapWordSize), "Address should be aligned: " PTR_FORMAT, p2i(addr)); 134 return (oop) Atomic::cmpxchg(n, addr, c); 135 } 136 137 inline oop ShenandoahHeap::cas_oop(oop n, narrowOop* addr, narrowOop c) { 138 assert(is_aligned(addr, sizeof(narrowOop)), "Address should be aligned: " PTR_FORMAT, p2i(addr)); 139 narrowOop val = CompressedOops::encode(n); 140 return CompressedOops::decode((narrowOop) Atomic::cmpxchg(val, addr, c)); 141 } 142 143 inline oop ShenandoahHeap::cas_oop(oop n, narrowOop* addr, oop c) { 144 assert(is_aligned(addr, sizeof(narrowOop)), "Address should be aligned: " PTR_FORMAT, p2i(addr)); 145 narrowOop cmp = CompressedOops::encode(c); 146 narrowOop val = CompressedOops::encode(n); 147 return CompressedOops::decode((narrowOop) Atomic::cmpxchg(val, addr, cmp)); 148 } 149 150 template <class T> 151 inline oop ShenandoahHeap::maybe_update_with_forwarded_not_null(T* p, oop heap_oop) { 152 shenandoah_assert_not_in_cset_loc_except(p, !is_in(p) || is_full_gc_in_progress() || is_degenerated_gc_in_progress()); 153 shenandoah_assert_correct(p, heap_oop); 154 155 if (in_collection_set(heap_oop)) { 156 oop forwarded_oop = ShenandoahBarrierSet::resolve_forwarded_not_null(heap_oop); 157 if (forwarded_oop == heap_oop) { 158 // E.g. during evacuation. 159 return forwarded_oop; 160 } 161 162 shenandoah_assert_forwarded_except(p, heap_oop, is_full_gc_in_progress() || is_degenerated_gc_in_progress()); 163 shenandoah_assert_not_forwarded(p, forwarded_oop); 164 shenandoah_assert_not_in_cset_except(p, forwarded_oop, cancelled_gc()); 165 166 // If this fails, another thread wrote to p before us, it will be logged in SATB and the 167 // reference be updated later. | 114 if (in_collection_set(heap_oop)) { 115 oop forwarded_oop = ShenandoahBarrierSet::resolve_forwarded_not_null(heap_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 assert(is_aligned(addr, HeapWordSize), "Address should be aligned: " PTR_FORMAT, p2i(addr)); 134 return (oop) Atomic::cmpxchg(addr, c, n); 135 } 136 137 inline oop ShenandoahHeap::cas_oop(oop n, narrowOop* addr, narrowOop c) { 138 assert(is_aligned(addr, sizeof(narrowOop)), "Address should be aligned: " PTR_FORMAT, p2i(addr)); 139 narrowOop val = CompressedOops::encode(n); 140 return CompressedOops::decode((narrowOop) Atomic::cmpxchg(addr, c, val)); 141 } 142 143 inline oop ShenandoahHeap::cas_oop(oop n, narrowOop* addr, oop c) { 144 assert(is_aligned(addr, sizeof(narrowOop)), "Address should be aligned: " PTR_FORMAT, p2i(addr)); 145 narrowOop cmp = CompressedOops::encode(c); 146 narrowOop val = CompressedOops::encode(n); 147 return CompressedOops::decode((narrowOop) Atomic::cmpxchg(addr, cmp, val)); 148 } 149 150 template <class T> 151 inline oop ShenandoahHeap::maybe_update_with_forwarded_not_null(T* p, oop heap_oop) { 152 shenandoah_assert_not_in_cset_loc_except(p, !is_in(p) || is_full_gc_in_progress() || is_degenerated_gc_in_progress()); 153 shenandoah_assert_correct(p, heap_oop); 154 155 if (in_collection_set(heap_oop)) { 156 oop forwarded_oop = ShenandoahBarrierSet::resolve_forwarded_not_null(heap_oop); 157 if (forwarded_oop == heap_oop) { 158 // E.g. during evacuation. 159 return forwarded_oop; 160 } 161 162 shenandoah_assert_forwarded_except(p, heap_oop, is_full_gc_in_progress() || is_degenerated_gc_in_progress()); 163 shenandoah_assert_not_forwarded(p, forwarded_oop); 164 shenandoah_assert_not_in_cset_except(p, forwarded_oop, cancelled_gc()); 165 166 // If this fails, another thread wrote to p before us, it will be logged in SATB and the 167 // reference be updated later. |