< prev index next >

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

Print this page
*** 48,10 ***
--- 48,13 ---
    // When a nmethod is about to be executed, we need to make sure that all its
    // metadata are marked. The alternative is to remark thread roots at final mark
    // pause, which would cause latency issues.
    if (ShenandoahHeap::heap()->unload_classes()) return true;
  
+   // First pause: need to enable GC barriers for GC cycle.
+   if (ShenandoahGCStateCheckHotpatch) return true;
+ 
    // Otherwise, we can go without nmethod barriers.
    return false;
  }
  
  void ShenandoahCodeRoots::initialize() {

*** 66,18 ***
  void ShenandoahCodeRoots::unregister_nmethod(nmethod* nm) {
    assert_locked_or_safepoint(CodeCache_lock);
    _nmethod_table->unregister_nmethod(nm);
  }
  
  void ShenandoahCodeRoots::arm_nmethods_for_mark() {
    if (use_nmethod_barriers_for_mark()) {
!     BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
    }
  }
  
  void ShenandoahCodeRoots::arm_nmethods_for_evac() {
!   BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
  }
  
  class ShenandoahDisarmNMethodClosure : public NMethodClosure {
  private:
    BarrierSetNMethod* const _bs;
--- 69,35 ---
  void ShenandoahCodeRoots::unregister_nmethod(nmethod* nm) {
    assert_locked_or_safepoint(CodeCache_lock);
    _nmethod_table->unregister_nmethod(nm);
  }
  
+ void ShenandoahCodeRoots::arm_nmethods() {
+   if (ShenandoahGCStateCheckHotpatch) {
+     char gc_state = ShenandoahHeap::heap()->gc_state();
+     log_info(gc)("Arming nmethods with GC state: %d [%s%s%s%s%s%s%s]",
+          gc_state,
+          ((gc_state & ShenandoahHeap::HAS_FORWARDED) > 0) ? "HAS_FORWARDED "  : "",
+          ((gc_state & ShenandoahHeap::MARKING) > 0)       ? "MARKING "        : "",
+          ((gc_state & ShenandoahHeap::EVACUATION) > 0)    ? "EVACUATION "     : "",
+          ((gc_state & ShenandoahHeap::UPDATE_REFS) > 0)   ? "UPDATE_REFS "    : "",
+          ((gc_state & ShenandoahHeap::WEAK_ROOTS) > 0)    ? "WEAK_ROOTS "     : "",
+          ((gc_state & ShenandoahHeap::YOUNG_MARKING) > 0) ? "YOUNG_MARKING "  : "",
+          ((gc_state & ShenandoahHeap::OLD_MARKING) > 0)   ? "OLD_MARKING "    : ""
+     );
+   }
+   BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
+ }
+ 
  void ShenandoahCodeRoots::arm_nmethods_for_mark() {
    if (use_nmethod_barriers_for_mark()) {
!     arm_nmethods();
    }
  }
  
  void ShenandoahCodeRoots::arm_nmethods_for_evac() {
!   arm_nmethods();
  }
  
  class ShenandoahDisarmNMethodClosure : public NMethodClosure {
  private:
    BarrierSetNMethod* const _bs;
< prev index next >