hotspot/src/share/vm/oops/typeArrayKlass.cpp
changeset 40887 8d35e19f5548
parent 38094 46977cd73d86
child 41183 207b92e69457
equal deleted inserted replaced
40886:98cb935dc074 40887:8d35e19f5548
    32 #include "gc/shared/collectedHeap.inline.hpp"
    32 #include "gc/shared/collectedHeap.inline.hpp"
    33 #include "memory/metadataFactory.hpp"
    33 #include "memory/metadataFactory.hpp"
    34 #include "memory/resourceArea.hpp"
    34 #include "memory/resourceArea.hpp"
    35 #include "memory/universe.hpp"
    35 #include "memory/universe.hpp"
    36 #include "memory/universe.inline.hpp"
    36 #include "memory/universe.inline.hpp"
       
    37 #include "oops/arrayKlass.inline.hpp"
    37 #include "oops/instanceKlass.hpp"
    38 #include "oops/instanceKlass.hpp"
    38 #include "oops/klass.inline.hpp"
    39 #include "oops/klass.inline.hpp"
    39 #include "oops/objArrayKlass.hpp"
    40 #include "oops/objArrayKlass.hpp"
    40 #include "oops/oop.inline.hpp"
    41 #include "oops/oop.inline.hpp"
    41 #include "oops/typeArrayKlass.inline.hpp"
    42 #include "oops/typeArrayKlass.inline.hpp"
    42 #include "oops/typeArrayOop.inline.hpp"
    43 #include "oops/typeArrayOop.inline.hpp"
    43 #include "runtime/handles.inline.hpp"
    44 #include "runtime/handles.inline.hpp"
    44 #include "runtime/orderAccess.inline.hpp"
       
    45 #include "utilities/macros.hpp"
    45 #include "utilities/macros.hpp"
    46 
    46 
    47 bool TypeArrayKlass::compute_is_subtype_of(Klass* k) {
    47 bool TypeArrayKlass::compute_is_subtype_of(Klass* k) {
    48   if (!k->is_typeArray_klass()) {
    48   if (!k->is_typeArray_klass()) {
    49     return ArrayKlass::compute_is_subtype_of(k);
    49     return ArrayKlass::compute_is_subtype_of(k);
   164   int dim = dimension();
   164   int dim = dimension();
   165   assert(dim <= n, "check order of chain");
   165   assert(dim <= n, "check order of chain");
   166     if (dim == n)
   166     if (dim == n)
   167       return this;
   167       return this;
   168 
   168 
   169   if (higher_dimension() == NULL) {
   169   // lock-free read needs acquire semantics
       
   170   if (higher_dimension_acquire() == NULL) {
   170     if (or_null)  return NULL;
   171     if (or_null)  return NULL;
   171 
   172 
   172     ResourceMark rm;
   173     ResourceMark rm;
   173     JavaThread *jt = (JavaThread *)THREAD;
   174     JavaThread *jt = (JavaThread *)THREAD;
   174     {
   175     {
   179       if (higher_dimension() == NULL) {
   180       if (higher_dimension() == NULL) {
   180         Klass* oak = ObjArrayKlass::allocate_objArray_klass(
   181         Klass* oak = ObjArrayKlass::allocate_objArray_klass(
   181               class_loader_data(), dim + 1, this, CHECK_NULL);
   182               class_loader_data(), dim + 1, this, CHECK_NULL);
   182         ObjArrayKlass* h_ak = ObjArrayKlass::cast(oak);
   183         ObjArrayKlass* h_ak = ObjArrayKlass::cast(oak);
   183         h_ak->set_lower_dimension(this);
   184         h_ak->set_lower_dimension(this);
   184         OrderAccess::storestore();
   185         // use 'release' to pair with lock-free load
   185         set_higher_dimension(h_ak);
   186         release_set_higher_dimension(h_ak);
   186         assert(h_ak->is_objArray_klass(), "incorrect initialization of ObjArrayKlass");
   187         assert(h_ak->is_objArray_klass(), "incorrect initialization of ObjArrayKlass");
   187       }
   188       }
   188     }
   189     }
   189   } else {
   190   } else {
   190     CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
   191     CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());