8219687: G1 asserts nmethod should not be unloaded during parallel code cache unloading

Reviewed-by: tschatzl, kvn
This commit is contained in:
Erik Österlund 2019-07-02 11:33:01 +02:00
parent 1dd6e7a3eb
commit ec5bfaba53
4 changed files with 5 additions and 6 deletions

View File

@ -1774,10 +1774,9 @@ void nmethod::do_unloading(bool unloading_occurred) {
}
}
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()) {

View File

@ -473,7 +473,7 @@ public:
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();

View File

@ -64,7 +64,7 @@ public:
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;

View File

@ -170,7 +170,7 @@ void ShenandoahCodeRoots::remove_nmethod(nmethod* nm) {
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);