hotspot/src/share/vm/classfile/systemDictionary.cpp
changeset 42650 1f304d0c888b
parent 42639 762117d57d05
child 42876 ff8ff9dcccec
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp	Sun Dec 11 12:05:57 2016 -0800
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp	Sun Dec 11 19:07:04 2016 -0800
@@ -23,6 +23,7 @@
  */
 
 #include "precompiled.hpp"
+#include "aot/aotLoader.hpp"
 #include "classfile/classFileParser.hpp"
 #include "classfile/classFileStream.hpp"
 #include "classfile/classLoader.hpp"
@@ -1151,13 +1152,21 @@
   Symbol* h_name = k->name();
   assert(class_name == NULL || class_name == h_name, "name mismatch");
 
+  bool define_succeeded = false;
   // Add class just loaded
   // If a class loader supports parallel classloading handle parallel define requests
   // find_or_define_instance_class may return a different InstanceKlass
   if (is_parallelCapable(class_loader)) {
-    k = find_or_define_instance_class(h_name, class_loader, k, CHECK_NULL);
+    instanceKlassHandle defined_k = find_or_define_instance_class(h_name, class_loader, k, CHECK_NULL);
+    if (k() == defined_k()) {
+      // we have won over other concurrent threads (if any) that are
+      // competing to define the same class.
+      define_succeeded = true;
+    }
+    k = defined_k;
   } else {
     define_instance_class(k, CHECK_NULL);
+    define_succeeded = true;
   }
 
   // Make sure we have an entry in the SystemDictionary on success
@@ -1401,6 +1410,19 @@
     // notify a class loaded from shared object
     ClassLoadingService::notify_class_loaded(ik(), true /* shared class */);
   }
+
+  ik->set_has_passed_fingerprint_check(false);
+  if (UseAOT && ik->supers_have_passed_fingerprint_checks()) {
+    uint64_t aot_fp = AOTLoader::get_saved_fingerprint(ik());
+    uint64_t cds_fp = ik->get_stored_fingerprint();
+    if (aot_fp != 0 && aot_fp == cds_fp) {
+      // This class matches with a class saved in an AOT library
+      ik->set_has_passed_fingerprint_check(true);
+    } else {
+      ResourceMark rm;
+      log_info(class, fingerprint)("%s :  expected = " PTR64_FORMAT " actual = " PTR64_FORMAT, ik->external_name(), aot_fp, cds_fp);
+    }
+  }
   return ik;
 }
 #endif // INCLUDE_CDS
@@ -1487,7 +1509,9 @@
 
     // find_or_define_instance_class may return a different InstanceKlass
     if (!k.is_null()) {
-      k = find_or_define_instance_class(class_name, class_loader, k, CHECK_(nh));
+      instanceKlassHandle defined_k =
+        find_or_define_instance_class(class_name, class_loader, k, CHECK_(nh));
+      k = defined_k;
     }
     return k;
   } else {