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);
|