< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahNMethod.inline.hpp
Print this page
rev 59304 : 8245124: Shenandoah: optimize code root evacuation/update during concurrent class unloading
@@ -52,10 +52,33 @@
bool ShenandoahNMethod::is_unregistered() const {
return _unregistered;
}
+void ShenandoahNMethod::oops_do(OopClosure* oops, bool fix_relocations) {
+ for (int c = 0; c < _oops_count; c ++) {
+ oops->do_oop(_oops[c]);
+ }
+
+ oop* const begin = _nm->oops_begin();
+ oop* const end = _nm->oops_end();
+ for (oop* p = begin; p < end; p++) {
+ if (*p != Universe::non_oop_word()) {
+ oops->do_oop(p);
+ }
+ }
+
+ if (fix_relocations && _has_non_immed_oops) {
+ _nm->fix_oop_relocations();
+ }
+}
+
+void ShenandoahNMethod::heal_nmethod_metadata(ShenandoahNMethod* nmethod_data) {
+ ShenandoahEvacuateUpdateRootsClosure<> cl;
+ nmethod_data->oops_do(&cl, true /*fix relocation*/);
+}
+
void ShenandoahNMethod::disarm_nmethod(nmethod* nm) {
if (!ShenandoahConcurrentRoots::can_do_concurrent_class_unloading()) {
return;
}
< prev index next >