4253 } 4254 } 4255 4256 template <G1Barrier barrier, G1Mark do_mark_object> 4257 template <class T> 4258 void G1ParCopyClosure<barrier, do_mark_object>::do_oop_work(T* p) { 4259 T heap_oop = oopDesc::load_heap_oop(p); 4260 4261 if (oopDesc::is_null(heap_oop)) { 4262 return; 4263 } 4264 4265 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); 4266 4267 assert(_worker_id == _par_scan_state->queue_num(), "sanity"); 4268 4269 G1CollectedHeap::in_cset_state_t state = _g1->in_cset_state(obj); 4270 4271 if (state == G1CollectedHeap::InCSet) { 4272 oop forwardee; 4273 if (obj->is_forwarded()) { 4274 forwardee = obj->forwardee(); 4275 } else { 4276 forwardee = _par_scan_state->copy_to_survivor_space(obj); 4277 } 4278 assert(forwardee != NULL, "forwardee should not be NULL"); 4279 oopDesc::encode_store_heap_oop(p, forwardee); 4280 if (do_mark_object != G1MarkNone && forwardee != obj) { 4281 // If the object is self-forwarded we don't need to explicitly 4282 // mark it, the evacuation failure protocol will do so. 4283 mark_forwarded_object(obj, forwardee); 4284 } 4285 4286 if (barrier == G1BarrierKlass) { 4287 do_klass_barrier(p, forwardee); 4288 } 4289 } else { 4290 if (state == G1CollectedHeap::IsHumongous) { 4291 _g1->set_humongous_is_live(obj); 4292 } 4293 // The object is not in collection set. If we're a root scanning 4294 // closure during an initial mark pause then attempt to mark the object. 4295 if (do_mark_object == G1MarkFromRoot) { 4296 mark_object(obj); | 4253 } 4254 } 4255 4256 template <G1Barrier barrier, G1Mark do_mark_object> 4257 template <class T> 4258 void G1ParCopyClosure<barrier, do_mark_object>::do_oop_work(T* p) { 4259 T heap_oop = oopDesc::load_heap_oop(p); 4260 4261 if (oopDesc::is_null(heap_oop)) { 4262 return; 4263 } 4264 4265 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); 4266 4267 assert(_worker_id == _par_scan_state->queue_num(), "sanity"); 4268 4269 G1CollectedHeap::in_cset_state_t state = _g1->in_cset_state(obj); 4270 4271 if (state == G1CollectedHeap::InCSet) { 4272 oop forwardee; 4273 markOop m = obj->mark(); 4274 if (m->is_marked()) { 4275 forwardee = (oop) m->decode_pointer(); 4276 } else { 4277 forwardee = _par_scan_state->copy_to_survivor_space(obj, m); 4278 } 4279 assert(forwardee != NULL, "forwardee should not be NULL"); 4280 oopDesc::encode_store_heap_oop(p, forwardee); 4281 if (do_mark_object != G1MarkNone && forwardee != obj) { 4282 // If the object is self-forwarded we don't need to explicitly 4283 // mark it, the evacuation failure protocol will do so. 4284 mark_forwarded_object(obj, forwardee); 4285 } 4286 4287 if (barrier == G1BarrierKlass) { 4288 do_klass_barrier(p, forwardee); 4289 } 4290 } else { 4291 if (state == G1CollectedHeap::IsHumongous) { 4292 _g1->set_humongous_is_live(obj); 4293 } 4294 // The object is not in collection set. If we're a root scanning 4295 // closure during an initial mark pause then attempt to mark the object. 4296 if (do_mark_object == G1MarkFromRoot) { 4297 mark_object(obj); |