< prev index next >

src/hotspot/share/oops/valueKlass.cpp

Print this page

        

@@ -30,11 +30,11 @@
 #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/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,47 +141,58 @@
 
   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);
+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);
   }
+}
 
-  // Basically the same as instanceKlass, but using "ValueArrayKlass::allocate_klass"
-  if (array_klasses() == NULL) {
-    if (or_null) return NULL;
+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);
-
-      // 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);
+      if (get_value_array_klass() == NULL) {
+        vak = allocate_value_array_klass(CHECK_NULL);
+        OrderAccess::release_store((Klass**)adr_value_array_klass(), vak);
         }
-        set_array_klasses(ak);
       }
     }
+
+  if (!vak->is_valueArray_klass()) {
+    storage_props.clear_flattened();
   }
-  // _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 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 ak->array_klass(n, THREAD);
+  return ObjArrayKlass::allocate_objArray_klass(ArrayStorageProperties::null_free, 1, this, THREAD);
 }
 
-Klass* ValueKlass::array_klass_impl(bool or_null, TRAPS) {
-  return array_klass_impl(or_null, 1, 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 >