changeset 24162:0137da2b56d9

Update JDK-8182397 to final version
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Thu, 03 Aug 2017 11:53:11 -0700
parents cc8d6f9d5db3
children 7d8e0c328b64
files src/share/vm/classfile/javaClasses.cpp src/share/vm/classfile/javaClasses.hpp src/share/vm/oops/oop.hpp src/share/vm/oops/oop.inline.hpp
diffstat 4 files changed, 18 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/classfile/javaClasses.cpp	Thu Aug 03 11:32:15 2017 -0700
+++ b/src/share/vm/classfile/javaClasses.cpp	Thu Aug 03 11:53:11 2017 -0700
@@ -577,6 +577,7 @@
 
 void java_lang_Class::create_mirror(KlassHandle k, Handle class_loader,
                                     Handle protection_domain, TRAPS) {
+  assert(k() != NULL, "Use create_basic_type_mirror for primitive types");
   assert(k->java_mirror() == NULL, "should only assign mirror once");
   // Use this moment of initialization to cache modifier_flags also,
   // to support Class.getModifiers().  Instance classes recalculate
@@ -592,9 +593,7 @@
     Handle comp_mirror;
 
     // Setup indirection from mirror->klass
-    if (!k.is_null()) {
-      java_lang_Class::set_klass(mirror(), k());
-    }
+    java_lang_Class::set_klass(mirror(), k());
 
     InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass());
     assert(oop_size(mirror()) == mk->instance_size(k), "should have been set");
@@ -603,6 +602,7 @@
 
     // It might also have a component mirror.  This mirror must already exist.
     if (k->oop_is_array()) {
+      Handle comp_mirror;
       if (k->oop_is_typeArray()) {
         BasicType type = TypeArrayKlass::cast(k())->element_type();
         comp_mirror = Handle(THREAD, Universe::java_mirror(type));
@@ -612,12 +612,12 @@
         assert(element_klass != NULL, "Must have an element klass");
         comp_mirror = Handle(THREAD, element_klass->java_mirror());
       }
-      assert(comp_mirror.not_null(), "must have a mirror");
+      assert(comp_mirror() != NULL, "must have a mirror");
 
       // Two-way link between the array klass and its component mirror:
       ArrayKlass::cast(k())->set_component_mirror(comp_mirror());
-      // Set after k->java_mirror() is published.
-      // set_array_klass(comp_mirror(), k());
+      // See below for ordering dependencies between field array_klass in component mirror
+      // and java_mirror in this klass.
     } else {
       assert(k->oop_is_instance(), "Must be");
 
@@ -640,7 +640,9 @@
     // after any exceptions can happen during allocations.
     k->set_java_mirror(mirror());
     if (comp_mirror() != NULL) {
-        set_array_klass(comp_mirror(), k());
+      // Set after k->java_mirror() is published, because compiled code running
+      // concurrently doesn't expect a k to have a null java_mirror.
+      release_set_array_klass(comp_mirror(), k());
     }
   } else {
     if (fixup_mirror_list() == NULL) {
@@ -717,7 +719,7 @@
   if (type != T_VOID) {
     Klass* aklass = Universe::typeArrayKlassObj(type);
     assert(aklass != NULL, "correct bootstrap");
-    set_array_klass(java_class, aklass);
+    release_set_array_klass(java_class, aklass);
   }
 #ifdef ASSERT
   InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(SystemDictionary::Class_klass());
@@ -813,9 +815,10 @@
   return k;
 }
 
-void java_lang_Class::set_array_klass(oop java_class, Klass* klass) {
+
+void java_lang_Class::release_set_array_klass(oop java_class, Klass* klass) {
   assert(klass->is_klass() && klass->oop_is_array(), "should be array klass");
-  java_class->metadata_field_put_volatile(_array_klass_offset, klass);
+  java_class->release_metadata_field_put(_array_klass_offset, klass);
 }
 
 
--- a/src/share/vm/classfile/javaClasses.hpp	Thu Aug 03 11:32:15 2017 -0700
+++ b/src/share/vm/classfile/javaClasses.hpp	Thu Aug 03 11:53:11 2017 -0700
@@ -285,7 +285,7 @@
   static oop primitive_mirror(BasicType t);
   // JVM_NewArray support
   static Klass* array_klass(oop java_class);
-  static void set_array_klass(oop java_class, Klass* klass);
+  static void release_set_array_klass(oop java_class, Klass* klass);
   // compiler support for class operations
   static int klass_offset_in_bytes()                { return _klass_offset; }
   static int array_klass_offset_in_bytes()          { return _array_klass_offset; }
--- a/src/share/vm/oops/oop.hpp	Thu Aug 03 11:32:15 2017 -0700
+++ b/src/share/vm/oops/oop.hpp	Thu Aug 03 11:53:11 2017 -0700
@@ -199,7 +199,8 @@
 
   Metadata* metadata_field(int offset) const;
   void metadata_field_put(int offset, Metadata* value);
-  void metadata_field_put_volatile(int offset, Metadata* value);
+
+  inline void release_metadata_field_put(int offset, Metadata* value);
 
   jbyte byte_field(int offset) const;
   void byte_field_put(int offset, jbyte contents);
--- a/src/share/vm/oops/oop.inline.hpp	Thu Aug 03 11:32:15 2017 -0700
+++ b/src/share/vm/oops/oop.inline.hpp	Thu Aug 03 11:53:11 2017 -0700
@@ -324,10 +324,8 @@
   *metadata_field_addr(offset) = value;
 }
 
-inline void oopDesc::metadata_field_put_volatile(int offset, Metadata* value) {
-  OrderAccess::release();
-  *metadata_field_addr(offset) = value;
-  OrderAccess::fence();
+void oopDesc::release_metadata_field_put(int offset, Metadata* value) {
+  OrderAccess::release_store_ptr(metadata_field_addr(offset), value);
 }
 
 inline void oopDesc::obj_field_put_raw(int offset, oop value) {