changeset 13383:938e1e64e28f

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
author anoll
date Thu, 14 Nov 2013 19:27:07 +0100
parents 570aaefce624
children fca8f4799229
files src/share/vm/ci/ciEnv.cpp src/share/vm/runtime/sweeper.cpp
diffstat 2 files changed, 13 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/ci/ciEnv.cpp	Mon Nov 18 12:26:51 2013 -0800
+++ b/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();
   }
-
 }
 
 
--- a/src/share/vm/runtime/sweeper.cpp	Mon Nov 18 12:26:51 2013 -0800
+++ b/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;
   }