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