< prev index next >

src/hotspot/share/gc/parallel/psScavenge.inline.hpp

Print this page

        

*** 83,101 **** }; typedef PSRootsClosure</*promote_immediately=*/false> PSScavengeRootsClosure; typedef PSRootsClosure</*promote_immediately=*/true> PSPromoteRootsClosure; ! // Scavenges a single oop in a Klass. ! class PSScavengeFromKlassClosure: public OopClosure { private: PSPromotionManager* _pm; ! // Used to redirty a scanned klass if it has oops // pointing to the young generation after being scanned. ! Klass* _scanned_klass; public: ! PSScavengeFromKlassClosure(PSPromotionManager* pm) : _pm(pm), _scanned_klass(NULL) { } void do_oop(narrowOop* p) { ShouldNotReachHere(); } void do_oop(oop* p) { ParallelScavengeHeap* psh = ParallelScavengeHeap::heap(); assert(!psh->is_in_reserved(p), "GC barrier needed"); if (PSScavenge::should_scavenge(p)) { --- 83,101 ---- }; typedef PSRootsClosure</*promote_immediately=*/false> PSScavengeRootsClosure; typedef PSRootsClosure</*promote_immediately=*/true> PSPromoteRootsClosure; ! // Scavenges a single oop in a ClassLoaderData. ! class PSScavengeFromCLDClosure: public OopClosure { private: PSPromotionManager* _pm; ! // Used to redirty a scanned cld if it has oops // pointing to the young generation after being scanned. ! ClassLoaderData* _scanned_cld; public: ! PSScavengeFromCLDClosure(PSPromotionManager* pm) : _pm(pm), _scanned_cld(NULL) { } void do_oop(narrowOop* p) { ShouldNotReachHere(); } void do_oop(oop* p) { ParallelScavengeHeap* psh = ParallelScavengeHeap::heap(); assert(!psh->is_in_reserved(p), "GC barrier needed"); if (PSScavenge::should_scavenge(p)) {
*** 109,158 **** new_obj = _pm->copy_to_survivor_space</*promote_immediately=*/false>(o); } oopDesc::encode_store_heap_oop_not_null(p, new_obj); if (PSScavenge::is_obj_in_young(new_obj)) { ! do_klass_barrier(); } } } ! void set_scanned_klass(Klass* klass) { ! assert(_scanned_klass == NULL || klass == NULL, "Should always only handling one klass at a time"); ! _scanned_klass = klass; } private: ! void do_klass_barrier() { ! assert(_scanned_klass != NULL, "Should not be called without having a scanned klass"); ! _scanned_klass->record_modified_oops(); } - }; ! // Scavenges the oop in a Klass. ! class PSScavengeKlassClosure: public KlassClosure { private: ! PSScavengeFromKlassClosure _oop_closure; protected: public: ! PSScavengeKlassClosure(PSPromotionManager* pm) : _oop_closure(pm) { } ! void do_klass(Klass* klass) { ! // If the klass has not been dirtied we know that there's // no references into the young gen and we can skip it. ! if (klass->has_modified_oops()) { ! // Clean the klass since we're going to scavenge all the metadata. ! klass->clear_modified_oops(); ! ! // Setup the promotion manager to redirty this klass // if references are left in the young gen. ! _oop_closure.set_scanned_klass(klass); ! klass->oops_do(&_oop_closure); ! _oop_closure.set_scanned_klass(NULL); } } }; #endif // SHARE_VM_GC_PARALLEL_PSSCAVENGE_INLINE_HPP --- 109,156 ---- new_obj = _pm->copy_to_survivor_space</*promote_immediately=*/false>(o); } oopDesc::encode_store_heap_oop_not_null(p, new_obj); if (PSScavenge::is_obj_in_young(new_obj)) { ! do_cld_barrier(); } } } ! void set_scanned_cld(ClassLoaderData* cld) { ! assert(_scanned_cld == NULL || cld == NULL, "Should always only handling one cld at a time"); ! _scanned_cld = cld; } private: ! void do_cld_barrier() { ! assert(_scanned_cld != NULL, "Should not be called without having a scanned cld"); ! _scanned_cld->record_modified_oops(); } }; ! // Scavenges the oop in a ClassLoaderData. ! class PSScavengeCLDClosure: public CLDClosure { private: ! PSScavengeFromCLDClosure _oop_closure; protected: public: ! PSScavengeCLDClosure(PSPromotionManager* pm) : _oop_closure(pm) { } ! void do_cld(ClassLoaderData* cld) { ! // If the cld has not been dirtied we know that there's // no references into the young gen and we can skip it. ! if (cld->has_modified_oops()) { ! // Setup the promotion manager to redirty this cld // if references are left in the young gen. ! _oop_closure.set_scanned_cld(cld); ! // Clean the cld since we're going to scavenge all the metadata. ! cld->oops_do(&_oop_closure, false, /*clear_modified_oops*/true); ! _oop_closure.set_scanned_cld(NULL); } } }; + #endif // SHARE_VM_GC_PARALLEL_PSSCAVENGE_INLINE_HPP
< prev index next >