< prev index next >

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

8201436: Replace oop_ps_push_contents with oop_iterate and closure
 #include "gc/parallel/parallelScavengeHeap.hpp"
 #include "gc/parallel/parMarkBitMap.inline.hpp"
 #include "gc/parallel/psOldGen.hpp"
 #include "gc/parallel/psPromotionLAB.inline.hpp"
 #include "gc/parallel/psPromotionManager.hpp"
-#include "gc/parallel/psScavenge.hpp"
+#include "gc/parallel/psScavenge.inline.hpp"
 #include "gc/shared/taskqueue.inline.hpp"
 #include "logging/log.hpp"
+#include "memory/iterator.inline.hpp"
 #include "oops/access.inline.hpp"
 #include "oops/oop.inline.hpp"
 
 inline PSPromotionManager* PSPromotionManager::manager_array(uint index) {
   assert(_manager_array != NULL, "access of NULL manager_array");

@@ -97,12 +98,52 } } } } +class PSPushContentsClosure: public BasicOopIterateClosure { + PSPromotionManager* _pm; + public: + PSPushContentsClosure(PSPromotionManager* pm) : BasicOopIterateClosure(PSScavenge::reference_processor()), _pm(pm) {} + + template <typename T> void do_oop_nv(T* p) { + if (PSScavenge::should_scavenge(p)) { + _pm->claim_or_forward_depth(p); + } + } + + virtual void do_oop(oop* p) { do_oop_nv(p); } + virtual void do_oop(narrowOop* p) { do_oop_nv(p); } + + // Don't use the oop verification code in the oop_oop_iterate framework. + debug_only(virtual bool should_verify_oops() { return false; }) +}; + +// +// This closure specialization will override the one that is defined in +// instanceRefKlass.inline.cpp. It swaps the order of oop_oop_iterate and +// oop_oop_iterate_ref_processing. Unfortunately G1 and Parallel behaves +// significantly better (especially in the Derby benchmark) using opposite +// order of these function calls. +// +template <> +inline void InstanceRefKlass::oop_oop_iterate_reverse<oop, PSPushContentsClosure>(oop obj, PSPushContentsClosure* closure) { + oop_oop_iterate_ref_processing<oop>(obj, closure); + InstanceKlass::oop_oop_iterate_reverse<oop>(obj, closure); +} + +template <> +inline void InstanceRefKlass::oop_oop_iterate_reverse<narrowOop, PSPushContentsClosure>(oop obj, PSPushContentsClosure* closure) { + oop_oop_iterate_ref_processing<narrowOop>(obj, closure); + InstanceKlass::oop_oop_iterate_reverse<narrowOop>(obj, closure); +} + inline void PSPromotionManager::push_contents(oop obj) { - obj->ps_push_contents(this); + if (!obj->klass()->is_typeArray_klass()) { + PSPushContentsClosure pcc(this); + obj->oop_iterate_backwards(&pcc); + } } // // This method is pretty bulky. It would be nice to split it up // into smaller submethods, but we need to be careful not to hurt // performance.
< prev index next >