comparison src/share/vm/runtime/advancedThresholdPolicy.cpp @ 20588:41dcdd636080

8040798: compiler/startup/SmallCodeCacheStartup.java timed out in RT_Baseline Summary: Fixes broken memory freeing of compile queue tasks and makes sure that blocking compiles do not hang the VM if compilation gets disabled due to a full code cache. Reviewed-by: kvn, iveresov
author anoll
date Tue, 29 Apr 2014 07:59:22 +0200
parents 7301840ea20e
children 600c44255e5f
comparison
equal deleted inserted replaced
20584:ef9eda2c1abe 20588:41dcdd636080
449 void AdvancedThresholdPolicy::method_invocation_event(methodHandle mh, methodHandle imh, 449 void AdvancedThresholdPolicy::method_invocation_event(methodHandle mh, methodHandle imh,
450 CompLevel level, nmethod* nm, JavaThread* thread) { 450 CompLevel level, nmethod* nm, JavaThread* thread) {
451 if (should_create_mdo(mh(), level)) { 451 if (should_create_mdo(mh(), level)) {
452 create_mdo(mh, thread); 452 create_mdo(mh, thread);
453 } 453 }
454 if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh, InvocationEntryBci)) { 454 if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh)) {
455 CompLevel next_level = call_event(mh(), level); 455 CompLevel next_level = call_event(mh(), level);
456 if (next_level != level) { 456 if (next_level != level) {
457 compile(mh, InvocationEntryBci, next_level, thread); 457 compile(mh, InvocationEntryBci, next_level, thread);
458 } 458 }
459 } 459 }
473 473
474 if (is_compilation_enabled()) { 474 if (is_compilation_enabled()) {
475 CompLevel next_osr_level = loop_event(imh(), level); 475 CompLevel next_osr_level = loop_event(imh(), level);
476 CompLevel max_osr_level = (CompLevel)imh->highest_osr_comp_level(); 476 CompLevel max_osr_level = (CompLevel)imh->highest_osr_comp_level();
477 // At the very least compile the OSR version 477 // At the very least compile the OSR version
478 if (!CompileBroker::compilation_is_in_queue(imh, bci) && next_osr_level != level) { 478 if (!CompileBroker::compilation_is_in_queue(imh) && (next_osr_level != level)) {
479 compile(imh, bci, next_osr_level, thread); 479 compile(imh, bci, next_osr_level, thread);
480 } 480 }
481 481
482 // Use loop event as an opportunity to also check if there's been 482 // Use loop event as an opportunity to also check if there's been
483 // enough calls. 483 // enough calls.
507 print_event(MAKE_NOT_ENTRANT, mh(), mh(), osr_bci, level); 507 print_event(MAKE_NOT_ENTRANT, mh(), mh(), osr_bci, level);
508 } 508 }
509 nm->make_not_entrant(); 509 nm->make_not_entrant();
510 } 510 }
511 } 511 }
512 if (!CompileBroker::compilation_is_in_queue(mh, InvocationEntryBci)) { 512 if (!CompileBroker::compilation_is_in_queue(mh)) {
513 // Fix up next_level if necessary to avoid deopts 513 // Fix up next_level if necessary to avoid deopts
514 if (next_level == CompLevel_limited_profile && max_osr_level == CompLevel_full_profile) { 514 if (next_level == CompLevel_limited_profile && max_osr_level == CompLevel_full_profile) {
515 next_level = CompLevel_full_profile; 515 next_level = CompLevel_full_profile;
516 } 516 }
517 if (cur_level != next_level) { 517 if (cur_level != next_level) {
519 } 519 }
520 } 520 }
521 } else { 521 } else {
522 cur_level = comp_level(imh()); 522 cur_level = comp_level(imh());
523 next_level = call_event(imh(), cur_level); 523 next_level = call_event(imh(), cur_level);
524 if (!CompileBroker::compilation_is_in_queue(imh, bci) && next_level != cur_level) { 524 if (!CompileBroker::compilation_is_in_queue(imh) && (next_level != cur_level)) {
525 compile(imh, InvocationEntryBci, next_level, thread); 525 compile(imh, InvocationEntryBci, next_level, thread);
526 } 526 }
527 } 527 }
528 } 528 }
529 } 529 }