209 ShenandoahConcurrentStringDedupRoots();
210 ~ShenandoahConcurrentStringDedupRoots();
211
212 void oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id);
213 };
214
215 class ShenandoahCodeCacheRoots {
216 private:
217 ShenandoahPhaseTimings::Phase _phase;
218 ShenandoahCodeRootsIterator _coderoots_iterator;
219 public:
220 ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase);
221 ~ShenandoahCodeCacheRoots();
222
223 void code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id);
224 };
225
226 template <bool CONCURRENT, bool SINGLE_THREADED>
227 class ShenandoahClassLoaderDataRoots {
228 private:
229 ShenandoahPhaseTimings::Phase _phase;
230 public:
231 ShenandoahClassLoaderDataRoots(ShenandoahPhaseTimings::Phase phase);
232 ~ShenandoahClassLoaderDataRoots();
233
234 void always_strong_cld_do(CLDClosure* clds, uint worker_id);
235 void cld_do(CLDClosure* clds, uint worker_id);
236 };
237
238 class ShenandoahRootProcessor : public StackObj {
239 private:
240 ShenandoahHeap* const _heap;
241 const ShenandoahPhaseTimings::Phase _phase;
242 const ShenandoahGCWorkerPhase _worker_phase;
243 public:
244 ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase);
245
246 ShenandoahHeap* heap() const { return _heap; }
247 };
248
249 class ShenandoahRootScanner : public ShenandoahRootProcessor {
250 private:
251 ShenandoahSerialRoots _serial_roots;
|
209 ShenandoahConcurrentStringDedupRoots();
210 ~ShenandoahConcurrentStringDedupRoots();
211
212 void oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, uint worker_id);
213 };
214
215 class ShenandoahCodeCacheRoots {
216 private:
217 ShenandoahPhaseTimings::Phase _phase;
218 ShenandoahCodeRootsIterator _coderoots_iterator;
219 public:
220 ShenandoahCodeCacheRoots(ShenandoahPhaseTimings::Phase phase);
221 ~ShenandoahCodeCacheRoots();
222
223 void code_blobs_do(CodeBlobClosure* blob_cl, uint worker_id);
224 };
225
226 template <bool CONCURRENT, bool SINGLE_THREADED>
227 class ShenandoahClassLoaderDataRoots {
228 private:
229 ShenandoahSharedSemaphore _semaphore;
230 ShenandoahPhaseTimings::Phase _phase;
231
232 static uint worker_count(uint n_workers) {
233 // Limit concurrency a bit, otherwise it wastes resources when workers are tripping
234 // over each other. This also leaves free workers to process other parts of the root
235 // set, while admitted workers are busy with doing the CLDG walk.
236 return MAX2(1u, MIN2(ShenandoahSharedSemaphore::max_tokens(), n_workers / 2));
237 }
238
239 public:
240 ShenandoahClassLoaderDataRoots(ShenandoahPhaseTimings::Phase phase, uint n_workers);
241 ~ShenandoahClassLoaderDataRoots();
242
243 void always_strong_cld_do(CLDClosure* clds, uint worker_id);
244 void cld_do(CLDClosure* clds, uint worker_id);
245 };
246
247 class ShenandoahRootProcessor : public StackObj {
248 private:
249 ShenandoahHeap* const _heap;
250 const ShenandoahPhaseTimings::Phase _phase;
251 const ShenandoahGCWorkerPhase _worker_phase;
252 public:
253 ShenandoahRootProcessor(ShenandoahPhaseTimings::Phase phase);
254
255 ShenandoahHeap* heap() const { return _heap; }
256 };
257
258 class ShenandoahRootScanner : public ShenandoahRootProcessor {
259 private:
260 ShenandoahSerialRoots _serial_roots;
|