183 inline void do_oop_work(T* p);
184 };
185
186 using ShenandoahEvacuateUpdateMetadataClosure = ShenandoahEvacuateUpdateRootClosureBase<false, true>;
187 using ShenandoahEvacuateUpdateRootsClosure = ShenandoahEvacuateUpdateRootClosureBase<true, false>;
188 using ShenandoahContextEvacuateUpdateRootsClosure = ShenandoahEvacuateUpdateRootClosureBase<true, true>;
189
190
191 template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
192 class ShenandoahCleanUpdateWeakOopsClosure : public OopClosure {
193 private:
194 IsAlive* _is_alive;
195 KeepAlive* _keep_alive;
196
197 public:
198 inline ShenandoahCleanUpdateWeakOopsClosure(IsAlive* is_alive, KeepAlive* keep_alive);
199 inline void do_oop(oop* p);
200 inline void do_oop(narrowOop* p);
201 };
202
203 class ShenandoahNMethodAndDisarmClosure : public NMethodToOopClosure {
204 public:
205 inline ShenandoahNMethodAndDisarmClosure(OopClosure* cl);
206 inline void do_nmethod(nmethod* nm);
207 };
208
209
210 //
211 // ========= Update References
212 //
213
214 template <ShenandoahGenerationType GENERATION>
215 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
216 private:
217 template <class T>
218 inline void work(T* p);
219
220 public:
221 ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp, ShenandoahObjToScanQueue* old_q);
222
223 virtual void do_oop(narrowOop* p) { work(p); }
224 virtual void do_oop(oop* p) { work(p); }
225 };
226
227 class ShenandoahUpdateRefsSuperClosure : public ShenandoahSuperClosure {};
228
229 class ShenandoahNonConcUpdateRefsClosure : public ShenandoahUpdateRefsSuperClosure {
245 virtual void do_oop(narrowOop* p) { work(p); }
246 virtual void do_oop(oop* p) { work(p); }
247 };
248
249
250 class ShenandoahFlushSATB : public ThreadClosure {
251 private:
252 SATBMarkQueueSet& _satb_qset;
253
254 public:
255 explicit ShenandoahFlushSATB(SATBMarkQueueSet& satb_qset) : _satb_qset(satb_qset) {}
256
257 inline void do_thread(Thread* thread) override;
258 };
259
260
261 //
262 // ========= Utilities
263 //
264
265 #ifdef ASSERT
266 class ShenandoahAssertNotForwardedClosure : public OopClosure {
267 private:
268 template <class T>
269 inline void do_oop_work(T* p);
270
271 public:
272 inline void do_oop(narrowOop* p);
273 inline void do_oop(oop* p);
274 };
275 #endif // ASSERT
276
277 class ShenandoahMultiThreadClosure : public ThreadClosure {
278 ThreadClosure& _cl1;
279 ThreadClosure& _cl2;
280 public:
281 ShenandoahMultiThreadClosure(ThreadClosure& cl1, ThreadClosure& cl2) :
282 _cl1(cl1), _cl2(cl2) {}
283 inline void do_thread(Thread* thread) override {
284 _cl1.do_thread(thread);
|
183 inline void do_oop_work(T* p);
184 };
185
186 using ShenandoahEvacuateUpdateMetadataClosure = ShenandoahEvacuateUpdateRootClosureBase<false, true>;
187 using ShenandoahEvacuateUpdateRootsClosure = ShenandoahEvacuateUpdateRootClosureBase<true, false>;
188 using ShenandoahContextEvacuateUpdateRootsClosure = ShenandoahEvacuateUpdateRootClosureBase<true, true>;
189
190
191 template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
192 class ShenandoahCleanUpdateWeakOopsClosure : public OopClosure {
193 private:
194 IsAlive* _is_alive;
195 KeepAlive* _keep_alive;
196
197 public:
198 inline ShenandoahCleanUpdateWeakOopsClosure(IsAlive* is_alive, KeepAlive* keep_alive);
199 inline void do_oop(oop* p);
200 inline void do_oop(narrowOop* p);
201 };
202
203 //
204 // ========= Update References
205 //
206
207 template <ShenandoahGenerationType GENERATION>
208 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
209 private:
210 template <class T>
211 inline void work(T* p);
212
213 public:
214 ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp, ShenandoahObjToScanQueue* old_q);
215
216 virtual void do_oop(narrowOop* p) { work(p); }
217 virtual void do_oop(oop* p) { work(p); }
218 };
219
220 class ShenandoahUpdateRefsSuperClosure : public ShenandoahSuperClosure {};
221
222 class ShenandoahNonConcUpdateRefsClosure : public ShenandoahUpdateRefsSuperClosure {
238 virtual void do_oop(narrowOop* p) { work(p); }
239 virtual void do_oop(oop* p) { work(p); }
240 };
241
242
243 class ShenandoahFlushSATB : public ThreadClosure {
244 private:
245 SATBMarkQueueSet& _satb_qset;
246
247 public:
248 explicit ShenandoahFlushSATB(SATBMarkQueueSet& satb_qset) : _satb_qset(satb_qset) {}
249
250 inline void do_thread(Thread* thread) override;
251 };
252
253
254 //
255 // ========= Utilities
256 //
257
258 class ShenandoahNoOpClosure : public OopClosure {
259 public:
260 inline void do_oop(oop* p) { }
261 inline void do_oop(narrowOop* p) { }
262 };
263
264 #ifdef ASSERT
265 class ShenandoahAssertNotForwardedClosure : public OopClosure {
266 private:
267 template <class T>
268 inline void do_oop_work(T* p);
269
270 public:
271 inline void do_oop(narrowOop* p);
272 inline void do_oop(oop* p);
273 };
274 #endif // ASSERT
275
276 class ShenandoahMultiThreadClosure : public ThreadClosure {
277 ThreadClosure& _cl1;
278 ThreadClosure& _cl2;
279 public:
280 ShenandoahMultiThreadClosure(ThreadClosure& cl1, ThreadClosure& cl2) :
281 _cl1(cl1), _cl2(cl2) {}
282 inline void do_thread(Thread* thread) override {
283 _cl1.do_thread(thread);
|