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
|