Skip to content

Commit 9e00949

Browse files
committed
8316427: Duplicated code for {obj,type}ArrayKlass::array_klass
Reviewed-by: dholmes, adinn
1 parent c43ebd3 commit 9e00949

File tree

6 files changed

+68
-133
lines changed

6 files changed

+68
-133
lines changed

src/hotspot/share/oops/arrayKlass.cpp

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#include "memory/metaspaceClosure.hpp"
3434
#include "memory/resourceArea.hpp"
3535
#include "memory/universe.hpp"
36-
#include "oops/arrayKlass.hpp"
36+
#include "oops/arrayKlass.inline.hpp"
3737
#include "oops/arrayOop.hpp"
3838
#include "oops/instanceKlass.hpp"
3939
#include "oops/klass.inline.hpp"
@@ -116,6 +116,63 @@ void ArrayKlass::complete_create_array_klass(ArrayKlass* k, Klass* super_klass,
116116
java_lang_Class::create_mirror(k, Handle(THREAD, k->class_loader()), Handle(THREAD, module), Handle(), Handle(), CHECK);
117117
}
118118

119+
ArrayKlass* ArrayKlass::array_klass(int n, TRAPS) {
120+
121+
assert(dimension() <= n, "check order of chain");
122+
int dim = dimension();
123+
if (dim == n) return this;
124+
125+
// lock-free read needs acquire semantics
126+
if (higher_dimension_acquire() == nullptr) {
127+
128+
ResourceMark rm(THREAD);
129+
{
130+
// Ensure atomic creation of higher dimensions
131+
MutexLocker mu(THREAD, MultiArray_lock);
132+
133+
// Check if another thread beat us
134+
if (higher_dimension() == nullptr) {
135+
136+
// Create multi-dim klass object and link them together
137+
ObjArrayKlass* ak =
138+
ObjArrayKlass::allocate_objArray_klass(class_loader_data(), dim + 1, this, CHECK_NULL);
139+
ak->set_lower_dimension(this);
140+
// use 'release' to pair with lock-free load
141+
release_set_higher_dimension(ak);
142+
assert(ak->is_objArray_klass(), "incorrect initialization of ObjArrayKlass");
143+
}
144+
}
145+
}
146+
147+
ObjArrayKlass *ak = higher_dimension();
148+
THREAD->check_possible_safepoint();
149+
return ak->array_klass(n, THREAD);
150+
}
151+
152+
ArrayKlass* ArrayKlass::array_klass_or_null(int n) {
153+
154+
assert(dimension() <= n, "check order of chain");
155+
int dim = dimension();
156+
if (dim == n) return this;
157+
158+
// lock-free read needs acquire semantics
159+
if (higher_dimension_acquire() == nullptr) {
160+
return nullptr;
161+
}
162+
163+
ObjArrayKlass *ak = higher_dimension();
164+
return ak->array_klass_or_null(n);
165+
}
166+
167+
ArrayKlass* ArrayKlass::array_klass(TRAPS) {
168+
return array_klass(dimension() + 1, THREAD);
169+
}
170+
171+
ArrayKlass* ArrayKlass::array_klass_or_null() {
172+
return array_klass_or_null(dimension() + 1);
173+
}
174+
175+
119176
GrowableArray<Klass*>* ArrayKlass::compute_secondary_supers(int num_extra_slots,
120177
Array<InstanceKlass*>* transitive_interfaces) {
121178
// interfaces = { cloneable_klass, serializable_klass };

src/hotspot/share/oops/arrayKlass.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ class ArrayKlass: public Klass {
5353
// Testing operation
5454
DEBUG_ONLY(bool is_array_klass_slow() const { return true; })
5555

56+
// Returns the ObjArrayKlass for n'th dimension.
57+
ArrayKlass* array_klass(int n, TRAPS);
58+
ArrayKlass* array_klass_or_null(int n);
59+
60+
// Returns the array class with this class as element type.
61+
ArrayKlass* array_klass(TRAPS);
62+
ArrayKlass* array_klass_or_null();
63+
5664
// Instance variables
5765
int dimension() const { return _dimension; }
5866
void set_dimension(int dimension) { _dimension = dimension; }

src/hotspot/share/oops/objArrayKlass.cpp

Lines changed: 1 addition & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#include "memory/metaspaceClosure.hpp"
3535
#include "memory/resourceArea.hpp"
3636
#include "memory/universe.hpp"
37-
#include "oops/arrayKlass.inline.hpp"
37+
#include "oops/arrayKlass.hpp"
3838
#include "oops/instanceKlass.hpp"
3939
#include "oops/klass.inline.hpp"
4040
#include "oops/objArrayKlass.inline.hpp"
@@ -304,63 +304,6 @@ void ObjArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d,
304304
}
305305
}
306306

307-
308-
ArrayKlass* ObjArrayKlass::array_klass(int n, TRAPS) {
309-
310-
assert(dimension() <= n, "check order of chain");
311-
int dim = dimension();
312-
if (dim == n) return this;
313-
314-
// lock-free read needs acquire semantics
315-
if (higher_dimension_acquire() == nullptr) {
316-
317-
ResourceMark rm(THREAD);
318-
{
319-
// Ensure atomic creation of higher dimensions
320-
MutexLocker mu(THREAD, MultiArray_lock);
321-
322-
// Check if another thread beat us
323-
if (higher_dimension() == nullptr) {
324-
325-
// Create multi-dim klass object and link them together
326-
ObjArrayKlass* ak =
327-
ObjArrayKlass::allocate_objArray_klass(class_loader_data(), dim + 1, this, CHECK_NULL);
328-
ak->set_lower_dimension(this);
329-
// use 'release' to pair with lock-free load
330-
release_set_higher_dimension(ak);
331-
assert(ak->is_objArray_klass(), "incorrect initialization of ObjArrayKlass");
332-
}
333-
}
334-
}
335-
336-
ObjArrayKlass *ak = higher_dimension();
337-
THREAD->check_possible_safepoint();
338-
return ak->array_klass(n, THREAD);
339-
}
340-
341-
ArrayKlass* ObjArrayKlass::array_klass_or_null(int n) {
342-
343-
assert(dimension() <= n, "check order of chain");
344-
int dim = dimension();
345-
if (dim == n) return this;
346-
347-
// lock-free read needs acquire semantics
348-
if (higher_dimension_acquire() == nullptr) {
349-
return nullptr;
350-
}
351-
352-
ObjArrayKlass *ak = higher_dimension();
353-
return ak->array_klass_or_null(n);
354-
}
355-
356-
ArrayKlass* ObjArrayKlass::array_klass(TRAPS) {
357-
return array_klass(dimension() + 1, THREAD);
358-
}
359-
360-
ArrayKlass* ObjArrayKlass::array_klass_or_null() {
361-
return array_klass_or_null(dimension() + 1);
362-
}
363-
364307
bool ObjArrayKlass::can_be_primary_super_slow() const {
365308
if (!bottom_klass()->can_be_primary_super())
366309
// array of interfaces

src/hotspot/share/oops/objArrayKlass.hpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,6 @@ class ObjArrayKlass : public ArrayKlass {
9696
arrayOop d, size_t dst_offset,
9797
int length, TRAPS);
9898
public:
99-
// Returns the ObjArrayKlass for n'th dimension.
100-
virtual ArrayKlass* array_klass(int n, TRAPS);
101-
virtual ArrayKlass* array_klass_or_null(int n);
102-
103-
// Returns the array class with this class as element type.
104-
virtual ArrayKlass* array_klass(TRAPS);
105-
virtual ArrayKlass* array_klass_or_null();
106-
10799
static ObjArrayKlass* cast(Klass* k) {
108100
return const_cast<ObjArrayKlass*>(cast(const_cast<const Klass*>(k)));
109101
}

src/hotspot/share/oops/typeArrayKlass.cpp

Lines changed: 1 addition & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
#include "memory/metadataFactory.hpp"
3333
#include "memory/resourceArea.hpp"
3434
#include "memory/universe.hpp"
35-
#include "oops/arrayKlass.inline.hpp"
35+
#include "oops/arrayKlass.hpp"
3636
#include "oops/instanceKlass.hpp"
3737
#include "oops/klass.inline.hpp"
3838
#include "oops/objArrayKlass.hpp"
@@ -170,63 +170,6 @@ void TypeArrayKlass::copy_array(arrayOop s, int src_pos, arrayOop d, int dst_pos
170170
ArrayAccess<ARRAYCOPY_ATOMIC>::arraycopy<void>(s, src_offset, d, dst_offset, (size_t)length << l2es);
171171
}
172172

173-
// create a klass of array holding typeArrays
174-
ArrayKlass* TypeArrayKlass::array_klass(int n, TRAPS) {
175-
int dim = dimension();
176-
assert(dim <= n, "check order of chain");
177-
if (dim == n)
178-
return this;
179-
180-
// lock-free read needs acquire semantics
181-
if (higher_dimension_acquire() == nullptr) {
182-
183-
ResourceMark rm;
184-
JavaThread *jt = THREAD;
185-
{
186-
// Atomic create higher dimension and link into list
187-
MutexLocker mu(THREAD, MultiArray_lock);
188-
189-
if (higher_dimension() == nullptr) {
190-
Klass* oak = ObjArrayKlass::allocate_objArray_klass(
191-
class_loader_data(), dim + 1, this, CHECK_NULL);
192-
ObjArrayKlass* h_ak = ObjArrayKlass::cast(oak);
193-
h_ak->set_lower_dimension(this);
194-
// use 'release' to pair with lock-free load
195-
release_set_higher_dimension(h_ak);
196-
assert(h_ak->is_objArray_klass(), "incorrect initialization of ObjArrayKlass");
197-
}
198-
}
199-
}
200-
201-
ObjArrayKlass* h_ak = higher_dimension();
202-
THREAD->check_possible_safepoint();
203-
return h_ak->array_klass(n, THREAD);
204-
}
205-
206-
// return existing klass of array holding typeArrays
207-
ArrayKlass* TypeArrayKlass::array_klass_or_null(int n) {
208-
int dim = dimension();
209-
assert(dim <= n, "check order of chain");
210-
if (dim == n)
211-
return this;
212-
213-
// lock-free read needs acquire semantics
214-
if (higher_dimension_acquire() == nullptr) {
215-
return nullptr;
216-
}
217-
218-
ObjArrayKlass* h_ak = higher_dimension();
219-
return h_ak->array_klass_or_null(n);
220-
}
221-
222-
ArrayKlass* TypeArrayKlass::array_klass(TRAPS) {
223-
return array_klass(dimension() + 1, THREAD);
224-
}
225-
226-
ArrayKlass* TypeArrayKlass::array_klass_or_null() {
227-
return array_klass_or_null(dimension() + 1);
228-
}
229-
230173
size_t TypeArrayKlass::oop_size(oop obj) const {
231174
assert(obj->is_typeArray(),"must be a type array");
232175
typeArrayOop t = typeArrayOop(obj);

src/hotspot/share/oops/typeArrayKlass.hpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,6 @@ class TypeArrayKlass : public ArrayKlass {
9494
inline void oop_oop_iterate_reverse(oop obj, OopClosureType* closure);
9595

9696
public:
97-
// Find n'th dimensional array
98-
virtual ArrayKlass* array_klass(int n, TRAPS);
99-
virtual ArrayKlass* array_klass_or_null(int n);
100-
101-
// Returns the array class with this class as element type
102-
virtual ArrayKlass* array_klass(TRAPS);
103-
virtual ArrayKlass* array_klass_or_null();
104-
10597
static TypeArrayKlass* cast(Klass* k) {
10698
return const_cast<TypeArrayKlass*>(cast(const_cast<const Klass*>(k)));
10799
}

0 commit comments

Comments
 (0)