hotspot/src/share/vm/memory/universe.cpp
changeset 10265 4c869854aebd
parent 9995 290620c08233
child 10503 04b74421bdea
equal deleted inserted replaced
10264:6879f93d268d 10265:4c869854aebd
  1175 
  1175 
  1176   // CodeCache can only be updated by a thread_in_VM and they will all be
  1176   // CodeCache can only be updated by a thread_in_VM and they will all be
  1177   // stopped dring the safepoint so CodeCache will be safe to update without
  1177   // stopped dring the safepoint so CodeCache will be safe to update without
  1178   // holding the CodeCache_lock.
  1178   // holding the CodeCache_lock.
  1179 
  1179 
  1180   DepChange changes(dependee);
  1180   KlassDepChange changes(dependee);
  1181 
  1181 
  1182   // Compute the dependent nmethods
  1182   // Compute the dependent nmethods
  1183   if (CodeCache::mark_for_deoptimization(changes) > 0) {
  1183   if (CodeCache::mark_for_deoptimization(changes) > 0) {
       
  1184     // At least one nmethod has been marked for deoptimization
       
  1185     VM_Deoptimize op;
       
  1186     VMThread::execute(&op);
       
  1187   }
       
  1188 }
       
  1189 
       
  1190 // Flushes compiled methods dependent on a particular CallSite
       
  1191 // instance when its target is different than the given MethodHandle.
       
  1192 void Universe::flush_dependents_on(Handle call_site, Handle method_handle) {
       
  1193   assert_lock_strong(Compile_lock);
       
  1194 
       
  1195   if (CodeCache::number_of_nmethods_with_dependencies() == 0) return;
       
  1196 
       
  1197   // CodeCache can only be updated by a thread_in_VM and they will all be
       
  1198   // stopped dring the safepoint so CodeCache will be safe to update without
       
  1199   // holding the CodeCache_lock.
       
  1200 
       
  1201   CallSiteDepChange changes(call_site(), method_handle());
       
  1202 
       
  1203   // Compute the dependent nmethods that have a reference to a
       
  1204   // CallSite object.  We use instanceKlass::mark_dependent_nmethod
       
  1205   // directly instead of CodeCache::mark_for_deoptimization because we
       
  1206   // want dependents on the class CallSite only not all classes in the
       
  1207   // ContextStream.
       
  1208   int marked = 0;
       
  1209   {
       
  1210     MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
       
  1211     instanceKlass* call_site_klass = instanceKlass::cast(SystemDictionary::CallSite_klass());
       
  1212     marked = call_site_klass->mark_dependent_nmethods(changes);
       
  1213   }
       
  1214   if (marked > 0) {
  1184     // At least one nmethod has been marked for deoptimization
  1215     // At least one nmethod has been marked for deoptimization
  1185     VM_Deoptimize op;
  1216     VM_Deoptimize op;
  1186     VMThread::execute(&op);
  1217     VMThread::execute(&op);
  1187   }
  1218   }
  1188 }
  1219 }