247 }
248
249 void ShenandoahAllCodeRootsIterator::possibly_parallel_blobs_do(CodeBlobClosure *f) {
250 ShenandoahCodeRootsIterator::dispatch_parallel_blobs_do<false>(f);
251 }
252
253 void ShenandoahCsetCodeRootsIterator::possibly_parallel_blobs_do(CodeBlobClosure *f) {
254 ShenandoahCodeRootsIterator::dispatch_parallel_blobs_do<true>(f);
255 }
256
257 template <bool CSET_FILTER>
258 void ShenandoahCodeRootsIterator::fast_parallel_blobs_do(CodeBlobClosure *f) {
259 assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint");
260
261 size_t stride = 256; // educated guess
262
263 GrowableArray<ShenandoahNMethod*>* list = ShenandoahCodeRoots::_recorded_nms;
264
265 size_t max = (size_t)list->length();
266 while (_claimed < max) {
267 size_t cur = Atomic::add(stride, &_claimed) - stride;
268 size_t start = cur;
269 size_t end = MIN2(cur + stride, max);
270 if (start >= max) break;
271
272 for (size_t idx = start; idx < end; idx++) {
273 ShenandoahNMethod* nmr = list->at((int) idx);
274 nmr->assert_alive_and_correct();
275
276 if (CSET_FILTER && !nmr->has_cset_oops(_heap)) {
277 continue;
278 }
279
280 f->do_code_blob(nmr->nm());
281 }
282 }
283 }
284
285 ShenandoahNMethod::ShenandoahNMethod(nmethod* nm, GrowableArray<oop*>* oops) {
286 _nm = nm;
287 _oops = NEW_C_HEAP_ARRAY(oop*, oops->length(), mtGC);
|
247 }
248
249 void ShenandoahAllCodeRootsIterator::possibly_parallel_blobs_do(CodeBlobClosure *f) {
250 ShenandoahCodeRootsIterator::dispatch_parallel_blobs_do<false>(f);
251 }
252
253 void ShenandoahCsetCodeRootsIterator::possibly_parallel_blobs_do(CodeBlobClosure *f) {
254 ShenandoahCodeRootsIterator::dispatch_parallel_blobs_do<true>(f);
255 }
256
257 template <bool CSET_FILTER>
258 void ShenandoahCodeRootsIterator::fast_parallel_blobs_do(CodeBlobClosure *f) {
259 assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint");
260
261 size_t stride = 256; // educated guess
262
263 GrowableArray<ShenandoahNMethod*>* list = ShenandoahCodeRoots::_recorded_nms;
264
265 size_t max = (size_t)list->length();
266 while (_claimed < max) {
267 size_t cur = Atomic::add(&_claimed, stride) - stride;
268 size_t start = cur;
269 size_t end = MIN2(cur + stride, max);
270 if (start >= max) break;
271
272 for (size_t idx = start; idx < end; idx++) {
273 ShenandoahNMethod* nmr = list->at((int) idx);
274 nmr->assert_alive_and_correct();
275
276 if (CSET_FILTER && !nmr->has_cset_oops(_heap)) {
277 continue;
278 }
279
280 f->do_code_blob(nmr->nm());
281 }
282 }
283 }
284
285 ShenandoahNMethod::ShenandoahNMethod(nmethod* nm, GrowableArray<oop*>* oops) {
286 _nm = nm;
287 _oops = NEW_C_HEAP_ARRAY(oop*, oops->length(), mtGC);
|