< prev index next >

src/hotspot/share/oops/valueKlass.cpp

Print this page

        

*** 30,40 **** #include "logging/log.hpp" #include "memory/metadataFactory.hpp" #include "oops/access.hpp" #include "oops/compressedOops.inline.hpp" #include "oops/fieldStreams.hpp" ! #include "oops/instanceKlass.hpp" #include "oops/method.hpp" #include "oops/oop.inline.hpp" #include "oops/objArrayKlass.hpp" #include "oops/valueKlass.hpp" #include "oops/valueArrayKlass.hpp" --- 30,40 ---- #include "logging/log.hpp" #include "memory/metadataFactory.hpp" #include "oops/access.hpp" #include "oops/compressedOops.inline.hpp" #include "oops/fieldStreams.hpp" ! #include "oops/instanceKlass.inline.hpp" #include "oops/method.hpp" #include "oops/oop.inline.hpp" #include "oops/objArrayKlass.hpp" #include "oops/valueKlass.hpp" #include "oops/valueArrayKlass.hpp"
*** 141,187 **** return true; } ! Klass* ValueKlass::array_klass_impl(bool or_null, int n, TRAPS) { ! if (!flatten_array()) { ! return InstanceKlass::array_klass_impl(or_null, n, THREAD); } ! // Basically the same as instanceKlass, but using "ValueArrayKlass::allocate_klass" ! if (array_klasses() == NULL) { ! if (or_null) return NULL; ResourceMark rm; JavaThread *jt = (JavaThread *)THREAD; { // Atomic creation of array_klasses MutexLocker ma(MultiArray_lock, THREAD); ! ! // Check if update has already taken place ! if (array_klasses() == NULL) { ! Klass* ak; ! if (is_atomic() || (!ValueArrayAtomicAccess)) { ! ak = ValueArrayKlass::allocate_klass(this, CHECK_NULL); ! } else { ! ak = ObjArrayKlass::allocate_objArray_klass(class_loader_data(), 1, this, CHECK_NULL); } - set_array_klasses(ak); } } } - // _this will always be set at this point - ArrayKlass* ak = ArrayKlass::cast(array_klasses()); if (or_null) { ! return ak->array_klass_or_null(n); } ! return ak->array_klass(n, THREAD); } ! Klass* ValueKlass::array_klass_impl(bool or_null, TRAPS) { ! return array_klass_impl(or_null, 1, THREAD); } void ValueKlass::raw_field_copy(void* src, void* dst, size_t raw_byte_size) { /* * Try not to shear fields even if not an atomic store... --- 141,198 ---- return true; } ! Klass* ValueKlass::array_klass_impl(ArrayStorageProperties storage_props, bool or_null, int n, TRAPS) { ! if (storage_props.is_flattened()) { ! return value_array_klass(storage_props, or_null, n, THREAD); ! } else { ! return InstanceKlass::array_klass_impl(storage_props, or_null, n, THREAD); } + } ! Klass* ValueKlass::array_klass_impl(ArrayStorageProperties storage_props, bool or_null, TRAPS) { ! return array_klass_impl(storage_props, or_null, 1, THREAD); ! } + Klass* ValueKlass::value_array_klass(ArrayStorageProperties storage_props, bool or_null, int rank, TRAPS) { + Klass* vak = acquire_value_array_klass(); + if (vak == NULL) { + if (or_null) return NULL; ResourceMark rm; JavaThread *jt = (JavaThread *)THREAD; { // Atomic creation of array_klasses MutexLocker ma(MultiArray_lock, THREAD); ! if (get_value_array_klass() == NULL) { ! vak = allocate_value_array_klass(CHECK_NULL); ! OrderAccess::release_store((Klass**)adr_value_array_klass(), vak); } } } + + if (!vak->is_valueArray_klass()) { + storage_props.clear_flattened(); } if (or_null) { ! return vak->array_klass_or_null(storage_props, rank); ! } ! return vak->array_klass(storage_props, rank, THREAD); ! } ! ! Klass* ValueKlass::allocate_value_array_klass(TRAPS) { ! if (flatten_array() && (is_atomic() || (!ValueArrayAtomicAccess))) { ! return ValueArrayKlass::allocate_klass(ArrayStorageProperties::flattened_and_null_free, this, THREAD); } ! return ObjArrayKlass::allocate_objArray_klass(ArrayStorageProperties::null_free, 1, this, THREAD); } ! void ValueKlass::array_klasses_do(void f(Klass* k)) { ! InstanceKlass::array_klasses_do(f); ! if (get_value_array_klass() != NULL) ! ArrayKlass::cast(get_value_array_klass())->array_klasses_do(f); } void ValueKlass::raw_field_copy(void* src, void* dst, size_t raw_byte_size) { /* * Try not to shear fields even if not an atomic store...
< prev index next >