8223585: vmTestbase/runtime/pcl/* get SEGV in MetadataOnStackClosure::do_metadata(Metadata*)+0x0
authorcoleenp
Thu, 16 May 2019 11:07:09 -0400
changeset 54901 631d51796dbf
parent 54900 e9f5e06a0dd7
child 54902 d1717e05e51c
8223585: vmTestbase/runtime/pcl/* get SEGV in MetadataOnStackClosure::do_metadata(Metadata*)+0x0 Summary: adjust old method table by only one thread. Reviewed-by: kvn, jcbeyler, sspitsyn
src/hotspot/share/code/codeCache.cpp
src/hotspot/share/code/nmethod.cpp
--- a/src/hotspot/share/code/codeCache.cpp	Thu May 16 16:42:14 2019 +0200
+++ b/src/hotspot/share/code/codeCache.cpp	Thu May 16 11:07:09 2019 -0400
@@ -1055,7 +1055,7 @@
 
 // Remove this method when zombied or unloaded.
 void CodeCache::unregister_old_nmethod(CompiledMethod* c) {
-  assert_locked_or_safepoint(CodeCache_lock);
+  assert_lock_strong(CodeCache_lock);
   if (old_compiled_method_table != NULL) {
     int index = old_compiled_method_table->find(c);
     if (index != -1) {
@@ -1070,7 +1070,11 @@
   if (old_compiled_method_table != NULL) {
     length = old_compiled_method_table->length();
     for (int i = 0; i < length; i++) {
-      old_compiled_method_table->at(i)->metadata_do(f);
+      CompiledMethod* cm = old_compiled_method_table->at(i);
+      // Only walk alive nmethods, the dead ones will get removed by the sweeper.
+      if (cm->is_alive()) {
+        old_compiled_method_table->at(i)->metadata_do(f);
+      }
     }
   }
   log_debug(redefine, class, nmethod)("Walked %d nmethods for mark_on_stack", length);
--- a/src/hotspot/share/code/nmethod.cpp	Thu May 16 16:42:14 2019 +0200
+++ b/src/hotspot/share/code/nmethod.cpp	Thu May 16 11:07:09 2019 -0400
@@ -1143,7 +1143,6 @@
     MutexLocker ml(SafepointSynchronize::is_at_safepoint() ? NULL : CodeCache_lock,
                      Mutex::_no_safepoint_check_flag);
     Universe::heap()->unregister_nmethod(this);
-    CodeCache::unregister_old_nmethod(this);
   }
 
   // Clear the method of this dead nmethod
@@ -1336,7 +1335,6 @@
       MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
       if (nmethod_needs_unregister) {
         Universe::heap()->unregister_nmethod(this);
-        CodeCache::unregister_old_nmethod(this);
       }
       flush_dependencies(/*delete_immediately*/true);
     }
@@ -1415,6 +1413,7 @@
   }
 
   Universe::heap()->flush_nmethod(this);
+  CodeCache::unregister_old_nmethod(this);
 
   CodeBlob::flush();
   CodeCache::free(this);