< prev index next > src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp
Print this page
// Make above changes visible to worker threads
OrderAccess::fence();
// Arm nmethods for concurrent mark
- ShenandoahCodeRoots::arm_nmethods_for_mark();
-
+ ShenandoahCodeRoots::arm_nmethods();
ShenandoahStackWatermark::change_epoch_id();
{
ShenandoahTimingsTracker timing(ShenandoahPhaseTimings::init_propagate_gc_state);
heap->propagate_gc_state_to_all_threads();
_generation->prepare_regions_and_collection_set(true /*concurrent*/);
// Has to be done after cset selection
heap->prepare_concurrent_roots();
- if (!heap->collection_set()->is_empty()) {
+ // ShenandoahGCStateCheckHotpatch: we need full cycle to patch barriers back to idle.
+ // final-roots is pauseless, so there is no way to arm barriers.
+ if (ShenandoahGCStateCheckHotpatch || !heap->collection_set()->is_empty()) {
LogTarget(Debug, gc, cset) lt;
if (lt.is_enabled()) {
ResourceMark rm;
LogStream ls(lt);
heap->collection_set()->print_on(&ls);
heap->set_evacuation_in_progress(true);
// From here on, we need to update references.
heap->set_has_forwarded_objects(true);
// Arm nmethods/stack for concurrent processing
- ShenandoahCodeRoots::arm_nmethods_for_evac();
+ ShenandoahCodeRoots::arm_nmethods();
ShenandoahStackWatermark::change_epoch_id();
} else {
if (ShenandoahVerify) {
ShenandoahTimingsTracker v(ShenandoahPhaseTimings::final_mark_verify);
ShenandoahNMethodLocker locker(data->lock());
// Setup EvacOOM scope below reentrant lock to avoid deadlock with
// nmethod_entry_barrier
ShenandoahEvacOOMScope oom;
data->oops_do(&_cl, true/*fix relocation*/);
- _bs->disarm(n);
+ ShenandoahNMethod::disarm_nmethod_unlocked(n);
}
};
class ShenandoahConcurrentRootsEvacUpdateTask : public WorkerTask {
private:
}
heap->rebuild_free_set(true /*concurrent*/);
_generation->heuristics()->start_idle_span();
+ if (ShenandoahGCStateCheckHotpatch) {
+ // Final pause: update GC barriers to idle state.
+ ShenandoahCodeRoots::arm_nmethods();
+ ShenandoahStackWatermark::change_epoch_id();
+ }
+
{
ShenandoahTimingsTracker timing(ShenandoahPhaseTimings::final_update_refs_propagate_gc_state);
heap->propagate_gc_state_to_all_threads();
}
}
heap->young_generation()->reset_mark_bitmap<false>();
}
} else {
_generation->reset_mark_bitmap<false>();
}
+
+ // Also go and disable all barriers in all current nmethods.
+ if (ShenandoahGCStateCheckHotpatch) {
+ ShenandoahCodeRoots::disarm_nmethods();
+ }
}
bool ShenandoahConcurrentGC::check_cancellation_and_abort(ShenandoahDegenPoint point) {
if (ShenandoahHeap::heap()->cancelled_gc()) {
_degen_point = point;
< prev index next >