Mercurial > hg > truffle
annotate src/share/vm/oops/arrayKlass.cpp @ 14649:f6301b007a16
6498581: ThreadInterruptTest3 produces wrong output on Windows
Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set.
Reviewed-by: acorn, kvn
Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author | minqi |
---|---|
date | Wed, 26 Feb 2014 15:20:41 -0800 |
parents | 48314d596a04 |
children | 4ca6dc0799b6 386dd1c71858 |
rev | line source |
---|---|
0 | 1 /* |
14378
48314d596a04
8027146: Class loading verification failure if GC occurs in Universe::flush_dependents_on
coleenp
parents:
14223
diff
changeset
|
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1142
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1142
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1142
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/javaClasses.hpp" | |
27 #include "classfile/systemDictionary.hpp" | |
28 #include "classfile/vmSymbols.hpp" | |
29 #include "gc_interface/collectedHeap.inline.hpp" | |
30 #include "jvmtifiles/jvmti.h" | |
31 #include "memory/gcLocker.hpp" | |
32 #include "memory/universe.inline.hpp" | |
33 #include "oops/arrayKlass.hpp" | |
34 #include "oops/arrayOop.hpp" | |
35 #include "oops/instanceKlass.hpp" | |
36 #include "oops/objArrayOop.hpp" | |
37 #include "oops/oop.inline.hpp" | |
0 | 38 |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
39 int ArrayKlass::static_size(int header_size) { |
0 | 40 // size of an array klass object |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
41 assert(header_size <= InstanceKlass::header_size(), "bad header size"); |
0 | 42 // If this assert fails, see comments in base_create_array_klass. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
43 header_size = InstanceKlass::header_size(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
44 int vtable_len = Universe::base_vtable_size(); |
0 | 45 #ifdef _LP64 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
46 int size = header_size + align_object_offset(vtable_len); |
0 | 47 #else |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
48 int size = header_size + vtable_len; |
0 | 49 #endif |
50 return align_object_size(size); | |
51 } | |
52 | |
53 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
54 Klass* ArrayKlass::java_super() const { |
0 | 55 if (super() == NULL) return NULL; // bootstrap case |
56 // Array klasses have primary supertypes which are not reported to Java. | |
57 // Example super chain: String[][] -> Object[][] -> Object[] -> Object | |
1142 | 58 return SystemDictionary::Object_klass(); |
0 | 59 } |
60 | |
61 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
62 oop ArrayKlass::multi_allocate(int rank, jint* sizes, TRAPS) { |
0 | 63 ShouldNotReachHere(); |
64 return NULL; | |
65 } | |
66 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
67 Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const { |
0 | 68 // There are no methods in an array klass but the super class (Object) has some |
69 assert(super(), "super klass must be present"); | |
6983 | 70 return super()->uncached_lookup_method(name, signature); |
0 | 71 } |
72 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
73 ArrayKlass::ArrayKlass(Symbol* name) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
74 set_name(name); |
0 | 75 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
76 set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass()); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
77 set_layout_helper(Klass::_lh_neutral_value); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
78 set_dimension(1); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
79 set_higher_dimension(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
80 set_lower_dimension(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
81 set_component_mirror(NULL); |
0 | 82 // Arrays don't add any new methods, so their vtable is the same size as |
83 // the vtable of klass Object. | |
84 int vtable_size = Universe::base_vtable_size(); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
85 set_vtable_length(vtable_size); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
86 set_is_cloneable(); // All arrays are considered to be cloneable (See JLS 20.1.5) |
0 | 87 } |
88 | |
89 | |
90 // Initialization of vtables and mirror object is done separatly from base_create_array_klass, | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
91 // since a GC can happen. At this point all instance variables of the ArrayKlass must be setup. |
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
92 void ArrayKlass::complete_create_array_klass(ArrayKlass* k, KlassHandle super_klass, TRAPS) { |
0 | 93 ResourceMark rm(THREAD); |
94 k->initialize_supers(super_klass(), CHECK); | |
95 k->vtable()->initialize_vtable(false, CHECK); | |
10343
6bd680e9ea35
8003421: NPG: Move oops out of InstanceKlass into mirror
coleenp
parents:
6983
diff
changeset
|
96 java_lang_Class::create_mirror(k, Handle(NULL), CHECK); |
0 | 97 } |
98 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
99 GrowableArray<Klass*>* ArrayKlass::compute_secondary_supers(int num_extra_slots) { |
0 | 100 // interfaces = { cloneable_klass, serializable_klass }; |
101 assert(num_extra_slots == 0, "sanity of primitive array type"); | |
102 // Must share this for correct bootstrapping! | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
103 set_secondary_supers(Universe::the_array_interfaces_array()); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
104 return NULL; |
0 | 105 } |
106 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
107 bool ArrayKlass::compute_is_subtype_of(Klass* k) { |
0 | 108 // An array is a subtype of Serializable, Clonable, and Object |
1142 | 109 return k == SystemDictionary::Object_klass() |
110 || k == SystemDictionary::Cloneable_klass() | |
111 || k == SystemDictionary::Serializable_klass(); | |
0 | 112 } |
113 | |
114 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
115 inline intptr_t* ArrayKlass::start_of_vtable() const { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
116 // all vtables start at the same place, that's why we use InstanceKlass::header_size here |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
117 return ((intptr_t*)this) + InstanceKlass::header_size(); |
0 | 118 } |
119 | |
120 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
121 klassVtable* ArrayKlass::vtable() const { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
122 KlassHandle kh(Thread::current(), this); |
0 | 123 return new klassVtable(kh, start_of_vtable(), vtable_length() / vtableEntry::size()); |
124 } | |
125 | |
126 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
127 objArrayOop ArrayKlass::allocate_arrayArray(int n, int length, TRAPS) { |
0 | 128 if (length < 0) { |
129 THROW_0(vmSymbols::java_lang_NegativeArraySizeException()); | |
130 } | |
131 if (length > arrayOopDesc::max_array_length(T_ARRAY)) { | |
876
1413494da700
6850957: Honor -XX:OnOutOfMemoryError when array size exceeds VM limit
martin
parents:
0
diff
changeset
|
132 report_java_out_of_memory("Requested array size exceeds VM limit"); |
5935
a735aec54ea4
7123170: JCK vm/jvmti/ResourceExhausted/resexh001/resexh00101/ tests fails since 7u4 b02
sspitsyn
parents:
2426
diff
changeset
|
133 JvmtiExport::post_array_size_exhausted(); |
0 | 134 THROW_OOP_0(Universe::out_of_memory_error_array_size()); |
135 } | |
136 int size = objArrayOopDesc::object_size(length); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
137 Klass* k = array_klass(n+dimension(), CHECK_0); |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
138 ArrayKlass* ak = ArrayKlass::cast(k); |
0 | 139 objArrayOop o = |
140 (objArrayOop)CollectedHeap::array_allocate(ak, size, length, CHECK_0); | |
141 // initialization to NULL not necessary, area already cleared | |
142 return o; | |
143 } | |
144 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
145 void ArrayKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
146 Klass* k = this; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
147 // Iterate over this array klass and all higher dimensions |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
148 while (k != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
149 f(k, CHECK); |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
150 k = ArrayKlass::cast(k)->higher_dimension(); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
151 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
152 } |
0 | 153 |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
154 void ArrayKlass::array_klasses_do(void f(Klass* k)) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
155 Klass* k = this; |
0 | 156 // Iterate over this array klass and all higher dimensions |
157 while (k != NULL) { | |
158 f(k); | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
159 k = ArrayKlass::cast(k)->higher_dimension(); |
0 | 160 } |
161 } | |
162 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
163 // GC support |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
164 |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
165 void ArrayKlass::oops_do(OopClosure* cl) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
166 Klass::oops_do(cl); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
167 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
168 cl->do_oop(adr_component_mirror()); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
169 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
170 |
0 | 171 // JVM support |
172 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
173 jint ArrayKlass::compute_modifier_flags(TRAPS) const { |
0 | 174 return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC; |
175 } | |
176 | |
177 // JVMTI support | |
178 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
179 jint ArrayKlass::jvmti_class_status() const { |
0 | 180 return JVMTI_CLASS_STATUS_ARRAY; |
181 } | |
182 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
183 void ArrayKlass::remove_unshareable_info() { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
184 Klass::remove_unshareable_info(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
185 // Clear the java mirror |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
186 set_component_mirror(NULL); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
187 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
188 |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
189 void ArrayKlass::restore_unshareable_info(TRAPS) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
190 Klass::restore_unshareable_info(CHECK); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
191 // Klass recreates the component mirror also |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
192 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
193 |
0 | 194 // Printing |
195 | |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
196 void ArrayKlass::print_on(outputStream* st) const { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
197 assert(is_klass(), "must be klass"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
198 Klass::print_on(st); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
199 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
200 |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
201 void ArrayKlass::print_value_on(outputStream* st) const { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
202 assert(is_klass(), "must be klass"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
203 for(int index = 0; index < dimension(); index++) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
204 st->print("[]"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
205 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
206 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
207 |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
208 void ArrayKlass::oop_print_on(oop obj, outputStream* st) { |
0 | 209 assert(obj->is_array(), "must be array"); |
210 Klass::oop_print_on(obj, st); | |
211 st->print_cr(" - length: %d", arrayOop(obj)->length()); | |
212 } | |
213 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
214 |
0 | 215 // Verification |
216 | |
14378
48314d596a04
8027146: Class loading verification failure if GC occurs in Universe::flush_dependents_on
coleenp
parents:
14223
diff
changeset
|
217 void ArrayKlass::verify_on(outputStream* st) { |
48314d596a04
8027146: Class loading verification failure if GC occurs in Universe::flush_dependents_on
coleenp
parents:
14223
diff
changeset
|
218 Klass::verify_on(st); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
219 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
220 if (component_mirror() != NULL) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
221 guarantee(component_mirror()->klass() != NULL, "should have a class"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
222 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
223 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5935
diff
changeset
|
224 |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
225 void ArrayKlass::oop_verify_on(oop obj, outputStream* st) { |
0 | 226 guarantee(obj->is_array(), "must be array"); |
227 arrayOop a = arrayOop(obj); | |
228 guarantee(a->length() >= 0, "array with negative length?"); | |
229 } |