< 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 +54,15 @@
    _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);
+   // 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 >