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");
|