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()); |