8066679: jvmtiRedefineClasses.cpp assert cache ptrs must match
authorsspitsyn
Tue, 07 Apr 2015 20:18:28 -0700
changeset 30229 2d8a6a2ee279
parent 30228 c26511266981
child 30231 501167dc42a2
child 30232 dc351997b749
8066679: jvmtiRedefineClasses.cpp assert cache ptrs must match Summary: remove the assert and deallocate cashed class file bytes that are in collision Reviewed-by: coleenp, dcubed
hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp	Tue Apr 07 03:04:29 2015 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp	Tue Apr 07 20:18:28 2015 -0700
@@ -3992,14 +3992,13 @@
     // the_class doesn't have a cache yet so copy it
     the_class->set_cached_class_file(scratch_class->get_cached_class_file());
   }
-#ifndef PRODUCT
-  else {
-    assert(the_class->get_cached_class_file_bytes() ==
-      scratch_class->get_cached_class_file_bytes(), "cache ptrs must match");
-    assert(the_class->get_cached_class_file_len() ==
-      scratch_class->get_cached_class_file_len(), "cache lens must match");
+  else if (scratch_class->get_cached_class_file_bytes() !=
+           the_class->get_cached_class_file_bytes()) {
+    // The same class can be present twice in the scratch classes list or there
+    // are multiple concurrent RetransformClasses calls on different threads.
+    // In such cases we have to deallocate scratch_class cached_class_file_bytes.
+    os::free(scratch_class->get_cached_class_file_bytes());
   }
-#endif
 
   // NULL out in scratch class to not delete twice.  The class to be redefined
   // always owns these bytes.