changeset 7517:c6a334f9db4c

8066171: Out of order with Metaspace allocation lock Summary: Lock resolved_references instead. Reviewed-by: twisti, sspitsyn
author coleenp
date Fri, 05 Dec 2014 15:15:13 -0500
parents 1c629f3fe8b2
children bfefb8bc3f55
files src/share/vm/oops/cpCache.cpp
diffstat 1 files changed, 7 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/oops/cpCache.cpp	Thu Dec 04 15:20:09 2014 -0800
+++ b/src/share/vm/oops/cpCache.cpp	Fri Dec 05 15:15:13 2014 -0500
@@ -287,9 +287,13 @@
   // the lock, so that when the losing writer returns, he can use the linked
   // cache entry.
 
-  // Use the lock from the metaspace for this, which cannot stop for safepoint.
-  Mutex* metaspace_lock = cpool->pool_holder()->class_loader_data()->metaspace_lock();
-  MutexLockerEx ml(metaspace_lock,  Mutex::_no_safepoint_check_flag);
+  objArrayHandle resolved_references = cpool->resolved_references();
+  // Use the resolved_references() lock for this cpCache entry.
+  // resolved_references are created for all classes with Invokedynamic, MethodHandle
+  // or MethodType constant pool cache entries.
+  assert(resolved_references() != NULL,
+         "a resolved_references array should have been created for this class");
+  ObjectLocker ol(resolved_references, Thread::current());
   if (!is_f1_null()) {
     return;
   }
@@ -336,7 +340,6 @@
   // This allows us to create fewer Methods, while keeping type safety.
   //
 
-  objArrayHandle resolved_references = cpool->resolved_references();
   // Store appendix, if any.
   if (has_appendix) {
     const int appendix_index = f2_as_index() + _indy_resolved_references_appendix_offset;