equal
deleted
inserted
replaced
1039 instanceKlassHandle this_k(THREAD, this); |
1039 instanceKlassHandle this_k(THREAD, this); |
1040 return array_klass_impl(this_k, or_null, n, THREAD); |
1040 return array_klass_impl(this_k, or_null, n, THREAD); |
1041 } |
1041 } |
1042 |
1042 |
1043 Klass* InstanceKlass::array_klass_impl(instanceKlassHandle this_k, bool or_null, int n, TRAPS) { |
1043 Klass* InstanceKlass::array_klass_impl(instanceKlassHandle this_k, bool or_null, int n, TRAPS) { |
1044 if (this_k->array_klasses() == NULL) { |
1044 // Need load-acquire for lock-free read |
|
1045 if (this_k->array_klasses_acquire() == NULL) { |
1045 if (or_null) return NULL; |
1046 if (or_null) return NULL; |
1046 |
1047 |
1047 ResourceMark rm; |
1048 ResourceMark rm; |
1048 JavaThread *jt = (JavaThread *)THREAD; |
1049 JavaThread *jt = (JavaThread *)THREAD; |
1049 { |
1050 { |
1052 MutexLocker ma(MultiArray_lock, THREAD); |
1053 MutexLocker ma(MultiArray_lock, THREAD); |
1053 |
1054 |
1054 // Check if update has already taken place |
1055 // Check if update has already taken place |
1055 if (this_k->array_klasses() == NULL) { |
1056 if (this_k->array_klasses() == NULL) { |
1056 Klass* k = ObjArrayKlass::allocate_objArray_klass(this_k->class_loader_data(), 1, this_k, CHECK_NULL); |
1057 Klass* k = ObjArrayKlass::allocate_objArray_klass(this_k->class_loader_data(), 1, this_k, CHECK_NULL); |
1057 this_k->set_array_klasses(k); |
1058 // use 'release' to pair with lock-free load |
|
1059 this_k->release_set_array_klasses(k); |
1058 } |
1060 } |
1059 } |
1061 } |
1060 } |
1062 } |
1061 // _this will always be set at this point |
1063 // _this will always be set at this point |
1062 ObjArrayKlass* oak = (ObjArrayKlass*)this_k->array_klasses(); |
1064 ObjArrayKlass* oak = (ObjArrayKlass*)this_k->array_klasses(); |