1104 // Unregister must be done before the state change |
1104 // Unregister must be done before the state change |
1105 { |
1105 { |
1106 MutexLockerEx ml(SafepointSynchronize::is_at_safepoint() ? NULL : CodeCache_lock, |
1106 MutexLockerEx ml(SafepointSynchronize::is_at_safepoint() ? NULL : CodeCache_lock, |
1107 Mutex::_no_safepoint_check_flag); |
1107 Mutex::_no_safepoint_check_flag); |
1108 Universe::heap()->unregister_nmethod(this); |
1108 Universe::heap()->unregister_nmethod(this); |
|
1109 CodeCache::unregister_old_nmethod(this); |
1109 } |
1110 } |
1110 |
1111 |
1111 // Clear the method of this dead nmethod |
1112 // Clear the method of this dead nmethod |
1112 set_method(NULL); |
1113 set_method(NULL); |
1113 |
1114 |
1289 // safepoint can sneak in, otherwise the oops used by the |
1290 // safepoint can sneak in, otherwise the oops used by the |
1290 // dependency logic could have become stale. |
1291 // dependency logic could have become stale. |
1291 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); |
1292 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); |
1292 if (nmethod_needs_unregister) { |
1293 if (nmethod_needs_unregister) { |
1293 Universe::heap()->unregister_nmethod(this); |
1294 Universe::heap()->unregister_nmethod(this); |
|
1295 CodeCache::unregister_old_nmethod(this); |
1294 } |
1296 } |
1295 flush_dependencies(/*delete_immediately*/true); |
1297 flush_dependencies(/*delete_immediately*/true); |
1296 } |
1298 } |
1297 |
1299 |
1298 // Clear ICStubs to prevent back patching stubs of zombie or flushed |
1300 // Clear ICStubs to prevent back patching stubs of zombie or flushed |
1984 found_check = true; |
1986 found_check = true; |
1985 NOT_DEBUG(break); |
1987 NOT_DEBUG(break); |
1986 } |
1988 } |
1987 } |
1989 } |
1988 return found_check; |
1990 return found_check; |
1989 } |
|
1990 |
|
1991 bool nmethod::is_evol_dependent() { |
|
1992 for (Dependencies::DepStream deps(this); deps.next(); ) { |
|
1993 if (deps.type() == Dependencies::evol_method) { |
|
1994 Method* method = deps.method_argument(0); |
|
1995 if (method->is_old()) { |
|
1996 if (log_is_enabled(Debug, redefine, class, nmethod)) { |
|
1997 ResourceMark rm; |
|
1998 log_debug(redefine, class, nmethod) |
|
1999 ("Found evol dependency of nmethod %s.%s(%s) compile_id=%d on method %s.%s(%s)", |
|
2000 _method->method_holder()->external_name(), |
|
2001 _method->name()->as_C_string(), |
|
2002 _method->signature()->as_C_string(), |
|
2003 compile_id(), |
|
2004 method->method_holder()->external_name(), |
|
2005 method->name()->as_C_string(), |
|
2006 method->signature()->as_C_string()); |
|
2007 } |
|
2008 if (TraceDependencies || LogCompilation) |
|
2009 deps.log_dependency(method->method_holder()); |
|
2010 return true; |
|
2011 } |
|
2012 } |
|
2013 } |
|
2014 return false; |
|
2015 } |
1991 } |
2016 |
1992 |
2017 // Called from mark_for_deoptimization, when dependee is invalidated. |
1993 // Called from mark_for_deoptimization, when dependee is invalidated. |
2018 bool nmethod::is_dependent_on_method(Method* dependee) { |
1994 bool nmethod::is_dependent_on_method(Method* dependee) { |
2019 for (Dependencies::DepStream deps(this); deps.next(); ) { |
1995 for (Dependencies::DepStream deps(this); deps.next(); ) { |