< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp

Print this page
rev 57745 : 8240872: Shenandoah: Avoid updating new regions from start of evacuation
Reviewed-by: shade
rev 57746 : 8240873: Shenandoah: Short-cut arraycopy barriers
Reviewed-by: shade


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);


< prev index next >