230 T heap_oop = RawAccess<>::oop_load(p);
231
232 if (CompressedOops::is_null(heap_oop)) {
233 return;
234 }
235
236 oop obj = CompressedOops::decode_not_null(heap_oop);
237
238 assert(_worker_id == _par_scan_state->worker_id(), "sanity");
239
240 const InCSetState state = _g1->in_cset_state(obj);
241 if (state.is_in_cset()) {
242 oop forwardee;
243 markOop m = obj->mark();
244 if (m->is_marked()) {
245 forwardee = (oop) m->decode_pointer();
246 } else {
247 forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m);
248 }
249 assert(forwardee != NULL, "forwardee should not be NULL");
250 RawAccess<>::oop_store(p, forwardee);
251 if (do_mark_object != G1MarkNone && forwardee != obj) {
252 // If the object is self-forwarded we don't need to explicitly
253 // mark it, the evacuation failure protocol will do so.
254 mark_forwarded_object(obj, forwardee);
255 }
256
257 if (barrier == G1BarrierCLD) {
258 do_cld_barrier(forwardee);
259 }
260 } else {
261 if (state.is_humongous()) {
262 _g1->set_humongous_is_live(obj);
263 }
264
265 // The object is not in collection set. If we're a root scanning
266 // closure during an initial mark pause then attempt to mark the object.
267 if (do_mark_object == G1MarkFromRoot) {
268 mark_object(obj);
269 }
270 }
|
230 T heap_oop = RawAccess<>::oop_load(p);
231
232 if (CompressedOops::is_null(heap_oop)) {
233 return;
234 }
235
236 oop obj = CompressedOops::decode_not_null(heap_oop);
237
238 assert(_worker_id == _par_scan_state->worker_id(), "sanity");
239
240 const InCSetState state = _g1->in_cset_state(obj);
241 if (state.is_in_cset()) {
242 oop forwardee;
243 markOop m = obj->mark();
244 if (m->is_marked()) {
245 forwardee = (oop) m->decode_pointer();
246 } else {
247 forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m);
248 }
249 assert(forwardee != NULL, "forwardee should not be NULL");
250 RawAccess<OOP_NOT_NULL>::oop_store(p, forwardee);
251 if (do_mark_object != G1MarkNone && forwardee != obj) {
252 // If the object is self-forwarded we don't need to explicitly
253 // mark it, the evacuation failure protocol will do so.
254 mark_forwarded_object(obj, forwardee);
255 }
256
257 if (barrier == G1BarrierCLD) {
258 do_cld_barrier(forwardee);
259 }
260 } else {
261 if (state.is_humongous()) {
262 _g1->set_humongous_is_live(obj);
263 }
264
265 // The object is not in collection set. If we're a root scanning
266 // closure during an initial mark pause then attempt to mark the object.
267 if (do_mark_object == G1MarkFromRoot) {
268 mark_object(obj);
269 }
270 }
|