< prev index next >

src/hotspot/share/gc/parallel/psPromotionManager.cpp

Print this page
rev 50093 : [mq]: pp2_work


 425   InstanceKlass::oop_ps_push_contents(obj, pm);
 426 
 427   PushContentsClosure cl(pm);
 428   oop_oop_iterate_statics<true>(obj, &cl);
 429 }
 430 
 431 void InstanceClassLoaderKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
 432   InstanceKlass::oop_ps_push_contents(obj, pm);
 433 
 434   // This is called by the young collector. It will already have taken care of
 435   // all class loader data. So, we don't have to follow the class loader ->
 436   // class loader data link.
 437 }
 438 
 439 template <class T>
 440 static void oop_ps_push_contents_specialized(oop obj, InstanceRefKlass *klass, PSPromotionManager* pm) {
 441   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr_raw(obj);
 442   if (PSScavenge::should_scavenge(referent_addr)) {
 443     ReferenceProcessor* rp = PSScavenge::reference_processor();
 444     if (rp->discover_reference(obj, klass->reference_type())) {
 445       // reference already enqueued, referent and next will be traversed later
 446       klass->InstanceKlass::oop_ps_push_contents(obj, pm);
 447       return;
 448     } else {
 449       // treat referent as normal oop
 450       pm->claim_or_forward_depth(referent_addr);
 451     }
 452   }
 453   // Treat discovered as normal oop, if ref is not "active",
 454   // i.e. if next is non-NULL.
 455   T* next_addr = (T*)java_lang_ref_Reference::next_addr_raw(obj);
 456   T  next_oop = RawAccess<>::oop_load(next_addr);
 457   if (!CompressedOops::is_null(next_oop)) { // i.e. ref is not "active"
 458     T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr_raw(obj);
 459     log_develop_trace(gc, ref)("   Process discovered as normal " PTR_FORMAT, p2i(discovered_addr));
 460     if (PSScavenge::should_scavenge(discovered_addr)) {
 461       pm->claim_or_forward_depth(discovered_addr);
 462     }
 463   }
 464   // Treat next as normal oop;  next is a link in the reference queue.
 465   if (PSScavenge::should_scavenge(next_addr)) {
 466     pm->claim_or_forward_depth(next_addr);
 467   }
 468   klass->InstanceKlass::oop_ps_push_contents(obj, pm);
 469 }
 470 
 471 void InstanceRefKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
 472   if (UseCompressedOops) {
 473     oop_ps_push_contents_specialized<narrowOop>(obj, this, pm);
 474   } else {
 475     oop_ps_push_contents_specialized<oop>(obj, this, pm);
 476   }
 477 }
 478 
 479 void ObjArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
 480   assert(obj->is_objArray(), "obj must be obj array");
 481   PushContentsClosure cl(pm);
 482   oop_oop_iterate_elements<true>(objArrayOop(obj), &cl);
 483 }
 484 
 485 void TypeArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
 486   assert(obj->is_typeArray(),"must be a type array");




 425   InstanceKlass::oop_ps_push_contents(obj, pm);
 426 
 427   PushContentsClosure cl(pm);
 428   oop_oop_iterate_statics<true>(obj, &cl);
 429 }
 430 
 431 void InstanceClassLoaderKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
 432   InstanceKlass::oop_ps_push_contents(obj, pm);
 433 
 434   // This is called by the young collector. It will already have taken care of
 435   // all class loader data. So, we don't have to follow the class loader ->
 436   // class loader data link.
 437 }
 438 
 439 template <class T>
 440 static void oop_ps_push_contents_specialized(oop obj, InstanceRefKlass *klass, PSPromotionManager* pm) {
 441   T* referent_addr = (T*)java_lang_ref_Reference::referent_addr_raw(obj);
 442   if (PSScavenge::should_scavenge(referent_addr)) {
 443     ReferenceProcessor* rp = PSScavenge::reference_processor();
 444     if (rp->discover_reference(obj, klass->reference_type())) {
 445       // reference discovered, referent will be traversed later.
 446       klass->InstanceKlass::oop_ps_push_contents(obj, pm);
 447       return;
 448     } else {
 449       // treat referent as normal oop
 450       pm->claim_or_forward_depth(referent_addr);
 451     }
 452   }
 453   // Treat discovered as normal oop




 454   T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr_raw(obj);

 455   if (PSScavenge::should_scavenge(discovered_addr)) {
 456     pm->claim_or_forward_depth(discovered_addr);





 457   }
 458   klass->InstanceKlass::oop_ps_push_contents(obj, pm);
 459 }
 460 
 461 void InstanceRefKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
 462   if (UseCompressedOops) {
 463     oop_ps_push_contents_specialized<narrowOop>(obj, this, pm);
 464   } else {
 465     oop_ps_push_contents_specialized<oop>(obj, this, pm);
 466   }
 467 }
 468 
 469 void ObjArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
 470   assert(obj->is_objArray(), "obj must be obj array");
 471   PushContentsClosure cl(pm);
 472   oop_oop_iterate_elements<true>(objArrayOop(obj), &cl);
 473 }
 474 
 475 void TypeArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) {
 476   assert(obj->is_typeArray(),"must be a type array");


< prev index next >