src/hotspot/share/code/nmethod.cpp
changeset 54355 f226ab0b7f21
parent 54311 3fedbfdb25b6
child 54623 1126f0607c70
equal deleted inserted replaced
54354:80830caaac6e 54355:f226ab0b7f21
  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(); ) {