88 protected:
89 MutableSpace* _to_space;
90 PSPromotionManager* _promotion_manager;
91
92 public:
93 PSKeepAliveClosure(PSPromotionManager* pm) : _promotion_manager(pm) {
94 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
95 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
96 _to_space = heap->young_gen()->to_space();
97
98 assert(_promotion_manager != NULL, "Sanity");
99 }
100
101 template <class T> void do_oop_work(T* p) {
102 assert (!oopDesc::is_null(*p), "expected non-null ref");
103 assert ((oopDesc::load_decode_heap_oop_not_null(p))->is_oop(),
104 "expected an oop while scanning weak refs");
105
106 // Weak refs may be visited more than once.
107 if (PSScavenge::should_scavenge(p, _to_space)) {
108 PSScavenge::copy_and_push_safe_barrier<T, /*promote_immediately=*/false>(_promotion_manager, p);
109 }
110 }
111 virtual void do_oop(oop* p) { PSKeepAliveClosure::do_oop_work(p); }
112 virtual void do_oop(narrowOop* p) { PSKeepAliveClosure::do_oop_work(p); }
113 };
114
115 class PSEvacuateFollowersClosure: public VoidClosure {
116 private:
117 PSPromotionManager* _promotion_manager;
118 public:
119 PSEvacuateFollowersClosure(PSPromotionManager* pm) : _promotion_manager(pm) {}
120
121 virtual void do_void() {
122 assert(_promotion_manager != NULL, "Sanity");
123 _promotion_manager->drain_stacks(true);
124 guarantee(_promotion_manager->stacks_empty(),
125 "stacks should be empty at this point");
126 }
127 };
128
|
88 protected:
89 MutableSpace* _to_space;
90 PSPromotionManager* _promotion_manager;
91
92 public:
93 PSKeepAliveClosure(PSPromotionManager* pm) : _promotion_manager(pm) {
94 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
95 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
96 _to_space = heap->young_gen()->to_space();
97
98 assert(_promotion_manager != NULL, "Sanity");
99 }
100
101 template <class T> void do_oop_work(T* p) {
102 assert (!oopDesc::is_null(*p), "expected non-null ref");
103 assert ((oopDesc::load_decode_heap_oop_not_null(p))->is_oop(),
104 "expected an oop while scanning weak refs");
105
106 // Weak refs may be visited more than once.
107 if (PSScavenge::should_scavenge(p, _to_space)) {
108 _promotion_manager->copy_and_push_safe_barrier<T, /*promote_immediately=*/false>(p);
109 }
110 }
111 virtual void do_oop(oop* p) { PSKeepAliveClosure::do_oop_work(p); }
112 virtual void do_oop(narrowOop* p) { PSKeepAliveClosure::do_oop_work(p); }
113 };
114
115 class PSEvacuateFollowersClosure: public VoidClosure {
116 private:
117 PSPromotionManager* _promotion_manager;
118 public:
119 PSEvacuateFollowersClosure(PSPromotionManager* pm) : _promotion_manager(pm) {}
120
121 virtual void do_void() {
122 assert(_promotion_manager != NULL, "Sanity");
123 _promotion_manager->drain_stacks(true);
124 guarantee(_promotion_manager->stacks_empty(),
125 "stacks should be empty at this point");
126 }
127 };
128
|