2277 if (_concurrent) {
2278 ShenandoahConcurrentWorkerSession worker_session(worker_id);
2279 ShenandoahSuspendibleThreadSetJoiner stsj(ShenandoahSuspendibleWorkers);
2280 do_work();
2281 } else {
2282 ShenandoahParallelWorkerSession worker_session(worker_id);
2283 do_work();
2284 }
2285 }
2286
2287 private:
2288 void do_work() {
2289 ShenandoahHeapRegion* r = _regions->next();
2290 ShenandoahMarkingContext* const ctx = _heap->complete_marking_context();
2291 while (r != NULL) {
2292 HeapWord* update_watermark = r->get_update_watermark();
2293 assert (update_watermark >= r->bottom(), "sanity");
2294 if (r->is_active() && !r->is_cset()) {
2295 _heap->marked_object_oop_iterate(r, &cl, update_watermark);
2296 }
2297 if (ShenandoahPacing) {
2298 _heap->pacer()->report_updaterefs(pointer_delta(update_watermark, r->bottom()));
2299 }
2300 if (_heap->check_cancelled_gc_and_yield(_concurrent)) {
2301 return;
2302 }
2303 r = _regions->next();
2304 }
2305 }
2306 };
2307
2308 void ShenandoahHeap::update_heap_references(bool concurrent) {
2309 ShenandoahUpdateHeapRefsTask<ShenandoahUpdateHeapRefsClosure> task(&_update_refs_iterator, concurrent);
2310 workers()->run_task(&task);
2311 }
2312
2313 void ShenandoahHeap::op_init_updaterefs() {
2314 assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "must be at safepoint");
2315
2316 set_evacuation_in_progress(false);
|
2277 if (_concurrent) {
2278 ShenandoahConcurrentWorkerSession worker_session(worker_id);
2279 ShenandoahSuspendibleThreadSetJoiner stsj(ShenandoahSuspendibleWorkers);
2280 do_work();
2281 } else {
2282 ShenandoahParallelWorkerSession worker_session(worker_id);
2283 do_work();
2284 }
2285 }
2286
2287 private:
2288 void do_work() {
2289 ShenandoahHeapRegion* r = _regions->next();
2290 ShenandoahMarkingContext* const ctx = _heap->complete_marking_context();
2291 while (r != NULL) {
2292 HeapWord* update_watermark = r->get_update_watermark();
2293 assert (update_watermark >= r->bottom(), "sanity");
2294 if (r->is_active() && !r->is_cset()) {
2295 _heap->marked_object_oop_iterate(r, &cl, update_watermark);
2296 }
2297 r->set_update_watermark(r->bottom());
2298 if (ShenandoahPacing) {
2299 _heap->pacer()->report_updaterefs(pointer_delta(update_watermark, r->bottom()));
2300 }
2301 if (_heap->check_cancelled_gc_and_yield(_concurrent)) {
2302 return;
2303 }
2304 r = _regions->next();
2305 }
2306 }
2307 };
2308
2309 void ShenandoahHeap::update_heap_references(bool concurrent) {
2310 ShenandoahUpdateHeapRefsTask<ShenandoahUpdateHeapRefsClosure> task(&_update_refs_iterator, concurrent);
2311 workers()->run_task(&task);
2312 }
2313
2314 void ShenandoahHeap::op_init_updaterefs() {
2315 assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "must be at safepoint");
2316
2317 set_evacuation_in_progress(false);
|