OpenJDK / jdk / jdk
changeset 54901:631d51796dbf
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
author | coleenp |
---|---|
date | Thu, 16 May 2019 11:07:09 -0400 |
parents | e9f5e06a0dd7 |
children | d1717e05e51c |
files | src/hotspot/share/code/codeCache.cpp src/hotspot/share/code/nmethod.cpp |
diffstat | 2 files changed, 7 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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);