< prev index next >

src/hotspot/share/code/codeCache.cpp

Print this page

1344   }
1345 }
1346 
1347 void CodeCache::mark_for_deoptimization(DeoptimizationScope* deopt_scope, Method* dependee) {
1348   MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
1349 
1350   NMethodIterator iter(NMethodIterator::not_unloading);
1351   while(iter.next()) {
1352     nmethod* nm = iter.method();
1353     if (nm->is_dependent_on_method(dependee)) {
1354       deopt_scope->mark(nm);
1355     }
1356   }
1357 }
1358 
1359 void CodeCache::make_marked_nmethods_deoptimized() {
1360   RelaxedNMethodIterator iter(RelaxedNMethodIterator::not_unloading);
1361   while(iter.next()) {
1362     nmethod* nm = iter.method();
1363     if (nm->is_marked_for_deoptimization() && !nm->has_been_deoptimized() && nm->can_be_deoptimized()) {
1364       nm->make_not_entrant("marked for deoptimization");
1365       nm->make_deoptimized();
1366     }
1367   }
1368 }
1369 
1370 // Marks compiled methods dependent on dependee.
1371 void CodeCache::mark_dependents_on(DeoptimizationScope* deopt_scope, InstanceKlass* dependee) {
1372   assert_lock_strong(Compile_lock);
1373 
1374   if (!has_nmethods_with_dependencies()) {
1375     return;
1376   }
1377 
1378   if (dependee->is_linked()) {
1379     // Class initialization state change.
1380     KlassInitDepChange changes(dependee);
1381     mark_for_deoptimization(deopt_scope, changes);
1382   } else {
1383     // New class is loaded.
1384     NewKlassDepChange changes(dependee);

1344   }
1345 }
1346 
1347 void CodeCache::mark_for_deoptimization(DeoptimizationScope* deopt_scope, Method* dependee) {
1348   MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
1349 
1350   NMethodIterator iter(NMethodIterator::not_unloading);
1351   while(iter.next()) {
1352     nmethod* nm = iter.method();
1353     if (nm->is_dependent_on_method(dependee)) {
1354       deopt_scope->mark(nm);
1355     }
1356   }
1357 }
1358 
1359 void CodeCache::make_marked_nmethods_deoptimized() {
1360   RelaxedNMethodIterator iter(RelaxedNMethodIterator::not_unloading);
1361   while(iter.next()) {
1362     nmethod* nm = iter.method();
1363     if (nm->is_marked_for_deoptimization() && !nm->has_been_deoptimized() && nm->can_be_deoptimized()) {
1364       nm->make_not_entrant(nmethod::InvalidationReason::MARKED_FOR_DEOPTIMIZATION);
1365       nm->make_deoptimized();
1366     }
1367   }
1368 }
1369 
1370 // Marks compiled methods dependent on dependee.
1371 void CodeCache::mark_dependents_on(DeoptimizationScope* deopt_scope, InstanceKlass* dependee) {
1372   assert_lock_strong(Compile_lock);
1373 
1374   if (!has_nmethods_with_dependencies()) {
1375     return;
1376   }
1377 
1378   if (dependee->is_linked()) {
1379     // Class initialization state change.
1380     KlassInitDepChange changes(dependee);
1381     mark_for_deoptimization(deopt_scope, changes);
1382   } else {
1383     // New class is loaded.
1384     NewKlassDepChange changes(dependee);
< prev index next >