提交 f1c7596a 编写于 作者: N never

6974176: ShouldNotReachHere, instanceKlass.cpp:1426

Reviewed-by: kvn, twisti
上级 0519458f
...@@ -433,6 +433,10 @@ void nmethod::init_defaults() { ...@@ -433,6 +433,10 @@ void nmethod::init_defaults() {
_unload_reported = false; // jvmti state _unload_reported = false; // jvmti state
NOT_PRODUCT(_has_debug_info = false); NOT_PRODUCT(_has_debug_info = false);
#ifdef ASSERT
_oops_are_stale = false;
#endif
_oops_do_mark_link = NULL; _oops_do_mark_link = NULL;
_jmethod_id = NULL; _jmethod_id = NULL;
_osr_link = NULL; _osr_link = NULL;
...@@ -1230,11 +1234,10 @@ void nmethod::log_state_change() const { ...@@ -1230,11 +1234,10 @@ void nmethod::log_state_change() const {
bool nmethod::make_not_entrant_or_zombie(unsigned int state) { bool nmethod::make_not_entrant_or_zombie(unsigned int state) {
assert(state == zombie || state == not_entrant, "must be zombie or not_entrant"); assert(state == zombie || state == not_entrant, "must be zombie or not_entrant");
bool was_alive = false;
// Make sure neither the nmethod nor the method is flushed in case of a safepoint in code below. // Make sure neither the nmethod nor the method is flushed in case of a safepoint in code below.
nmethodLocker nml(this); nmethodLocker nml(this);
methodHandle the_method(method()); methodHandle the_method(method());
No_Safepoint_Verifier nsv;
{ {
// If the method is already zombie there is nothing to do // If the method is already zombie there is nothing to do
...@@ -1303,13 +1306,27 @@ bool nmethod::make_not_entrant_or_zombie(unsigned int state) { ...@@ -1303,13 +1306,27 @@ bool nmethod::make_not_entrant_or_zombie(unsigned int state) {
// state will be flushed later when the transition to zombie // state will be flushed later when the transition to zombie
// happens or they get unloaded. // happens or they get unloaded.
if (state == zombie) { if (state == zombie) {
// zombie only - if a JVMTI agent has enabled the CompiledMethodUnload event {
// and it hasn't already been reported for this nmethod then report it now. // Flushing dependecies must be done before any possible
// (the event may have been reported earilier if the GC marked it for unloading). // safepoint can sneak in, otherwise the oops used by the
post_compiled_method_unload(); // dependency logic could have become stale.
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
flush_dependencies(NULL);
}
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); {
flush_dependencies(NULL); // zombie only - if a JVMTI agent has enabled the CompiledMethodUnload event
// and it hasn't already been reported for this nmethod then report it now.
// (the event may have been reported earilier if the GC marked it for unloading).
Pause_No_Safepoint_Verifier pnsv(&nsv);
post_compiled_method_unload();
}
#ifdef ASSERT
// It's no longer safe to access the oops section since zombie
// nmethods aren't scanned for GC.
_oops_are_stale = true;
#endif
} else { } else {
assert(state == not_entrant, "other cases may need to be handled differently"); assert(state == not_entrant, "other cases may need to be handled differently");
} }
......
...@@ -177,6 +177,10 @@ class nmethod : public CodeBlob { ...@@ -177,6 +177,10 @@ class nmethod : public CodeBlob {
// Protected by Patching_lock // Protected by Patching_lock
unsigned char _state; // {alive, not_entrant, zombie, unloaded) unsigned char _state; // {alive, not_entrant, zombie, unloaded)
#ifdef ASSERT
bool _oops_are_stale; // indicates that it's no longer safe to access oops section
#endif
enum { alive = 0, enum { alive = 0,
not_entrant = 1, // uncommon trap has happened but activations may still exist not_entrant = 1, // uncommon trap has happened but activations may still exist
zombie = 2, zombie = 2,
...@@ -434,6 +438,7 @@ class nmethod : public CodeBlob { ...@@ -434,6 +438,7 @@ class nmethod : public CodeBlob {
oop* oop_addr_at(int index) const { // for GC oop* oop_addr_at(int index) const { // for GC
// relocation indexes are biased by 1 (because 0 is reserved) // relocation indexes are biased by 1 (because 0 is reserved)
assert(index > 0 && index <= oops_size(), "must be a valid non-zero index"); assert(index > 0 && index <= oops_size(), "must be a valid non-zero index");
assert(!_oops_are_stale, "oops are stale");
return &oops_begin()[index - 1]; return &oops_begin()[index - 1];
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册