< prev index next >

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

Print this page

 40 int ShenandoahCodeRoots::_disarmed_value = 1;
 41 
 42 void ShenandoahCodeRoots::initialize() {
 43   _nmethod_table = new ShenandoahNMethodTable();
 44 }
 45 
 46 void ShenandoahCodeRoots::register_nmethod(nmethod* nm) {
 47   assert(CodeCache_lock->owned_by_self(), "Must have CodeCache_lock held");
 48   _nmethod_table->register_nmethod(nm);
 49 }
 50 
 51 void ShenandoahCodeRoots::unregister_nmethod(nmethod* nm) {
 52   assert_locked_or_safepoint(CodeCache_lock);
 53   _nmethod_table->unregister_nmethod(nm);
 54 }
 55 
 56 void ShenandoahCodeRoots::arm_nmethods() {
 57   BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
 58 }
 59 
 60 class ShenandoahDisarmNMethodClosure : public NMethodClosure {
 61 public:
 62   virtual void do_nmethod(nmethod* nm) {
 63     ShenandoahNMethod::disarm_nmethod(nm);
 64   }
 65 };
 66 
 67 class ShenandoahDisarmNMethodsTask : public WorkerTask {
 68 private:
 69   ShenandoahDisarmNMethodClosure      _cl;
 70   ShenandoahConcurrentNMethodIterator _iterator;
 71 
 72 public:
 73   ShenandoahDisarmNMethodsTask() :
 74     WorkerTask("Shenandoah Disarm NMethods"),
 75     _iterator(ShenandoahCodeRoots::table()) {
 76     assert(SafepointSynchronize::is_at_safepoint(), "Only at a safepoint");
 77   }
 78 
 79   virtual void work(uint worker_id) {
 80     ShenandoahParallelWorkerSession worker_session(worker_id);
 81     _iterator.nmethods_do(&_cl);
 82   }
 83 };
 84 
 85 void ShenandoahCodeRoots::disarm_nmethods() {
 86   ShenandoahDisarmNMethodsTask task;
 87   ShenandoahHeap::heap()->workers()->run_task(&task);

 88 }
 89 
 90 class ShenandoahNMethodUnlinkClosure : public NMethodClosure {
 91 private:
 92   bool                      _unloading_occurred;
 93   ShenandoahHeap* const     _heap;
 94   BarrierSetNMethod* const  _bs;
 95 
 96 public:
 97   ShenandoahNMethodUnlinkClosure(bool unloading_occurred) :
 98       _unloading_occurred(unloading_occurred),
 99       _heap(ShenandoahHeap::heap()),
100       _bs(ShenandoahBarrierSet::barrier_set()->barrier_set_nmethod()) {}
101 
102   virtual void do_nmethod(nmethod* nm) {
103     assert(_heap->is_concurrent_weak_root_in_progress(), "Only this phase");
104 
105     ShenandoahNMethod* nm_data = ShenandoahNMethod::gc_data(nm);
106     assert(!nm_data->is_unregistered(), "Should not see unregistered entry");
107 

 40 int ShenandoahCodeRoots::_disarmed_value = 1;
 41 
 42 void ShenandoahCodeRoots::initialize() {
 43   _nmethod_table = new ShenandoahNMethodTable();
 44 }
 45 
 46 void ShenandoahCodeRoots::register_nmethod(nmethod* nm) {
 47   assert(CodeCache_lock->owned_by_self(), "Must have CodeCache_lock held");
 48   _nmethod_table->register_nmethod(nm);
 49 }
 50 
 51 void ShenandoahCodeRoots::unregister_nmethod(nmethod* nm) {
 52   assert_locked_or_safepoint(CodeCache_lock);
 53   _nmethod_table->unregister_nmethod(nm);
 54 }
 55 
 56 void ShenandoahCodeRoots::arm_nmethods() {
 57   BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
 58 }
 59 
 60 class ShenandoahRunNMethodClosure : public NMethodClosure {







 61 private:
 62   BarrierSetNMethod* const  _bs;

 63 
 64 public:
 65   ShenandoahRunNMethodClosure() : _bs(ShenandoahBarrierSet::barrier_set()->barrier_set_nmethod()) {}




 66 
 67   virtual void do_nmethod(nmethod* nm) {
 68     _bs->nmethod_entry_barrier(nm);

 69   }
 70 };
 71 
 72 void ShenandoahCodeRoots::complete_nmethod_entry_barriers() {
 73   ShenandoahRunNMethodClosure nm_cl;
 74   ShenandoahConcurrentNMethodIterator iterator(table());
 75   iterator.nmethods_do(&nm_cl);
 76 }
 77 
 78 class ShenandoahNMethodUnlinkClosure : public NMethodClosure {
 79 private:
 80   bool                      _unloading_occurred;
 81   ShenandoahHeap* const     _heap;
 82   BarrierSetNMethod* const  _bs;
 83 
 84 public:
 85   ShenandoahNMethodUnlinkClosure(bool unloading_occurred) :
 86       _unloading_occurred(unloading_occurred),
 87       _heap(ShenandoahHeap::heap()),
 88       _bs(ShenandoahBarrierSet::barrier_set()->barrier_set_nmethod()) {}
 89 
 90   virtual void do_nmethod(nmethod* nm) {
 91     assert(_heap->is_concurrent_weak_root_in_progress(), "Only this phase");
 92 
 93     ShenandoahNMethod* nm_data = ShenandoahNMethod::gc_data(nm);
 94     assert(!nm_data->is_unregistered(), "Should not see unregistered entry");
 95 
< prev index next >