changeset 7258:5b2cd065dfc6

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
author sspitsyn
date Thu, 09 Apr 2015 17:04:24 -0700
parents e3d76b57a655
children 2163da41681e
files src/share/vm/prims/jvmtiRedefineClasses.cpp
diffstat 1 files changed, 6 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/prims/jvmtiRedefineClasses.cpp	Thu Apr 09 16:41:40 2015 +0000
+++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp	Thu Apr 09 17:04:24 2015 -0700
@@ -3979,14 +3979,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.