114 } else { |
114 } else { |
115 return obj; |
115 return obj; |
116 } |
116 } |
117 } |
117 } |
118 |
118 |
119 |
119 oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj, oop* load_addr) { |
120 oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj) { |
120 return load_reference_barrier_mutator_work(obj, load_addr); |
|
121 } |
|
122 |
|
123 oop ShenandoahBarrierSet::load_reference_barrier_mutator(oop obj, narrowOop* load_addr) { |
|
124 return load_reference_barrier_mutator_work(obj, load_addr); |
|
125 } |
|
126 |
|
127 template <class T> |
|
128 oop ShenandoahBarrierSet::load_reference_barrier_mutator_work(oop obj, T* load_addr) { |
121 assert(ShenandoahLoadRefBarrier, "should be enabled"); |
129 assert(ShenandoahLoadRefBarrier, "should be enabled"); |
122 assert(_heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL), "evac should be in progress"); |
130 shenandoah_assert_in_cset(load_addr, obj); |
123 shenandoah_assert_in_cset(NULL, obj); |
|
124 |
131 |
125 oop fwd = resolve_forwarded_not_null(obj); |
132 oop fwd = resolve_forwarded_not_null(obj); |
126 if (obj == fwd) { |
133 if (obj == fwd) { |
|
134 assert(_heap->is_gc_in_progress_mask(ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL), |
|
135 "evac should be in progress"); |
|
136 |
127 ShenandoahEvacOOMScope oom_evac_scope; |
137 ShenandoahEvacOOMScope oom_evac_scope; |
128 |
138 |
129 Thread* thread = Thread::current(); |
139 Thread* thread = Thread::current(); |
130 oop res_oop = _heap->evacuate_object(obj, thread); |
140 oop res_oop = _heap->evacuate_object(obj, thread); |
131 |
141 |
157 } |
167 } |
158 cur = cur + cur_oop->size(); |
168 cur = cur + cur_oop->size(); |
159 } |
169 } |
160 } |
170 } |
161 |
171 |
162 return res_oop; |
172 fwd = res_oop; |
163 } |
173 } |
|
174 |
|
175 if (load_addr != NULL && fwd != obj) { |
|
176 // Since we are here and we know the load address, update the reference. |
|
177 ShenandoahHeap::cas_oop(fwd, load_addr, obj); |
|
178 } |
|
179 |
164 return fwd; |
180 return fwd; |
165 } |
181 } |
166 |
182 |
167 oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj) { |
183 oop ShenandoahBarrierSet::load_reference_barrier_impl(oop obj) { |
168 assert(ShenandoahLoadRefBarrier, "should be enabled"); |
184 assert(ShenandoahLoadRefBarrier, "should be enabled"); |