< prev index next >
src/hotspot/share/code/nmethod.cpp
Print this page
rev 54838 : [mq]: 8221734-v2
rev 54839 : [mq]: 8221734-v3
*** 1119,1129 ****
// If _method is already NULL the Method* is about to be unloaded,
// so we don't have to break the cycle. Note that it is possible to
// have the Method* live here, in case we unload the nmethod because
// it is pointing to some oop (other than the Method*) being unloaded.
! Method::unlink_code(_method, this); // Break a cycle
// Make the class unloaded - i.e., change state and notify sweeper
assert(SafepointSynchronize::is_at_safepoint() || Thread::current()->is_ConcurrentGC_thread(),
"must be at safepoint");
--- 1119,1131 ----
// If _method is already NULL the Method* is about to be unloaded,
// so we don't have to break the cycle. Note that it is possible to
// have the Method* live here, in case we unload the nmethod because
// it is pointing to some oop (other than the Method*) being unloaded.
! if (_method != NULL) {
! _method->unlink_code(this);
! }
// Make the class unloaded - i.e., change state and notify sweeper
assert(SafepointSynchronize::is_at_safepoint() || Thread::current()->is_ConcurrentGC_thread(),
"must be at safepoint");
*** 1202,1218 ****
print_on(tty, state_msg);
}
}
void nmethod::unlink_from_method() {
! // We need to check if both the _code and _from_compiled_code_entry_point
! // refer to this nmethod because there is a race in setting these two fields
! // in Method* as seen in bugid 4947125.
! // If the vep() points to the zombie nmethod, the memory for the nmethod
! // could be flushed and the compiler and vtable stubs could still call
! // through it.
! Method::unlink_code(method(), this);
}
/**
* Common functionality for both make_not_entrant and make_zombie
*/
--- 1204,1216 ----
print_on(tty, state_msg);
}
}
void nmethod::unlink_from_method() {
! if (method() != NULL) {
! method()->unlink_code();
! }
}
/**
* Common functionality for both make_not_entrant and make_zombie
*/
< prev index next >