comparison src/share/vm/oops/instanceRefKlass.cpp @ 1706:9d7a8ab3736b

6962589: remove breadth first scanning code from parallel gc Summary: Remove the breadth-first copying order from ParallelScavenge and use depth-first by default. Reviewed-by: jcoomes, ysr, johnc
author tonyp
date Thu, 22 Jul 2010 10:27:41 -0400
parents c18cbe5936b8
children f95d63e2154a
comparison
equal deleted inserted replaced
1705:2d160770d2e5 1706:9d7a8ab3736b
271 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m) 271 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m)
272 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m) 272 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceRefKlass_OOP_OOP_ITERATE_DEFN_m)
273 273
274 #ifndef SERIALGC 274 #ifndef SERIALGC
275 template <class T> 275 template <class T>
276 void specialized_oop_copy_contents(instanceRefKlass *ref,
277 PSPromotionManager* pm, oop obj) {
278 assert(!pm->depth_first(), "invariant");
279 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
280 if (PSScavenge::should_scavenge(referent_addr)) {
281 ReferenceProcessor* rp = PSScavenge::reference_processor();
282 if (rp->discover_reference(obj, ref->reference_type())) {
283 // reference already enqueued, referent and next will be traversed later
284 ref->instanceKlass::oop_copy_contents(pm, obj);
285 return;
286 } else {
287 // treat referent as normal oop
288 pm->claim_or_forward_breadth(referent_addr);
289 }
290 }
291 // treat next as normal oop
292 T* next_addr = (T*)java_lang_ref_Reference::next_addr(obj);
293 if (PSScavenge::should_scavenge(next_addr)) {
294 pm->claim_or_forward_breadth(next_addr);
295 }
296 ref->instanceKlass::oop_copy_contents(pm, obj);
297 }
298
299 void instanceRefKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) {
300 if (UseCompressedOops) {
301 specialized_oop_copy_contents<narrowOop>(this, pm, obj);
302 } else {
303 specialized_oop_copy_contents<oop>(this, pm, obj);
304 }
305 }
306
307 template <class T>
308 void specialized_oop_push_contents(instanceRefKlass *ref, 276 void specialized_oop_push_contents(instanceRefKlass *ref,
309 PSPromotionManager* pm, oop obj) { 277 PSPromotionManager* pm, oop obj) {
310 assert(pm->depth_first(), "invariant");
311 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); 278 T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj);
312 if (PSScavenge::should_scavenge(referent_addr)) { 279 if (PSScavenge::should_scavenge(referent_addr)) {
313 ReferenceProcessor* rp = PSScavenge::reference_processor(); 280 ReferenceProcessor* rp = PSScavenge::reference_processor();
314 if (rp->discover_reference(obj, ref->reference_type())) { 281 if (rp->discover_reference(obj, ref->reference_type())) {
315 // reference already enqueued, referent and next will be traversed later 282 // reference already enqueued, referent and next will be traversed later