< prev index next >

src/share/vm/prims/jvmtiRedefineClasses.cpp

Print this page
rev 9032 : [mq]: JDK-8178870_coredump.patch

@@ -65,10 +65,15 @@
   _class_defs = class_defs;
   _class_load_kind = class_load_kind;
   _res = JVMTI_ERROR_NONE;
 }
 
+static inline InstanceKlass* get_ik(jclass def) {
+  oop mirror = JNIHandles::resolve_non_null(def);
+  return InstanceKlass::cast(java_lang_Class::as_Klass(mirror));
+}
+
 bool VM_RedefineClasses::doit_prologue() {
   if (_class_count == 0) {
     _res = JVMTI_ERROR_NONE;
     return false;
   }

@@ -103,10 +108,15 @@
     for (int i = 0; i < _class_count; i++) {
       if (_scratch_classes[i] != NULL) {
         ClassLoaderData* cld = _scratch_classes[i]->class_loader_data();
         // Free the memory for this class at class unloading time.  Not before
         // because CMS might think this is still live.
+        InstanceKlass* ik = get_ik(_class_defs[i].klass);
+        if (ik->get_cached_class_file() == ((InstanceKlass*)_scratch_classes[i])->get_cached_class_file()) {
+          // Don't double-free cached_class_file copied from the original class if error.
+          ((InstanceKlass*)_scratch_classes[i])->set_cached_class_file(NULL);
+        }
         cld->add_to_deallocate_list((InstanceKlass*)_scratch_classes[i]);
       }
     }
     // Free os::malloc allocated memory in load_new_class_version.
     os::free(_scratch_classes);

@@ -3978,16 +3988,16 @@
 
   // The class file bytes from before any retransformable agents mucked
   // with them was cached on the scratch class, move to the_class.
   // Note: we still want to do this if nothing needed caching since it
   // should get cleared in the_class too.
-  if (the_class->get_cached_class_file_bytes() == 0) {
+  if (the_class->get_cached_class_file() == 0) {
     // the_class doesn't have a cache yet so copy it
     the_class->set_cached_class_file(scratch_class->get_cached_class_file());
   }
-  else if (scratch_class->get_cached_class_file_bytes() !=
-           the_class->get_cached_class_file_bytes()) {
+  else if (scratch_class->get_cached_class_file() !=
+           the_class->get_cached_class_file()) {
     // 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.
     os::free(scratch_class->get_cached_class_file());
   }
< prev index next >