238 if (_heap->is_concurrent_partial_in_progress()) {
239 ShenandoahUpdateRefsForOopClosure<true, true, false> cl;
240 obj->oop_iterate(&cl);
241 } else {
242 ShenandoahUpdateRefsForOopClosure<true, false, false> cl;
243 obj->oop_iterate(&cl);
244 }
245 } else {
246 assert(! _heap->is_concurrent_partial_in_progress(), "partial GC needs matrix");
247 if (_heap->is_concurrent_traversal_in_progress()) {
248 ShenandoahUpdateRefsForOopClosure<false, true, true> cl;
249 obj->oop_iterate(&cl);
250 } else {
251 ShenandoahUpdateRefsForOopClosure<false, false, false> cl;
252 obj->oop_iterate(&cl);
253 }
254 }
255 }
256
257 oop ShenandoahBarrierSet::read_barrier(oop src) {
258 if (ShenandoahReadBarrier) {
259 return ShenandoahBarrierSet::resolve_forwarded(src);
260 } else {
261 return src;
262 }
263 }
264
265 bool ShenandoahBarrierSet::obj_equals(oop obj1, oop obj2) {
266 bool eq = oopDesc::unsafe_equals(obj1, obj2);
267 if (! eq && ShenandoahAcmpBarrier) {
268 OrderAccess::loadload();
269 obj1 = resolve_forwarded(obj1);
270 obj2 = resolve_forwarded(obj2);
271 eq = oopDesc::unsafe_equals(obj1, obj2);
272 }
273 return eq;
274 }
275
276 JRT_LEAF(oopDesc*, ShenandoahBarrierSet::write_barrier_JRT(oopDesc* src))
277 oop result = ((ShenandoahBarrierSet*)BarrierSet::barrier_set())->write_barrier(src);
278 return (oopDesc*) result;
|
238 if (_heap->is_concurrent_partial_in_progress()) {
239 ShenandoahUpdateRefsForOopClosure<true, true, false> cl;
240 obj->oop_iterate(&cl);
241 } else {
242 ShenandoahUpdateRefsForOopClosure<true, false, false> cl;
243 obj->oop_iterate(&cl);
244 }
245 } else {
246 assert(! _heap->is_concurrent_partial_in_progress(), "partial GC needs matrix");
247 if (_heap->is_concurrent_traversal_in_progress()) {
248 ShenandoahUpdateRefsForOopClosure<false, true, true> cl;
249 obj->oop_iterate(&cl);
250 } else {
251 ShenandoahUpdateRefsForOopClosure<false, false, false> cl;
252 obj->oop_iterate(&cl);
253 }
254 }
255 }
256
257 oop ShenandoahBarrierSet::read_barrier(oop src) {
258 // Check for forwarded objects, because on Full GC path we might deal with
259 // non-trivial fwdptrs that contain Full GC specific metadata. We could check
260 // for is_full_gc_in_progress(), but this also covers the case of stable heap,
261 // which provides a bit of performance improvement.
262 if (ShenandoahReadBarrier && _heap->has_forwarded_objects()) {
263 return ShenandoahBarrierSet::resolve_forwarded(src);
264 } else {
265 return src;
266 }
267 }
268
269 bool ShenandoahBarrierSet::obj_equals(oop obj1, oop obj2) {
270 bool eq = oopDesc::unsafe_equals(obj1, obj2);
271 if (! eq && ShenandoahAcmpBarrier) {
272 OrderAccess::loadload();
273 obj1 = resolve_forwarded(obj1);
274 obj2 = resolve_forwarded(obj2);
275 eq = oopDesc::unsafe_equals(obj1, obj2);
276 }
277 return eq;
278 }
279
280 JRT_LEAF(oopDesc*, ShenandoahBarrierSet::write_barrier_JRT(oopDesc* src))
281 oop result = ((ShenandoahBarrierSet*)BarrierSet::barrier_set())->write_barrier(src);
282 return (oopDesc*) result;
|