< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
Print this page
rev 58162 : 8239926: Shenandoah: Shenandoah needs to mark nmethod's metadata
@@ -169,10 +169,52 @@
for (JavaThread *thr = jtiwh.next(); thr != NULL; thr = jtiwh.next()) {
ShenandoahThreadLocalData::set_disarmed_value(thr, _disarmed_value);
}
}
+class ShenandoahDisarmNMethodClosure : public NMethodClosure {
+private:
+ BarrierSetNMethod* const _bs;
+
+public:
+ ShenandoahDisarmNMethodClosure() :
+ _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
+ }
+
+ virtual void do_nmethod(nmethod* nm) {
+ _bs->disarm(nm);
+ }
+};
+
+class ShenandoahDisarmNMethodsTask : public AbstractGangTask {
+private:
+ ShenandoahDisarmNMethodClosure _cl;
+ ShenandoahConcurrentNMethodIterator _iterator;
+
+public:
+ ShenandoahDisarmNMethodsTask() :
+ AbstractGangTask("ShenandoahDisarmNMethodsTask"),
+ _iterator(ShenandoahCodeRoots::table()) {
+ MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
+ _iterator.nmethods_do_begin();
+ }
+
+ ~ShenandoahDisarmNMethodsTask() {
+ MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
+ _iterator.nmethods_do_end();
+ }
+
+ virtual void work(uint 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;
volatile bool _failed;
ShenandoahHeap* _heap;
< prev index next >