< prev index next >

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

Print this page
@@ -720,12 +720,11 @@
  
    // 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();

@@ -762,11 +761,13 @@
      _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);

@@ -780,11 +781,11 @@
        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);

@@ -1026,11 +1027,11 @@
      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:

@@ -1215,10 +1216,16 @@
    }
  
    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();
    }
  }

@@ -1272,10 +1279,15 @@
        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 >