< prev index next >

src/hotspot/share/code/codeCache.cpp

Print this page

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

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