# HG changeset patch # User anoll # Date 1384453627 -3600 # Node ID 4a5fc611c9a78a9f66979d98345125a8d45515a5 # Parent 3533814ab107e3c4186afcfae09741d50ad35f2e 8028306: nsk stress tests, CodeCache fills, then safepoint asserts Summary: Move handle_full_code_cache() out of block that forbids safepoints Reviewed-by: kvn, iveresov diff -r 3533814ab107 -r 4a5fc611c9a7 hotspot/src/share/vm/ci/ciEnv.cpp --- a/hotspot/src/share/vm/ci/ciEnv.cpp Mon Nov 18 12:26:51 2013 -0800 +++ b/hotspot/src/share/vm/ci/ciEnv.cpp Thu Nov 14 19:27:07 2013 +0100 @@ -1003,21 +1003,15 @@ // Free codeBlobs code_buffer->free_blob(); - if (nm == NULL) { - // The CodeCache is full. Print out warning and disable compilation. - record_failure("code cache is full"); - { - MutexUnlocker ml(Compile_lock); - MutexUnlocker locker(MethodCompileQueue_lock); - CompileBroker::handle_full_code_cache(); - } - } else { + if (nm != NULL) { nm->set_has_unsafe_access(has_unsafe_access); nm->set_has_wide_vectors(has_wide_vectors); // Record successful registration. // (Put nm into the task handle *before* publishing to the Java heap.) - if (task() != NULL) task()->set_code(nm); + if (task() != NULL) { + task()->set_code(nm); + } if (entry_bci == InvocationEntryBci) { if (TieredCompilation) { @@ -1055,12 +1049,16 @@ method->method_holder()->add_osr_nmethod(nm); } } - } - // JVMTI -- compiled method notification (must be done outside lock) + } // safepoints are allowed again + if (nm != NULL) { + // JVMTI -- compiled method notification (must be done outside lock) nm->post_compiled_method_load_event(); + } else { + // The CodeCache is full. Print out warning and disable compilation. + record_failure("code cache is full"); + CompileBroker::handle_full_code_cache(); } - } diff -r 3533814ab107 -r 4a5fc611c9a7 hotspot/src/share/vm/runtime/sweeper.cpp --- a/hotspot/src/share/vm/runtime/sweeper.cpp Mon Nov 18 12:26:51 2013 -0800 +++ b/hotspot/src/share/vm/runtime/sweeper.cpp Thu Nov 14 19:27:07 2013 +0100 @@ -231,7 +231,8 @@ */ void NMethodSweeper::possibly_sweep() { assert(JavaThread::current()->thread_state() == _thread_in_vm, "must run in vm mode"); - if (!MethodFlushing || !sweep_in_progress()) { + // Only compiler threads are allowed to sweep + if (!MethodFlushing || !sweep_in_progress() || !Thread::current()->is_Compiler_thread()) { return; }