< prev index next >

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

Print this page
*** 27,10 ***
--- 27,11 ---
  #include "code/nmethod.hpp"
  #include "gc/shared/classUnloadingContext.hpp"
  #include "gc/shenandoah/shenandoahClosures.inline.hpp"
  #include "gc/shenandoah/shenandoahHeap.inline.hpp"
  #include "gc/shenandoah/shenandoahNMethod.inline.hpp"
+ #include "gc/shenandoah/shenandoahStackWatermark.hpp"
  #include "gc/shenandoah/shenandoahUtils.hpp"
  #include "memory/resourceArea.hpp"
  #include "memory/universe.hpp"
  #include "runtime/atomicAccess.hpp"
  #include "utilities/powerOfTwo.hpp"

*** 53,40 ***
    _nmethod_table->unregister_nmethod(nm);
  }
  
  void ShenandoahCodeRoots::arm_nmethods() {
    BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
- }
- 
- class ShenandoahDisarmNMethodClosure : public NMethodClosure {
- public:
-   virtual void do_nmethod(nmethod* nm) {
-     ShenandoahNMethod::disarm_nmethod(nm);
-   }
- };
- 
- class ShenandoahDisarmNMethodsTask : public WorkerTask {
- private:
-   ShenandoahDisarmNMethodClosure      _cl;
-   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;
--- 54,15 ---
    _nmethod_table->unregister_nmethod(nm);
  }
  
  void ShenandoahCodeRoots::arm_nmethods() {
    BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
  
!   // nmethod entry barriers are used to update nmethods. In order to guarantee
!   // that nmethod execution is not interleaved with nmethod entry barrier fixups,
!   // we need to also activate stack watermark machinery.
+   ShenandoahStackWatermark::change_epoch_id();
  }
  
  class ShenandoahNMethodUnlinkClosure : public NMethodClosure {
  private:
    bool                      _unloading_occurred;
< prev index next >