8219687: G1 asserts nmethod should not be unloaded during parallel code cache unloading
Reviewed-by: tschatzl, kvn
--- a/src/hotspot/share/code/nmethod.cpp Tue Jul 02 09:14:51 2019 +0200
+++ b/src/hotspot/share/code/nmethod.cpp Tue Jul 02 11:33:01 2019 +0200
@@ -1774,10 +1774,9 @@
}
}
-void nmethod::oops_do(OopClosure* f, bool allow_zombie) {
+void nmethod::oops_do(OopClosure* f, bool allow_dead) {
// make sure the oops ready to receive visitors
- assert(allow_zombie || !is_zombie(), "should not call follow on zombie nmethod");
- assert(!is_unloaded(), "should not call follow on unloaded nmethod");
+ assert(allow_dead || is_alive(), "should not call follow on dead nmethod");
// Prevent extra code cache walk for platforms that don't have immediate oops.
if (relocInfo::mustIterateImmediateOopsInCode()) {
--- a/src/hotspot/share/code/nmethod.hpp Tue Jul 02 09:14:51 2019 +0200
+++ b/src/hotspot/share/code/nmethod.hpp Tue Jul 02 11:33:01 2019 +0200
@@ -473,7 +473,7 @@
public:
void oops_do(OopClosure* f) { oops_do(f, false); }
- void oops_do(OopClosure* f, bool allow_zombie);
+ void oops_do(OopClosure* f, bool allow_dead);
bool test_set_oops_do_mark();
static void oops_do_marking_prologue();
--- a/src/hotspot/share/gc/shared/gcBehaviours.cpp Tue Jul 02 09:14:51 2019 +0200
+++ b/src/hotspot/share/gc/shared/gcBehaviours.cpp Tue Jul 02 11:33:01 2019 +0200
@@ -64,7 +64,7 @@
bool ClosureIsUnloadingBehaviour::is_unloading(CompiledMethod* cm) const {
if (cm->is_nmethod()) {
IsCompiledMethodUnloadingOopClosure cl(_cl);
- static_cast<nmethod*>(cm)->oops_do(&cl);
+ static_cast<nmethod*>(cm)->oops_do(&cl, true /* allow_dead */);
return cl.is_unloading();
} else {
return false;
--- a/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp Tue Jul 02 09:14:51 2019 +0200
+++ b/src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp Tue Jul 02 11:33:01 2019 +0200
@@ -170,7 +170,7 @@
ShenandoahLocker locker(CodeCache_lock->owned_by_self() ? NULL : &_recorded_nms_lock);
ShenandoahNMethodOopDetector detector;
- nm->oops_do(&detector, /* allow_zombie = */ true);
+ nm->oops_do(&detector, /* allow_dead = */ true);
if (detector.has_oops()) {
int idx = _recorded_nms->find(nm, ShenandoahNMethod::find_with_nmethod);