diff --git a/src/hotspot/share/gc/parallel/psClosure.inline.hpp b/src/hotspot/share/gc/parallel/psClosure.inline.hpp index 4d11e50bbd0..db09f8719bb 100644 --- a/src/hotspot/share/gc/parallel/psClosure.inline.hpp +++ b/src/hotspot/share/gc/parallel/psClosure.inline.hpp @@ -32,12 +32,11 @@ #include "oops/oop.inline.hpp" #include "utilities/globalDefinitions.hpp" -template +template class PSRootsClosure: public OopClosure { - private: +private: PSPromotionManager* _promotion_manager; - protected: template void do_oop_work(T *p) { if (PSScavenge::should_scavenge(p)) { // We never card mark roots, maybe call a func without test? @@ -55,12 +54,12 @@ typedef PSRootsClosure PSPromoteRootsClosure; // Scavenges a single oop in a ClassLoaderData. class PSScavengeFromCLDClosure: public OopClosure { - private: +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: +public: PSScavengeFromCLDClosure(PSPromotionManager* pm) : _pm(pm), _scanned_cld(NULL) { } void do_oop(narrowOop* p) { ShouldNotReachHere(); } void do_oop(oop* p) { @@ -89,7 +88,7 @@ class PSScavengeFromCLDClosure: public OopClosure { _scanned_cld = cld; } - private: +private: void do_cld_barrier() { assert(_scanned_cld != NULL, "Should not be called without having a scanned cld"); _scanned_cld->record_modified_oops(); @@ -98,10 +97,9 @@ class PSScavengeFromCLDClosure: public OopClosure { // Scavenges the oop in a ClassLoaderData. class PSScavengeCLDClosure: public CLDClosure { - private: +private: PSScavengeFromCLDClosure _oop_closure; - protected: - public: +public: PSScavengeCLDClosure(PSPromotionManager* pm) : _oop_closure(pm) { } void do_cld(ClassLoaderData* cld) { // If the cld has not been dirtied we know that there's diff --git a/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp b/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp index e2ad1f460eb..8160b31be22 100644 --- a/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp +++ b/src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp @@ -156,7 +156,10 @@ inline void ParCompactionManager::follow_array(objArrayOop obj, int index) { } inline void ParCompactionManager::update_contents(oop obj) { - obj->pc_update_contents(this); + if (!obj->klass()->is_typeArray_klass()) { + PCAdjustPointerClosure apc(this); + obj->oop_iterate(&apc); + } } inline void ParCompactionManager::follow_class_loader(ClassLoaderData* cld) { diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.cpp b/src/hotspot/share/gc/parallel/psParallelCompact.cpp index a1ba62a9f51..e98e572c4e3 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.cpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.cpp @@ -2203,7 +2203,7 @@ void PSParallelCompact::adjust_roots(ParCompactionManager* cm) { // Need new claim bits when tracing through and adjusting pointers. ClassLoaderDataGraph::clear_claimed_marks(); - PSParallelCompact::AdjustPointerClosure oop_closure(cm); + PCAdjustPointerClosure oop_closure(cm); // General strong roots. Universe::oops_do(&oop_closure); @@ -3096,76 +3096,6 @@ void MoveAndUpdateClosure::copy_partial_obj() update_state(words); } -void InstanceKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) { - PSParallelCompact::AdjustPointerClosure closure(cm); - if (UseCompressedOops) { - oop_oop_iterate_oop_maps(obj, &closure); - } else { - oop_oop_iterate_oop_maps(obj, &closure); - } -} - -void InstanceMirrorKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) { - InstanceKlass::oop_pc_update_pointers(obj, cm); - - PSParallelCompact::AdjustPointerClosure closure(cm); - if (UseCompressedOops) { - oop_oop_iterate_statics(obj, &closure); - } else { - oop_oop_iterate_statics(obj, &closure); - } -} - -void InstanceClassLoaderKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) { - InstanceKlass::oop_pc_update_pointers(obj, cm); -} - -#ifdef ASSERT -template static void trace_reference_gc(const char *s, oop obj, - T* referent_addr, - T* discovered_addr) { - log_develop_trace(gc, ref)("%s obj " PTR_FORMAT, s, p2i(obj)); - log_develop_trace(gc, ref)(" referent_addr/* " PTR_FORMAT " / " PTR_FORMAT, - p2i(referent_addr), referent_addr ? p2i((oop)RawAccess<>::oop_load(referent_addr)) : NULL); - log_develop_trace(gc, ref)(" discovered_addr/* " PTR_FORMAT " / " PTR_FORMAT, - p2i(discovered_addr), discovered_addr ? p2i((oop)RawAccess<>::oop_load(discovered_addr)) : NULL); -} -#endif - -template -static void oop_pc_update_pointers_specialized(oop obj, ParCompactionManager* cm) { - T* referent_addr = (T*)java_lang_ref_Reference::referent_addr_raw(obj); - PSParallelCompact::adjust_pointer(referent_addr, cm); - T* discovered_addr = (T*)java_lang_ref_Reference::discovered_addr_raw(obj); - PSParallelCompact::adjust_pointer(discovered_addr, cm); - debug_only(trace_reference_gc("InstanceRefKlass::oop_update_ptrs", obj, - referent_addr, discovered_addr);) -} - -void InstanceRefKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) { - InstanceKlass::oop_pc_update_pointers(obj, cm); - - if (UseCompressedOops) { - oop_pc_update_pointers_specialized(obj, cm); - } else { - oop_pc_update_pointers_specialized(obj, cm); - } -} - -void ObjArrayKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) { - assert(obj->is_objArray(), "obj must be obj array"); - PSParallelCompact::AdjustPointerClosure closure(cm); - if (UseCompressedOops) { - oop_oop_iterate_elements(objArrayOop(obj), &closure); - } else { - oop_oop_iterate_elements(objArrayOop(obj), &closure); - } -} - -void TypeArrayKlass::oop_pc_update_pointers(oop obj, ParCompactionManager* cm) { - assert(obj->is_typeArray(),"must be a type array"); -} - ParMarkBitMapClosure::IterationStatus MoveAndUpdateClosure::do_addr(HeapWord* addr, size_t words) { assert(destination() != NULL, "sanity"); diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.hpp b/src/hotspot/share/gc/parallel/psParallelCompact.hpp index 9c752d12cca..6477c68983c 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.hpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.hpp @@ -934,23 +934,6 @@ class PSParallelCompact : AllStatic { virtual bool do_object_b(oop p); }; - class AdjustPointerClosure: public BasicOopIterateClosure { - public: - AdjustPointerClosure(ParCompactionManager* cm) { - assert(cm != NULL, "associate ParCompactionManage should not be NULL"); - _cm = cm; - } - template void do_oop_work(T* p); - virtual void do_oop(oop* p); - virtual void do_oop(narrowOop* p); - - // This closure provides its own oop verification code. - debug_only(virtual bool should_verify_oops() { return false; }) - private: - ParCompactionManager* _cm; - }; - - friend class AdjustPointerClosure; friend class RefProcTaskProxy; friend class PSParallelCompactTest; diff --git a/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp b/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp index 0633d5e5368..c1949e2de0d 100644 --- a/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp +++ b/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp @@ -124,12 +124,21 @@ inline void PSParallelCompact::adjust_pointer(T* p, ParCompactionManager* cm) { } } -template -void PSParallelCompact::AdjustPointerClosure::do_oop_work(T* p) { - adjust_pointer(p, _cm); -} - -inline void PSParallelCompact::AdjustPointerClosure::do_oop(oop* p) { do_oop_work(p); } -inline void PSParallelCompact::AdjustPointerClosure::do_oop(narrowOop* p) { do_oop_work(p); } +class PCAdjustPointerClosure: public BasicOopIterateClosure { +public: + PCAdjustPointerClosure(ParCompactionManager* cm) { + assert(cm != NULL, "associate ParCompactionManage should not be NULL"); + _cm = cm; + } + template void do_oop_nv(T* p) { PSParallelCompact::adjust_pointer(p, _cm); } + virtual void do_oop(oop* p) { do_oop_nv(p); } + virtual void do_oop(narrowOop* p) { do_oop_nv(p); } + + // This closure provides its own oop verification code. + debug_only(virtual bool should_verify_oops() { return false; }) + virtual ReferenceIterationMode reference_iteration_mode() { return DO_FIELDS; } +private: + ParCompactionManager* _cm; +}; #endif // SHARE_VM_GC_PARALLEL_PSPARALLELCOMPACT_INLINE_HPP diff --git a/src/hotspot/share/oops/instanceClassLoaderKlass.hpp b/src/hotspot/share/oops/instanceClassLoaderKlass.hpp index 3f4ded2f6c6..c8dac589d2d 100644 --- a/src/hotspot/share/oops/instanceClassLoaderKlass.hpp +++ b/src/hotspot/share/oops/instanceClassLoaderKlass.hpp @@ -33,7 +33,7 @@ class ClassFileParser; // An InstanceClassLoaderKlass is a specialization of the InstanceKlass. It does // not add any field. It is added to walk the dependencies for the class loader // key that this class loader points to. This is how the loader_data graph is -// walked and dependant class loaders are kept alive. I thought we walked +// walked and dependent class loaders are kept alive. I thought we walked // the list later? class InstanceClassLoaderKlass: public InstanceKlass { @@ -48,18 +48,10 @@ private: public: InstanceClassLoaderKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } - // GC specific object visitors - // -#if INCLUDE_PARALLELGC - // Parallel Compact - void oop_pc_update_pointers(oop obj, ParCompactionManager* cm); -#endif - // Oop fields (and metadata) iterators // // The InstanceClassLoaderKlass iterators also visit the CLD pointer (or mirror of anonymous klasses.) - public: // Forward iteration // Iterate over the oop fields and metadata. template diff --git a/src/hotspot/share/oops/instanceKlass.hpp b/src/hotspot/share/oops/instanceKlass.hpp index 193bbfb209b..2bdfb60c784 100644 --- a/src/hotspot/share/oops/instanceKlass.hpp +++ b/src/hotspot/share/oops/instanceKlass.hpp @@ -1186,13 +1186,6 @@ public: const char* signature_name() const; static Symbol* package_from_name(const Symbol* name, TRAPS); - // GC specific object visitors - // -#if INCLUDE_PARALLELGC - // Parallel Compact - void oop_pc_update_pointers(oop obj, ParCompactionManager* cm); -#endif - // Oop fields (and metadata) iterators // // The InstanceKlass iterators also visits the Object's klass. diff --git a/src/hotspot/share/oops/instanceMirrorKlass.hpp b/src/hotspot/share/oops/instanceMirrorKlass.hpp index e197b94b7e8..c2e905d6770 100644 --- a/src/hotspot/share/oops/instanceMirrorKlass.hpp +++ b/src/hotspot/share/oops/instanceMirrorKlass.hpp @@ -89,13 +89,6 @@ class InstanceMirrorKlass: public InstanceKlass { // allocation instanceOop allocate_instance(Klass* k, TRAPS); - // GC specific object visitors - // -#if INCLUDE_PARALLELGC - // Parallel Compact - void oop_pc_update_pointers(oop obj, ParCompactionManager* cm); -#endif - static void serialize_offsets(class SerializeClosure* f) NOT_CDS_RETURN; // Oop fields (and metadata) iterators diff --git a/src/hotspot/share/oops/instanceRefKlass.hpp b/src/hotspot/share/oops/instanceRefKlass.hpp index 2966c04443f..66086bc1248 100644 --- a/src/hotspot/share/oops/instanceRefKlass.hpp +++ b/src/hotspot/share/oops/instanceRefKlass.hpp @@ -58,13 +58,6 @@ class InstanceRefKlass: public InstanceKlass { public: InstanceRefKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } - // GC specific object visitors - // -#if INCLUDE_PARALLELGC - // Parallel Compact - void oop_pc_update_pointers(oop obj, ParCompactionManager* cm); -#endif - // Oop fields (and metadata) iterators // // The InstanceRefKlass iterators also support reference processing. diff --git a/src/hotspot/share/oops/klass.hpp b/src/hotspot/share/oops/klass.hpp index 26a69943d37..d72e9ddc378 100644 --- a/src/hotspot/share/oops/klass.hpp +++ b/src/hotspot/share/oops/klass.hpp @@ -670,13 +670,6 @@ protected: clean_weak_klass_links(/*unloading_occurred*/ true , /* clean_alive_klasses */ false); } - // GC specific object visitors - // -#if INCLUDE_PARALLELGC - // Parallel Compact - virtual void oop_pc_update_pointers(oop obj, ParCompactionManager* cm) = 0; -#endif - virtual void array_klasses_do(void f(Klass* k)) {} // Return self, except for abstract classes with exactly 1 diff --git a/src/hotspot/share/oops/objArrayKlass.hpp b/src/hotspot/share/oops/objArrayKlass.hpp index 42958b39232..10ae0cf95c9 100644 --- a/src/hotspot/share/oops/objArrayKlass.hpp +++ b/src/hotspot/share/oops/objArrayKlass.hpp @@ -120,13 +120,6 @@ class ObjArrayKlass : public ArrayKlass { // Initialization (virtual from Klass) void initialize(TRAPS); - // GC specific object visitors - // -#if INCLUDE_PARALLELGC - // Parallel Compact - void oop_pc_update_pointers(oop obj, ParCompactionManager* cm); -#endif - // Oop fields (and metadata) iterators // // The ObjArrayKlass iterators also visits the Object's klass. diff --git a/src/hotspot/share/oops/oop.hpp b/src/hotspot/share/oops/oop.hpp index 8f8e6e3a802..c411065a541 100644 --- a/src/hotspot/share/oops/oop.hpp +++ b/src/hotspot/share/oops/oop.hpp @@ -284,13 +284,6 @@ class oopDesc { // mark-sweep support void follow_body(int begin, int end); - // Garbage Collection support - -#if INCLUDE_PARALLELGC - // Parallel Compact - inline void pc_update_contents(ParCompactionManager* cm); -#endif - template inline void oop_iterate(OopClosureType* cl); diff --git a/src/hotspot/share/oops/oop.inline.hpp b/src/hotspot/share/oops/oop.inline.hpp index 67a7505b7a5..9bff2d6816b 100644 --- a/src/hotspot/share/oops/oop.inline.hpp +++ b/src/hotspot/share/oops/oop.inline.hpp @@ -426,18 +426,6 @@ void oopDesc::incr_age() { } } -#if INCLUDE_PARALLELGC - -void oopDesc::pc_update_contents(ParCompactionManager* cm) { - Klass* k = klass(); - if (!k->is_typeArray_klass()) { - // It might contain oops beyond the header, so take the virtual call. - k->oop_pc_update_pointers(this, cm); - } - // Else skip it. The TypeArrayKlass in the header never needs scavenging. -} -#endif // INCLUDE_PARALLELGC - template void oopDesc::oop_iterate(OopClosureType* cl) { OopIteratorClosureDispatch::oop_oop_iterate(cl, this, klass()); diff --git a/src/hotspot/share/oops/typeArrayKlass.hpp b/src/hotspot/share/oops/typeArrayKlass.hpp index bc2da542a20..a237be1cca3 100644 --- a/src/hotspot/share/oops/typeArrayKlass.hpp +++ b/src/hotspot/share/oops/typeArrayKlass.hpp @@ -74,14 +74,6 @@ class TypeArrayKlass : public ArrayKlass { // Copying void copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos, int length, TRAPS); - // GC specific object visitors - // - -#if INCLUDE_PARALLELGC - // Parallel Compact - void oop_pc_update_pointers(oop obj, ParCompactionManager* cm); -#endif - // Oop iterators. Since there are no oops in TypeArrayKlasses, // these functions only return the size of the object.