177
178 public:
179 ShenandoahDisarmNMethodClosure() :
180 _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
181 }
182
183 virtual void do_nmethod(nmethod* nm) {
184 _bs->disarm(nm);
185 }
186 };
187
188 class ShenandoahDisarmNMethodsTask : public AbstractGangTask {
189 private:
190 ShenandoahDisarmNMethodClosure _cl;
191 ShenandoahConcurrentNMethodIterator _iterator;
192
193 public:
194 ShenandoahDisarmNMethodsTask() :
195 AbstractGangTask("ShenandoahDisarmNMethodsTask"),
196 _iterator(ShenandoahCodeRoots::table()) {
197 MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
198 _iterator.nmethods_do_begin();
199 }
200
201 ~ShenandoahDisarmNMethodsTask() {
202 MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
203 _iterator.nmethods_do_end();
204 }
205
206 virtual void work(uint worker_id) {
207 _iterator.nmethods_do(&_cl);
208 }
209 };
210
211 void ShenandoahCodeRoots::disarm_nmethods() {
212 ShenandoahDisarmNMethodsTask task;
213 ShenandoahHeap::heap()->workers()->run_task(&task);
214 }
215
216 class ShenandoahNMethodUnlinkClosure : public NMethodClosure {
217 private:
218 bool _unloading_occurred;
219 volatile bool _failed;
220 ShenandoahHeap* const _heap;
221 BarrierSetNMethod* const _bs;
222
223 void set_failed() {
224 Atomic::store(&_failed, true);
225 }
226
|
177
178 public:
179 ShenandoahDisarmNMethodClosure() :
180 _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
181 }
182
183 virtual void do_nmethod(nmethod* nm) {
184 _bs->disarm(nm);
185 }
186 };
187
188 class ShenandoahDisarmNMethodsTask : public AbstractGangTask {
189 private:
190 ShenandoahDisarmNMethodClosure _cl;
191 ShenandoahConcurrentNMethodIterator _iterator;
192
193 public:
194 ShenandoahDisarmNMethodsTask() :
195 AbstractGangTask("ShenandoahDisarmNMethodsTask"),
196 _iterator(ShenandoahCodeRoots::table()) {
197 assert(SafepointSynchronize::is_at_safepoint(), "Only at a safepoint");
198 MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
199 _iterator.nmethods_do_begin();
200 }
201
202 ~ShenandoahDisarmNMethodsTask() {
203 MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
204 _iterator.nmethods_do_end();
205 }
206
207 virtual void work(uint worker_id) {
208 ShenandoahParallelWorkerSession worker_session(worker_id);
209 _iterator.nmethods_do(&_cl);
210 }
211 };
212
213 void ShenandoahCodeRoots::disarm_nmethods() {
214 ShenandoahDisarmNMethodsTask task;
215 ShenandoahHeap::heap()->workers()->run_task(&task);
216 }
217
218 class ShenandoahNMethodUnlinkClosure : public NMethodClosure {
219 private:
220 bool _unloading_occurred;
221 volatile bool _failed;
222 ShenandoahHeap* const _heap;
223 BarrierSetNMethod* const _bs;
224
225 void set_failed() {
226 Atomic::store(&_failed, true);
227 }
228
|