53 };
54
55 class PCIterateMarkAndPushClosure: public MetadataVisitingOopIterateClosure {
56 private:
57 ParCompactionManager* _compaction_manager;
58 public:
59 PCIterateMarkAndPushClosure(ParCompactionManager* cm, ReferenceProcessor* rp) : MetadataVisitingOopIterateClosure(rp), _compaction_manager(cm) { }
60
61 template <typename T> void do_oop_nv(T* p) { _compaction_manager->mark_and_push(p); }
62 virtual void do_oop(oop* p) { do_oop_nv(p); }
63 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
64
65 void do_klass_nv(Klass* k) { _compaction_manager->follow_klass(k); }
66 void do_cld_nv(ClassLoaderData* cld) { _compaction_manager->follow_class_loader(cld); }
67
68 // This closure provides its own oop verification code.
69 debug_only(virtual bool should_verify_oops() { return false; })
70 };
71
72 inline bool ParCompactionManager::steal(int queue_num, oop& t) {
73 return stack_array()->steal(queue_num, t);
74 }
75
76 inline bool ParCompactionManager::steal_objarray(int queue_num, ObjArrayTask& t) {
77 return _objarray_queues->steal(queue_num, t);
78 }
79
80 inline bool ParCompactionManager::steal(int queue_num, size_t& region) {
81 return region_array()->steal(queue_num, region);
82 }
83
84 inline void ParCompactionManager::push(oop obj) {
85 _marking_stack.push(obj);
86 }
87
88 void ParCompactionManager::push_objarray(oop obj, size_t index)
89 {
90 ObjArrayTask task(obj, index);
91 assert(task.is_valid(), "bad ObjArrayTask");
92 _objarray_stack.push(task);
93 }
94
95 void ParCompactionManager::push_region(size_t index)
96 {
97 #ifdef ASSERT
98 const ParallelCompactData& sd = PSParallelCompact::summary_data();
99 ParallelCompactData::RegionData* const region_ptr = sd.region(index);
100 assert(region_ptr->claimed(), "must be claimed");
101 assert(region_ptr->_pushed++ == 0, "should only be pushed once");
|
53 };
54
55 class PCIterateMarkAndPushClosure: public MetadataVisitingOopIterateClosure {
56 private:
57 ParCompactionManager* _compaction_manager;
58 public:
59 PCIterateMarkAndPushClosure(ParCompactionManager* cm, ReferenceProcessor* rp) : MetadataVisitingOopIterateClosure(rp), _compaction_manager(cm) { }
60
61 template <typename T> void do_oop_nv(T* p) { _compaction_manager->mark_and_push(p); }
62 virtual void do_oop(oop* p) { do_oop_nv(p); }
63 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
64
65 void do_klass_nv(Klass* k) { _compaction_manager->follow_klass(k); }
66 void do_cld_nv(ClassLoaderData* cld) { _compaction_manager->follow_class_loader(cld); }
67
68 // This closure provides its own oop verification code.
69 debug_only(virtual bool should_verify_oops() { return false; })
70 };
71
72 inline bool ParCompactionManager::steal(int queue_num, oop& t) {
73 return oop_task_queues()->steal(queue_num, t);
74 }
75
76 inline bool ParCompactionManager::steal_objarray(int queue_num, ObjArrayTask& t) {
77 return _objarray_task_queues->steal(queue_num, t);
78 }
79
80 inline bool ParCompactionManager::steal(int queue_num, size_t& region) {
81 return region_task_queues()->steal(queue_num, region);
82 }
83
84 inline void ParCompactionManager::push(oop obj) {
85 _marking_stack.push(obj);
86 }
87
88 void ParCompactionManager::push_objarray(oop obj, size_t index)
89 {
90 ObjArrayTask task(obj, index);
91 assert(task.is_valid(), "bad ObjArrayTask");
92 _objarray_stack.push(task);
93 }
94
95 void ParCompactionManager::push_region(size_t index)
96 {
97 #ifdef ASSERT
98 const ParallelCompactData& sd = PSParallelCompact::summary_data();
99 ParallelCompactData::RegionData* const region_ptr = sd.region(index);
100 assert(region_ptr->claimed(), "must be claimed");
101 assert(region_ptr->_pushed++ == 0, "should only be pushed once");
|