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