< prev index next >
src/hotspot/share/gc/parallel/psCompactionManager.inline.hpp
8211446: Replace oop_pc_follow_contents with oop_iterate and closure
*/
#ifndef SHARE_VM_GC_PARALLEL_PSCOMPACTIONMANAGER_INLINE_HPP
#define SHARE_VM_GC_PARALLEL_PSCOMPACTIONMANAGER_INLINE_HPP
+ #include "classfile/javaClasses.inline.hpp"
#include "gc/parallel/parMarkBitMap.hpp"
#include "gc/parallel/psCompactionManager.hpp"
#include "gc/parallel/psParallelCompact.inline.hpp"
#include "gc/shared/taskqueue.inline.hpp"
#include "oops/access.inline.hpp"
***************
push(obj);
}
}
}
- template <typename T>
- inline void ParCompactionManager::MarkAndPushClosure::do_oop_work(T* p) {
- _compaction_manager->mark_and_push(p);
- }
-
- inline void ParCompactionManager::MarkAndPushClosure::do_oop(oop* p) { do_oop_work(p); }
- inline void ParCompactionManager::MarkAndPushClosure::do_oop(narrowOop* p) { do_oop_work(p); }
-
inline void ParCompactionManager::follow_klass(Klass* klass) {
oop holder = klass->klass_holder();
mark_and_push(&holder);
}
inline void ParCompactionManager::FollowStackClosure::do_void() {
_compaction_manager->follow_marking_stacks();
}
- inline void ParCompactionManager::follow_class_loader(ClassLoaderData* cld) {
- MarkAndPushClosure mark_and_push_closure(this);
-
- cld->oops_do(&mark_and_push_closure, true);
- }
- inline void ParCompactionManager::follow_contents(oop obj) {
- assert(PSParallelCompact::mark_bitmap()->is_marked(obj), "should be marked");
- obj->pc_follow_contents(this);
- }
! template <class T>
! inline void oop_pc_follow_contents_specialized(objArrayOop obj, int index, ParCompactionManager* cm) {
const size_t len = size_t(obj->length());
const size_t beg_index = size_t(index);
assert(beg_index < len || len == 0, "index too large");
const size_t stride = MIN2(len - beg_index, (size_t)ObjArrayMarkingStride);
push(obj);
}
}
}
inline void ParCompactionManager::follow_klass(Klass* klass) {
oop holder = klass->klass_holder();
mark_and_push(&holder);
}
inline void ParCompactionManager::FollowStackClosure::do_void() {
_compaction_manager->follow_marking_stacks();
}
! template <typename T>
! inline void follow_array_specialized(objArrayOop obj, int index, ParCompactionManager* cm) {
const size_t len = size_t(obj->length());
const size_t beg_index = size_t(index);
assert(beg_index < len || len == 0, "index too large");
const size_t stride = MIN2(len - beg_index, (size_t)ObjArrayMarkingStride);
***************
for (T* e = beg; e < end; e++) {
cm->mark_and_push<T>(e);
}
}
! inline void ParCompactionManager::follow_contents(objArrayOop obj, int index) {
if (UseCompressedOops) {
! oop_pc_follow_contents_specialized<narrowOop>(obj, index, this);
} else {
! oop_pc_follow_contents_specialized<oop>(obj, index, this);
}
}
inline void ParCompactionManager::update_contents(oop obj) {
obj->pc_update_contents(this);
}
#endif // SHARE_VM_GC_PARALLEL_PSCOMPACTIONMANAGER_INLINE_HPP
for (T* e = beg; e < end; e++) {
cm->mark_and_push<T>(e);
}
}
! inline void ParCompactionManager::follow_array(objArrayOop obj, int index) {
if (UseCompressedOops) {
! follow_array_specialized<narrowOop>(obj, index, this);
} else {
! follow_array_specialized<oop>(obj, index, this);
}
}
inline void ParCompactionManager::update_contents(oop obj) {
obj->pc_update_contents(this);
}
+ class PSMarkAndPushClosure: public OopClosure {
+ private:
+ ParCompactionManager* _compaction_manager;
+ public:
+ PSMarkAndPushClosure(ParCompactionManager* cm) : _compaction_manager(cm) { }
+
+ template <typename T> void do_oop_nv(T* p) { _compaction_manager->mark_and_push(p); }
+ 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; })
+ };
+
+ class PSIterateMarkAndPushClosure: public MetadataVisitingOopIterateClosure {
+ private:
+ ParCompactionManager* _compaction_manager;
+ public:
+ PSIterateMarkAndPushClosure(ParCompactionManager* cm, ReferenceProcessor* rp) : MetadataVisitingOopIterateClosure(rp), _compaction_manager(cm) { }
+
+ template <typename T> void do_oop_nv(T* p) { _compaction_manager->mark_and_push(p); }
+ virtual void do_oop(oop* p) { do_oop_nv(p); }
+ virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
+
+ void do_klass_nv(Klass* k) { _compaction_manager->follow_klass(k); }
+ void do_cld_nv(ClassLoaderData* cld) { _compaction_manager->follow_class_loader(cld); }
+
+ // This closure provides its own oop verification code.
+ debug_only(virtual bool should_verify_oops() { return false; })
+ };
+
+ inline void ParCompactionManager::follow_class_loader(ClassLoaderData* cld) {
+ PSMarkAndPushClosure mark_and_push_closure(this);
+ cld->oops_do(&mark_and_push_closure, true);
+ }
+
+ inline void ParCompactionManager::follow_contents(oop obj) {
+ assert(PSParallelCompact::mark_bitmap()->is_marked(obj), "should be marked");
+ if (obj->is_objArray()) {
+ follow_array(objArrayOop(obj), 0);
+ } else {
+ PSIterateMarkAndPushClosure cl(this, PSParallelCompact::ref_processor());
+ obj->oop_iterate(&cl);
+ }
+ }
+
#endif // SHARE_VM_GC_PARALLEL_PSCOMPACTIONMANAGER_INLINE_HPP
< prev index next >