Mercurial > hg > truffle
annotate src/share/vm/ci/ciInstanceKlass.hpp @ 17716:cdb71841f4bc
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 | 55fb97c4c58d |
children | d8041d695d19 |
rev | line source |
---|---|
0 | 1 /* |
17467
55fb97c4c58d
8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents:
13021
diff
changeset
|
2 * Copyright (c) 1999, 2013, 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:
1138
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1138
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:
1138
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_CI_CIINSTANCEKLASS_HPP |
26 #define SHARE_VM_CI_CIINSTANCEKLASS_HPP | |
27 | |
28 #include "ci/ciConstantPoolCache.hpp" | |
29 #include "ci/ciFlags.hpp" | |
30 #include "ci/ciKlass.hpp" | |
31 #include "ci/ciSymbol.hpp" | |
32 | |
0 | 33 // ciInstanceKlass |
34 // | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
35 // This class represents a Klass* in the HotSpot virtual machine |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
36 // whose Klass part is an InstanceKlass. It may or may not |
0 | 37 // be loaded. |
38 class ciInstanceKlass : public ciKlass { | |
39 CI_PACKAGE_ACCESS | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
40 friend class ciBytecodeStream; |
0 | 41 friend class ciEnv; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
42 friend class ciExceptionHandler; |
0 | 43 friend class ciMethod; |
44 friend class ciField; | |
45 | |
46 private: | |
47 jobject _loader; | |
48 jobject _protection_domain; | |
49 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
50 InstanceKlass::ClassState _init_state; // state of class |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
51 bool _is_shared; |
0 | 52 bool _has_finalizer; |
53 bool _has_subklass; | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
54 bool _has_nonstatic_fields; |
13021
4d3575d37a07
8026735: Stream tests throw java.lang.IncompatibleClassChangeError
iveresov
parents:
12875
diff
changeset
|
55 bool _has_default_methods; |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
56 |
0 | 57 ciFlags _flags; |
58 jint _nonstatic_field_size; | |
44
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
59 jint _nonstatic_oop_map_size; |
0 | 60 |
61 // Lazy fields get filled in only upon request. | |
62 ciInstanceKlass* _super; | |
63 ciInstance* _java_mirror; | |
64 | |
65 ciConstantPoolCache* _field_cache; // cached map index->field | |
66 GrowableArray<ciField*>* _nonstatic_fields; | |
67 | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
68 // The possible values of the _implementor fall into following three cases: |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
69 // NULL: no implementor. |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
70 // A ciInstanceKlass that's not itself: one implementor. |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
71 // Itsef: more than one implementors. |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
72 ciInstanceKlass* _implementor; |
0 | 73 |
44
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
74 GrowableArray<ciField*>* _non_static_fields; |
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
75 |
0 | 76 protected: |
77 ciInstanceKlass(KlassHandle h_k); | |
78 ciInstanceKlass(ciSymbol* name, jobject loader, jobject protection_domain); | |
79 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
80 InstanceKlass* get_instanceKlass() const { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
81 return (InstanceKlass*)get_Klass(); |
0 | 82 } |
83 | |
84 oop loader(); | |
85 jobject loader_handle(); | |
86 | |
87 oop protection_domain(); | |
88 jobject protection_domain_handle(); | |
89 | |
90 const char* type_string() { return "ciInstanceKlass"; } | |
91 | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
92 bool is_in_package_impl(const char* packagename, int len); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
93 |
0 | 94 void print_impl(outputStream* st); |
95 | |
96 ciConstantPoolCache* field_cache(); | |
97 | |
98 bool is_shared() { return _is_shared; } | |
99 | |
1645
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
100 void compute_shared_init_state(); |
0 | 101 bool compute_shared_has_subklass(); |
102 int compute_nonstatic_fields(); | |
103 GrowableArray<ciField*>* compute_nonstatic_fields_impl(GrowableArray<ciField*>* super_fields); | |
104 | |
1645
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
105 // Update the init_state for shared klasses |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
106 void update_if_shared(InstanceKlass::ClassState expected) { |
1645
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
107 if (_is_shared && _init_state != expected) { |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
108 if (is_loaded()) compute_shared_init_state(); |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
109 } |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
110 } |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
111 |
0 | 112 public: |
113 // Has this klass been initialized? | |
114 bool is_initialized() { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
115 update_if_shared(InstanceKlass::fully_initialized); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
116 return _init_state == InstanceKlass::fully_initialized; |
1645
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
117 } |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
118 // Is this klass being initialized? |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
119 bool is_being_initialized() { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
120 update_if_shared(InstanceKlass::being_initialized); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
121 return _init_state == InstanceKlass::being_initialized; |
0 | 122 } |
123 // Has this klass been linked? | |
124 bool is_linked() { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
125 update_if_shared(InstanceKlass::linked); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
126 return _init_state >= InstanceKlass::linked; |
0 | 127 } |
128 | |
129 // General klass information. | |
130 ciFlags flags() { | |
131 assert(is_loaded(), "must be loaded"); | |
132 return _flags; | |
133 } | |
134 bool has_finalizer() { | |
135 assert(is_loaded(), "must be loaded"); | |
136 return _has_finalizer; } | |
137 bool has_subklass() { | |
138 assert(is_loaded(), "must be loaded"); | |
139 if (_is_shared && !_has_subklass) { | |
140 if (flags().is_final()) { | |
141 return false; | |
142 } else { | |
143 return compute_shared_has_subklass(); | |
144 } | |
145 } | |
146 return _has_subklass; | |
147 } | |
148 jint size_helper() { | |
149 return (Klass::layout_helper_size_in_bytes(layout_helper()) | |
150 >> LogHeapWordSize); | |
151 } | |
152 jint nonstatic_field_size() { | |
153 assert(is_loaded(), "must be loaded"); | |
154 return _nonstatic_field_size; } | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
155 jint has_nonstatic_fields() { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
156 assert(is_loaded(), "must be loaded"); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
157 return _has_nonstatic_fields; } |
44
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
158 jint nonstatic_oop_map_size() { |
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
159 assert(is_loaded(), "must be loaded"); |
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
160 return _nonstatic_oop_map_size; } |
0 | 161 ciInstanceKlass* super(); |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
162 jint nof_implementors() { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
163 ciInstanceKlass* impl; |
0 | 164 assert(is_loaded(), "must be loaded"); |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
165 impl = implementor(); |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
166 if (impl == NULL) { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
167 return 0; |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
168 } else if (impl != this) { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
169 return 1; |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
170 } else { |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
171 return 2; |
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
172 } |
0 | 173 } |
174 | |
13021
4d3575d37a07
8026735: Stream tests throw java.lang.IncompatibleClassChangeError
iveresov
parents:
12875
diff
changeset
|
175 bool has_default_methods() { |
4d3575d37a07
8026735: Stream tests throw java.lang.IncompatibleClassChangeError
iveresov
parents:
12875
diff
changeset
|
176 assert(is_loaded(), "must be loaded"); |
4d3575d37a07
8026735: Stream tests throw java.lang.IncompatibleClassChangeError
iveresov
parents:
12875
diff
changeset
|
177 return _has_default_methods; |
4d3575d37a07
8026735: Stream tests throw java.lang.IncompatibleClassChangeError
iveresov
parents:
12875
diff
changeset
|
178 } |
4d3575d37a07
8026735: Stream tests throw java.lang.IncompatibleClassChangeError
iveresov
parents:
12875
diff
changeset
|
179 |
0 | 180 ciInstanceKlass* get_canonical_holder(int offset); |
181 ciField* get_field_by_offset(int field_offset, bool is_static); | |
1080
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
196
diff
changeset
|
182 ciField* get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static); |
44
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
183 |
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
184 GrowableArray<ciField*>* non_static_fields(); |
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
185 |
0 | 186 // total number of nonstatic fields (including inherited): |
187 int nof_nonstatic_fields() { | |
188 if (_nonstatic_fields == NULL) | |
189 return compute_nonstatic_fields(); | |
190 else | |
191 return _nonstatic_fields->length(); | |
192 } | |
193 // nth nonstatic field (presented by ascending address) | |
194 ciField* nonstatic_field_at(int i) { | |
195 assert(_nonstatic_fields != NULL, ""); | |
196 return _nonstatic_fields->at(i); | |
197 } | |
198 | |
199 ciInstanceKlass* unique_concrete_subklass(); | |
200 bool has_finalizable_subclass(); | |
201 | |
202 bool contains_field_offset(int offset) { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
203 return instanceOopDesc::contains_field_offset(offset, nonstatic_field_size()); |
0 | 204 } |
205 | |
206 // Get the instance of java.lang.Class corresponding to | |
207 // this klass. This instance is used for locking of | |
208 // synchronized static methods of this klass. | |
209 ciInstance* java_mirror(); | |
210 | |
211 // Java access flags | |
212 bool is_public () { return flags().is_public(); } | |
213 bool is_final () { return flags().is_final(); } | |
214 bool is_super () { return flags().is_super(); } | |
215 bool is_interface () { return flags().is_interface(); } | |
216 bool is_abstract () { return flags().is_abstract(); } | |
217 | |
218 ciMethod* find_method(ciSymbol* name, ciSymbol* signature); | |
219 // Note: To find a method from name and type strings, use ciSymbol::make, | |
220 // but consider adding to vmSymbols.hpp instead. | |
221 | |
222 bool is_leaf_type(); | |
5998
49036505ab5f
7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents:
1972
diff
changeset
|
223 ciInstanceKlass* implementor(); |
0 | 224 |
225 // Is the defining class loader of this class the default loader? | |
10278 | 226 bool uses_default_loader() const; |
0 | 227 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
228 bool is_java_lang_Object() const; |
0 | 229 |
10278 | 230 BasicType box_klass_type() const; |
231 bool is_box_klass() const; | |
232 bool is_boxed_value_offset(int offset) const; | |
233 | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
234 // Is this klass in the given package? |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
235 bool is_in_package(const char* packagename) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
236 return is_in_package(packagename, (int) strlen(packagename)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
237 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
238 bool is_in_package(const char* packagename, int len); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
239 |
0 | 240 // What kind of ciObject is this? |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
241 bool is_instance_klass() const { return true; } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
5998
diff
changeset
|
242 bool is_java_klass() const { return true; } |
6972
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
243 |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
10278
diff
changeset
|
244 virtual ciKlass* exact_klass() { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
10278
diff
changeset
|
245 if (is_loaded() && is_final() && !is_interface()) { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
10278
diff
changeset
|
246 return this; |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
10278
diff
changeset
|
247 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
10278
diff
changeset
|
248 return NULL; |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
10278
diff
changeset
|
249 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
10278
diff
changeset
|
250 |
6972
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
251 // Dump the current state of this klass for compilation replay. |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
252 virtual void dump_replay_data(outputStream* out); |
0 | 253 }; |
1972 | 254 |
255 #endif // SHARE_VM_CI_CIINSTANCEKLASS_HPP |