78 }
79 };
80
81 PSIsAliveClosure PSScavenge::_is_alive_closure;
82
83 class PSKeepAliveClosure: public OopClosure {
84 protected:
85 MutableSpace* _to_space;
86 PSPromotionManager* _promotion_manager;
87
88 public:
89 PSKeepAliveClosure(PSPromotionManager* pm) : _promotion_manager(pm) {
90 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
91 _to_space = heap->young_gen()->to_space();
92
93 assert(_promotion_manager != NULL, "Sanity");
94 }
95
96 template <class T> void do_oop_work(T* p) {
97 assert (!oopDesc::is_null(*p), "expected non-null ref");
98 assert ((oopDesc::load_decode_heap_oop_not_null(p))->is_oop(),
99 "expected an oop while scanning weak refs");
100
101 // Weak refs may be visited more than once.
102 if (PSScavenge::should_scavenge(p, _to_space)) {
103 _promotion_manager->copy_and_push_safe_barrier<T, /*promote_immediately=*/false>(p);
104 }
105 }
106 virtual void do_oop(oop* p) { PSKeepAliveClosure::do_oop_work(p); }
107 virtual void do_oop(narrowOop* p) { PSKeepAliveClosure::do_oop_work(p); }
108 };
109
110 class PSEvacuateFollowersClosure: public VoidClosure {
111 private:
112 PSPromotionManager* _promotion_manager;
113 public:
114 PSEvacuateFollowersClosure(PSPromotionManager* pm) : _promotion_manager(pm) {}
115
116 virtual void do_void() {
117 assert(_promotion_manager != NULL, "Sanity");
118 _promotion_manager->drain_stacks(true);
|
78 }
79 };
80
81 PSIsAliveClosure PSScavenge::_is_alive_closure;
82
83 class PSKeepAliveClosure: public OopClosure {
84 protected:
85 MutableSpace* _to_space;
86 PSPromotionManager* _promotion_manager;
87
88 public:
89 PSKeepAliveClosure(PSPromotionManager* pm) : _promotion_manager(pm) {
90 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
91 _to_space = heap->young_gen()->to_space();
92
93 assert(_promotion_manager != NULL, "Sanity");
94 }
95
96 template <class T> void do_oop_work(T* p) {
97 assert (!oopDesc::is_null(*p), "expected non-null ref");
98 assert (oopDesc::is_oop(oopDesc::load_decode_heap_oop_not_null(p)),
99 "expected an oop while scanning weak refs");
100
101 // Weak refs may be visited more than once.
102 if (PSScavenge::should_scavenge(p, _to_space)) {
103 _promotion_manager->copy_and_push_safe_barrier<T, /*promote_immediately=*/false>(p);
104 }
105 }
106 virtual void do_oop(oop* p) { PSKeepAliveClosure::do_oop_work(p); }
107 virtual void do_oop(narrowOop* p) { PSKeepAliveClosure::do_oop_work(p); }
108 };
109
110 class PSEvacuateFollowersClosure: public VoidClosure {
111 private:
112 PSPromotionManager* _promotion_manager;
113 public:
114 PSEvacuateFollowersClosure(PSPromotionManager* pm) : _promotion_manager(pm) {}
115
116 virtual void do_void() {
117 assert(_promotion_manager != NULL, "Sanity");
118 _promotion_manager->drain_stacks(true);
|