# HG changeset patch # User coleenp # Date 1501080067 14400 # Node ID ae2cfffe2e6426db7939651af546b51f631c682b # Parent 5ea48e85ca9000d4b9451ed5e4246ab4fbd88c0e 8185296: java_lang_Class::array_klass should be array_klass_acquire Reviewed-by: eosterlund, kbarrett diff -r 5ea48e85ca90 -r ae2cfffe2e64 hotspot/src/share/vm/classfile/javaClasses.cpp --- a/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jul 26 11:27:51 2017 +0200 +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jul 26 10:41:07 2017 -0400 @@ -1082,8 +1082,8 @@ return name; } -Klass* java_lang_Class::array_klass(oop java_class) { - Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset)); +Klass* java_lang_Class::array_klass_acquire(oop java_class) { + Klass* k = ((Klass*)java_class->metadata_field_acquire(_array_klass_offset)); assert(k == NULL || k->is_klass() && k->is_array_klass(), "should be array klass"); return k; } diff -r 5ea48e85ca90 -r ae2cfffe2e64 hotspot/src/share/vm/classfile/javaClasses.hpp --- a/hotspot/src/share/vm/classfile/javaClasses.hpp Wed Jul 26 11:27:51 2017 +0200 +++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Wed Jul 26 10:41:07 2017 -0400 @@ -236,7 +236,7 @@ static BasicType primitive_type(oop java_class); static oop primitive_mirror(BasicType t); // JVM_NewArray support - static Klass* array_klass(oop java_class); + static Klass* array_klass_acquire(oop java_class); 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; } diff -r 5ea48e85ca90 -r ae2cfffe2e64 hotspot/src/share/vm/oops/instanceKlass.cpp --- a/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Jul 26 11:27:51 2017 +0200 +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Jul 26 10:41:07 2017 -0400 @@ -2949,7 +2949,7 @@ st->print(BULLET"fake entry for mirror: "); mirrored_klass->print_value_on_maybe_null(st); st->cr(); - Klass* array_klass = java_lang_Class::array_klass(obj); + Klass* array_klass = java_lang_Class::array_klass_acquire(obj); st->print(BULLET"fake entry for array: "); array_klass->print_value_on_maybe_null(st); st->cr(); diff -r 5ea48e85ca90 -r ae2cfffe2e64 hotspot/src/share/vm/oops/oop.hpp --- a/hotspot/src/share/vm/oops/oop.hpp Wed Jul 26 11:27:51 2017 +0200 +++ b/hotspot/src/share/vm/oops/oop.hpp Wed Jul 26 10:41:07 2017 -0400 @@ -204,6 +204,7 @@ inline Metadata* metadata_field(int offset) const; inline void metadata_field_put(int offset, Metadata* value); + inline Metadata* metadata_field_acquire(int offset) const; inline void release_metadata_field_put(int offset, Metadata* value); inline jbyte byte_field(int offset) const; diff -r 5ea48e85ca90 -r ae2cfffe2e64 hotspot/src/share/vm/oops/oop.inline.hpp --- a/hotspot/src/share/vm/oops/oop.inline.hpp Wed Jul 26 11:27:51 2017 +0200 +++ b/hotspot/src/share/vm/oops/oop.inline.hpp Wed Jul 26 10:41:07 2017 -0400 @@ -446,6 +446,10 @@ Metadata* oopDesc::metadata_field(int offset) const { return *metadata_field_addr(offset); } void oopDesc::metadata_field_put(int offset, Metadata* value) { *metadata_field_addr(offset) = value; } +Metadata* oopDesc::metadata_field_acquire(int offset) const { + return (Metadata*)OrderAccess::load_ptr_acquire(metadata_field_addr(offset)); +} + void oopDesc::release_metadata_field_put(int offset, Metadata* value) { OrderAccess::release_store_ptr(metadata_field_addr(offset), value); }