166 inline void do_oop_work(T* p);
167 };
168
169 using ShenandoahEvacuateUpdateMetadataClosure = ShenandoahEvacuateUpdateRootClosureBase<false, true>;
170 using ShenandoahEvacuateUpdateRootsClosure = ShenandoahEvacuateUpdateRootClosureBase<true, false>;
171 using ShenandoahContextEvacuateUpdateRootsClosure = ShenandoahEvacuateUpdateRootClosureBase<true, true>;
172
173
174 template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
175 class ShenandoahCleanUpdateWeakOopsClosure : public OopClosure {
176 private:
177 IsAlive* _is_alive;
178 KeepAlive* _keep_alive;
179
180 public:
181 inline ShenandoahCleanUpdateWeakOopsClosure(IsAlive* is_alive, KeepAlive* keep_alive);
182 inline void do_oop(oop* p);
183 inline void do_oop(narrowOop* p);
184 };
185
186 class ShenandoahNMethodAndDisarmClosure : public NMethodToOopClosure {
187 public:
188 inline ShenandoahNMethodAndDisarmClosure(OopClosure* cl);
189 inline void do_nmethod(nmethod* nm);
190 };
191
192
193 //
194 // ========= Update References
195 //
196
197 template <ShenandoahGenerationType GENERATION>
198 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
199 private:
200 template <class T>
201 inline void work(T* p);
202
203 public:
204 ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp, ShenandoahObjToScanQueue* old_q);
205
206 virtual void do_oop(narrowOop* p) { work(p); }
207 virtual void do_oop(oop* p) { work(p); }
208 };
209
210 class ShenandoahUpdateRefsSuperClosure : public ShenandoahSuperClosure {};
211
212 class ShenandoahNonConcUpdateRefsClosure : public ShenandoahUpdateRefsSuperClosure {
228 virtual void do_oop(narrowOop* p) { work(p); }
229 virtual void do_oop(oop* p) { work(p); }
230 };
231
232
233 class ShenandoahFlushSATB : public ThreadClosure {
234 private:
235 SATBMarkQueueSet& _satb_qset;
236
237 public:
238 explicit ShenandoahFlushSATB(SATBMarkQueueSet& satb_qset) : _satb_qset(satb_qset) {}
239
240 inline void do_thread(Thread* thread) override;
241 };
242
243
244 //
245 // ========= Utilities
246 //
247
248 #ifdef ASSERT
249 class ShenandoahAssertNotForwardedClosure : public OopClosure {
250 private:
251 template <class T>
252 inline void do_oop_work(T* p);
253
254 public:
255 inline void do_oop(narrowOop* p);
256 inline void do_oop(oop* p);
257 };
258 #endif // ASSERT
259
260 class ShenandoahMultiThreadClosure : public ThreadClosure {
261 ThreadClosure& _cl1;
262 ThreadClosure& _cl2;
263 public:
264 ShenandoahMultiThreadClosure(ThreadClosure& cl1, ThreadClosure& cl2) :
265 _cl1(cl1), _cl2(cl2) {}
266 inline void do_thread(Thread* thread) override {
267 _cl1.do_thread(thread);
|
166 inline void do_oop_work(T* p);
167 };
168
169 using ShenandoahEvacuateUpdateMetadataClosure = ShenandoahEvacuateUpdateRootClosureBase<false, true>;
170 using ShenandoahEvacuateUpdateRootsClosure = ShenandoahEvacuateUpdateRootClosureBase<true, false>;
171 using ShenandoahContextEvacuateUpdateRootsClosure = ShenandoahEvacuateUpdateRootClosureBase<true, true>;
172
173
174 template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
175 class ShenandoahCleanUpdateWeakOopsClosure : public OopClosure {
176 private:
177 IsAlive* _is_alive;
178 KeepAlive* _keep_alive;
179
180 public:
181 inline ShenandoahCleanUpdateWeakOopsClosure(IsAlive* is_alive, KeepAlive* keep_alive);
182 inline void do_oop(oop* p);
183 inline void do_oop(narrowOop* p);
184 };
185
186 //
187 // ========= Update References
188 //
189
190 template <ShenandoahGenerationType GENERATION>
191 class ShenandoahMarkUpdateRefsClosure : public ShenandoahMarkRefsSuperClosure {
192 private:
193 template <class T>
194 inline void work(T* p);
195
196 public:
197 ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q, ShenandoahReferenceProcessor* rp, ShenandoahObjToScanQueue* old_q);
198
199 virtual void do_oop(narrowOop* p) { work(p); }
200 virtual void do_oop(oop* p) { work(p); }
201 };
202
203 class ShenandoahUpdateRefsSuperClosure : public ShenandoahSuperClosure {};
204
205 class ShenandoahNonConcUpdateRefsClosure : public ShenandoahUpdateRefsSuperClosure {
221 virtual void do_oop(narrowOop* p) { work(p); }
222 virtual void do_oop(oop* p) { work(p); }
223 };
224
225
226 class ShenandoahFlushSATB : public ThreadClosure {
227 private:
228 SATBMarkQueueSet& _satb_qset;
229
230 public:
231 explicit ShenandoahFlushSATB(SATBMarkQueueSet& satb_qset) : _satb_qset(satb_qset) {}
232
233 inline void do_thread(Thread* thread) override;
234 };
235
236
237 //
238 // ========= Utilities
239 //
240
241 class ShenandoahNoOpClosure : public OopClosure {
242 public:
243 inline void do_oop(oop* p) { }
244 inline void do_oop(narrowOop* p) { }
245 };
246
247 #ifdef ASSERT
248 class ShenandoahAssertNotForwardedClosure : public OopClosure {
249 private:
250 template <class T>
251 inline void do_oop_work(T* p);
252
253 public:
254 inline void do_oop(narrowOop* p);
255 inline void do_oop(oop* p);
256 };
257 #endif // ASSERT
258
259 class ShenandoahMultiThreadClosure : public ThreadClosure {
260 ThreadClosure& _cl1;
261 ThreadClosure& _cl2;
262 public:
263 ShenandoahMultiThreadClosure(ThreadClosure& cl1, ThreadClosure& cl2) :
264 _cl1(cl1), _cl2(cl2) {}
265 inline void do_thread(Thread* thread) override {
266 _cl1.do_thread(thread);
|