< prev index next >

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

Print this page
*** 31,10 ***
--- 31,11 ---
  #include "gc/shenandoah/shenandoahNMethod.inline.hpp"
  #include "gc/shenandoah/shenandoahUtils.hpp"
  #include "memory/resourceArea.hpp"
  #include "memory/universe.hpp"
  #include "runtime/atomicAccess.hpp"
+ #include "utilities/events.hpp"
  #include "utilities/powerOfTwo.hpp"
  
  
  ShenandoahNMethodTable* ShenandoahCodeRoots::_nmethod_table;
  int ShenandoahCodeRoots::_disarmed_value = 1;

*** 52,10 ***
--- 53,31 ---
    assert_locked_or_safepoint(CodeCache_lock);
    _nmethod_table->unregister_nmethod(nm);
  }
  
  void ShenandoahCodeRoots::arm_nmethods() {
+   char gc_state = ShenandoahHeap::heap()->gc_state();
+   Events::log(Thread::current(), "Arming nmethods, 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 "    : ""
+   );
+   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();
  }
  
  class ShenandoahDisarmNMethodClosure : public NMethodClosure {
  public:

*** 70,25 ***
    ShenandoahConcurrentNMethodIterator _iterator;
  
  public:
    ShenandoahDisarmNMethodsTask() :
      WorkerTask("Shenandoah Disarm NMethods"),
!     _iterator(ShenandoahCodeRoots::table()) {
-     assert(SafepointSynchronize::is_at_safepoint(), "Only at a safepoint");
-   }
  
    virtual void work(uint worker_id) {
-     ShenandoahParallelWorkerSession worker_session(worker_id);
      _iterator.nmethods_do(&_cl);
    }
  };
  
  void ShenandoahCodeRoots::disarm_nmethods() {
    ShenandoahDisarmNMethodsTask task;
    ShenandoahHeap::heap()->workers()->run_task(&task);
  }
  
  class ShenandoahNMethodUnlinkClosure : public NMethodClosure {
  private:
    bool                      _unloading_occurred;
    ShenandoahHeap* const     _heap;
    BarrierSetNMethod* const  _bs;
--- 92,54 ---
    ShenandoahConcurrentNMethodIterator _iterator;
  
  public:
    ShenandoahDisarmNMethodsTask() :
      WorkerTask("Shenandoah Disarm NMethods"),
!     _iterator(ShenandoahCodeRoots::table()) {}
  
    virtual void work(uint worker_id) {
      _iterator.nmethods_do(&_cl);
    }
  };
  
  void ShenandoahCodeRoots::disarm_nmethods() {
    ShenandoahDisarmNMethodsTask task;
    ShenandoahHeap::heap()->workers()->run_task(&task);
  }
  
+ #ifdef ASSERT
+ class ShenandoahCheckNMethodClosure : public NMethodClosure {
+   bool const _armed;
+ public:
+   ShenandoahCheckNMethodClosure(int armed) : _armed(armed) {}
+   virtual void do_nmethod(nmethod* nm) {
+     ShenandoahNMethod::assert_barriers(nm, _armed);
+   }
+ };
+ 
+ class ShenandoahCheckNMethodsTask : public WorkerTask {
+ private:
+   ShenandoahCheckNMethodClosure      _cl;
+   ShenandoahConcurrentNMethodIterator _iterator;
+ 
+ public:
+   ShenandoahCheckNMethodsTask() :
+     WorkerTask("Shenandoah Check NMethods"),
+     _cl(!ShenandoahHeap::heap()->is_idle()),
+     _iterator(ShenandoahCodeRoots::table()) {}
+ 
+   virtual void work(uint worker_id) {
+     _iterator.nmethods_do(&_cl);
+   }
+ };
+ 
+ void ShenandoahCodeRoots::check_barriers() {
+   ShenandoahCheckNMethodsTask task;
+   ShenandoahHeap::heap()->workers()->run_task(&task);
+ }
+ #endif
+ 
  class ShenandoahNMethodUnlinkClosure : public NMethodClosure {
  private:
    bool                      _unloading_occurred;
    ShenandoahHeap* const     _heap;
    BarrierSetNMethod* const  _bs;
< prev index next >