234 markWord m = obj->mark_raw();
235 if (m.is_marked()) {
236 forwardee = (oop) m.decode_pointer();
237 } else {
238 forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m);
239 }
240 assert(forwardee != NULL, "forwardee should not be NULL");
241 RawAccess<IS_NOT_NULL>::oop_store(p, forwardee);
242
243 if (barrier == G1BarrierCLD) {
244 do_cld_barrier(forwardee);
245 }
246 } else {
247 if (state.is_humongous()) {
248 _g1h->set_humongous_is_live(obj);
249 } else if ((barrier != G1BarrierNoOptRoots) && state.is_optional()) {
250 _par_scan_state->remember_root_into_optional_region(p);
251 }
252
253 // The object is not in collection set. If we're a root scanning
254 // closure during a concurrent mark pause then attempt to mark the object.
255 if (do_mark_object == G1MarkFromRoot) {
256 mark_object(obj);
257 }
258 }
259 trim_queue_partially();
260 }
261
262 template <class T> void G1RebuildRemSetClosure::do_oop_work(T* p) {
263 oop const obj = RawAccess<MO_RELAXED>::oop_load(p);
264 if (obj == NULL) {
265 return;
266 }
267
268 if (HeapRegion::is_in_same_region(p, obj)) {
269 return;
270 }
271
272 HeapRegion* to = _g1h->heap_region_containing(obj);
273 HeapRegionRemSet* rem_set = to->rem_set();
274 rem_set->add_reference(p, _worker_id);
|
234 markWord m = obj->mark_raw();
235 if (m.is_marked()) {
236 forwardee = (oop) m.decode_pointer();
237 } else {
238 forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m);
239 }
240 assert(forwardee != NULL, "forwardee should not be NULL");
241 RawAccess<IS_NOT_NULL>::oop_store(p, forwardee);
242
243 if (barrier == G1BarrierCLD) {
244 do_cld_barrier(forwardee);
245 }
246 } else {
247 if (state.is_humongous()) {
248 _g1h->set_humongous_is_live(obj);
249 } else if ((barrier != G1BarrierNoOptRoots) && state.is_optional()) {
250 _par_scan_state->remember_root_into_optional_region(p);
251 }
252
253 // The object is not in collection set. If we're a root scanning
254 // closure during a concurrent start pause then attempt to mark the object.
255 if (do_mark_object == G1MarkFromRoot) {
256 mark_object(obj);
257 }
258 }
259 trim_queue_partially();
260 }
261
262 template <class T> void G1RebuildRemSetClosure::do_oop_work(T* p) {
263 oop const obj = RawAccess<MO_RELAXED>::oop_load(p);
264 if (obj == NULL) {
265 return;
266 }
267
268 if (HeapRegion::is_in_same_region(p, obj)) {
269 return;
270 }
271
272 HeapRegion* to = _g1h->heap_region_containing(obj);
273 HeapRegionRemSet* rem_set = to->rem_set();
274 rem_set->add_reference(p, _worker_id);
|