46 }; |
46 }; |
47 |
47 |
48 class G1ParClosureSuper : public OopsInHeapRegionClosure { |
48 class G1ParClosureSuper : public OopsInHeapRegionClosure { |
49 protected: |
49 protected: |
50 G1CollectedHeap* _g1; |
50 G1CollectedHeap* _g1; |
51 G1RemSet* _g1_rem; |
|
52 ConcurrentMark* _cm; |
|
53 G1ParScanThreadState* _par_scan_state; |
51 G1ParScanThreadState* _par_scan_state; |
54 uint _worker_id; |
52 uint _worker_id; |
55 bool _during_initial_mark; |
|
56 bool _mark_in_progress; |
|
57 public: |
53 public: |
58 G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state); |
54 G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state); |
59 bool apply_to_weak_ref_discovered_field() { return true; } |
55 bool apply_to_weak_ref_discovered_field() { return true; } |
60 }; |
56 }; |
61 |
57 |
131 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } |
127 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } |
132 }; |
128 }; |
133 |
129 |
134 // Add back base class for metadata |
130 // Add back base class for metadata |
135 class G1ParCopyHelper : public G1ParClosureSuper { |
131 class G1ParCopyHelper : public G1ParClosureSuper { |
|
132 protected: |
136 Klass* _scanned_klass; |
133 Klass* _scanned_klass; |
137 |
134 ConcurrentMark* _cm; |
|
135 |
|
136 // Mark the object if it's not already marked. This is used to mark |
|
137 // objects pointed to by roots that are guaranteed not to move |
|
138 // during the GC (i.e., non-CSet objects). It is MT-safe. |
|
139 void mark_object(oop obj); |
|
140 |
|
141 // Mark the object if it's not already marked. This is used to mark |
|
142 // objects pointed to by roots that have been forwarded during a |
|
143 // GC. It is MT-safe. |
|
144 void mark_forwarded_object(oop from_obj, oop to_obj); |
138 public: |
145 public: |
139 G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : |
146 G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state); |
140 _scanned_klass(NULL), |
|
141 G1ParClosureSuper(g1, par_scan_state) {} |
|
142 |
147 |
143 void set_scanned_klass(Klass* k) { _scanned_klass = k; } |
148 void set_scanned_klass(Klass* k) { _scanned_klass = k; } |
144 template <class T> void do_klass_barrier(T* p, oop new_obj); |
149 template <class T> void do_klass_barrier(T* p, oop new_obj); |
145 }; |
150 }; |
146 |
151 |
148 class G1ParCopyClosure : public G1ParCopyHelper { |
153 class G1ParCopyClosure : public G1ParCopyHelper { |
149 G1ParScanClosure _scanner; |
154 G1ParScanClosure _scanner; |
150 template <class T> void do_oop_work(T* p); |
155 template <class T> void do_oop_work(T* p); |
151 |
156 |
152 protected: |
157 protected: |
153 // Mark the object if it's not already marked. This is used to mark |
|
154 // objects pointed to by roots that are guaranteed not to move |
|
155 // during the GC (i.e., non-CSet objects). It is MT-safe. |
|
156 void mark_object(oop obj); |
|
157 |
|
158 // Mark the object if it's not already marked. This is used to mark |
|
159 // objects pointed to by roots that have been forwarded during a |
|
160 // GC. It is MT-safe. |
|
161 void mark_forwarded_object(oop from_obj, oop to_obj); |
|
162 |
|
163 oop copy_to_survivor_space(oop obj); |
158 oop copy_to_survivor_space(oop obj); |
164 |
159 |
165 public: |
160 public: |
166 G1ParCopyClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, |
161 G1ParCopyClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, |
167 ReferenceProcessor* rp) : |
162 ReferenceProcessor* rp) : |
170 assert(_ref_processor == NULL, "sanity"); |
165 assert(_ref_processor == NULL, "sanity"); |
171 } |
166 } |
172 |
167 |
173 G1ParScanClosure* scanner() { return &_scanner; } |
168 G1ParScanClosure* scanner() { return &_scanner; } |
174 |
169 |
175 template <class T> void do_oop_nv(T* p) { |
170 template <class T> void do_oop_nv(T* p) { do_oop_work(p); } |
176 do_oop_work(p); |
|
177 } |
|
178 virtual void do_oop(oop* p) { do_oop_nv(p); } |
171 virtual void do_oop(oop* p) { do_oop_nv(p); } |
179 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } |
172 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } |
180 }; |
173 }; |
181 |
174 |
182 typedef G1ParCopyClosure<G1BarrierNone, false> G1ParScanExtRootClosure; |
175 typedef G1ParCopyClosure<G1BarrierNone, false> G1ParScanExtRootClosure; |