Mercurial > hg > truffle
annotate src/share/vm/ci/ciObject.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 | bd7a7ce2e264 |
children | 2cb439954abf |
rev | line source |
---|---|
0 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
2 * Copyright (c) 1999, 2012, 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_CIOBJECT_HPP |
26 #define SHARE_VM_CI_CIOBJECT_HPP | |
27 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
28 #include "ci/ciBaseObject.hpp" |
1972 | 29 #include "ci/ciClassList.hpp" |
30 #include "memory/allocation.hpp" | |
31 #include "runtime/handles.hpp" | |
32 #include "runtime/jniHandles.hpp" | |
33 | |
0 | 34 // ciObject |
35 // | |
36 // This class represents an oop in the HotSpot virtual machine. | |
37 // Its subclasses are structured in a hierarchy which mirrors | |
38 // an aggregate of the VM's oop and klass hierarchies (see | |
39 // oopHierarchy.hpp). Each instance of ciObject holds a handle | |
40 // to a corresponding oop on the VM side and provides routines | |
41 // for accessing the information in its oop. By using the ciObject | |
42 // hierarchy for accessing oops in the VM, the compiler ensures | |
43 // that it is safe with respect to garbage collection; that is, | |
44 // GC and compilation can proceed independently without | |
45 // interference. | |
46 // | |
47 // Within the VM, the oop and klass hierarchies are separate. | |
48 // The compiler interface does not preserve this separation -- | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
49 // the distinction between `Klass*' and `Klass' are not |
0 | 50 // reflected in the interface and instead the Klass hierarchy |
51 // is directly modeled as the subclasses of ciKlass. | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
52 class ciObject : public ciBaseObject { |
0 | 53 CI_PACKAGE_ACCESS |
54 friend class ciEnv; | |
55 | |
56 private: | |
57 // A JNI handle referring to an oop in the VM. This | |
58 // handle may, in a small set of cases, correctly be NULL. | |
59 jobject _handle; | |
60 ciKlass* _klass; | |
61 | |
62 protected: | |
63 ciObject(); | |
64 ciObject(oop o); | |
65 ciObject(Handle h); | |
66 ciObject(ciKlass* klass); | |
67 | |
68 jobject handle() const { return _handle; } | |
69 // Get the VM oop that this object holds. | |
70 oop get_oop() const { | |
71 assert(_handle != NULL, "null oop"); | |
72 return JNIHandles::resolve_non_null(_handle); | |
73 } | |
74 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
75 void init_flags_from(oop x); |
0 | 76 |
77 // Virtual behavior of the print() method. | |
78 virtual void print_impl(outputStream* st) {} | |
79 | |
80 virtual const char* type_string() { return "ciObject"; } | |
81 | |
82 public: | |
83 // The klass of this ciObject. | |
84 ciKlass* klass(); | |
85 | |
86 // Are two ciObjects equal? | |
87 bool equals(ciObject* obj); | |
88 | |
89 // A hash value for the convenience of compilers. | |
90 int hash(); | |
91 | |
989 | 92 // Tells if this oop has an encoding as a constant. |
3402
28a9fe9534ea
7048030: is_scavengable changes causing compiler to embed more constants
kvn
parents:
2426
diff
changeset
|
93 // True if is_perm is true. |
989 | 94 // Also true if ScavengeRootsInCode is non-zero. |
0 | 95 // If it does not have an encoding, the compiler is responsible for |
96 // making other arrangements for dealing with the oop. | |
989 | 97 // See ciEnv::make_array |
98 bool can_be_constant(); | |
99 | |
100 // Tells if this oop should be made a constant. | |
3402
28a9fe9534ea
7048030: is_scavengable changes causing compiler to embed more constants
kvn
parents:
2426
diff
changeset
|
101 // True if is_perm is true or ScavengeRootsInCode > 1. |
989 | 102 bool should_be_constant(); |
0 | 103 |
989 | 104 // Might this object possibly move during a scavenge operation? |
105 // If the answer is true and ScavengeRootsInCode==0, the oop cannot be embedded in code. | |
106 bool is_scavengable() { return (_ident & SCAVENGABLE_FLAG) != 0; } | |
107 | |
0 | 108 // The address which the compiler should embed into the |
109 // generated code to represent this oop. This address | |
110 // is not the true address of the oop -- it will get patched | |
111 // during nmethod creation. | |
112 // | |
113 // Usage note: no address arithmetic allowed. Oop must | |
114 // be registered with the oopRecorder. | |
989 | 115 jobject constant_encoding(); |
0 | 116 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
117 virtual bool is_object() const { return true; } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
118 |
0 | 119 // What kind of ciObject is this? |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3402
diff
changeset
|
120 virtual bool is_null_object() const { return false; } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3402
diff
changeset
|
121 virtual bool is_call_site() const { return false; } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3402
diff
changeset
|
122 virtual bool is_cpcache() const { return false; } |
0 | 123 virtual bool is_instance() { return false; } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3402
diff
changeset
|
124 virtual bool is_member_name() const { return false; } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3402
diff
changeset
|
125 virtual bool is_method_handle() const { return false; } |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
126 virtual bool is_method_type() const { return false; } |
0 | 127 virtual bool is_array() { return false; } |
128 virtual bool is_obj_array() { return false; } | |
129 virtual bool is_type_array() { return false; } | |
130 | |
131 // Is this a type or value which has no associated class? | |
132 // It is true of primitive types and null objects. | |
133 virtual bool is_classless() const { return false; } | |
6972
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6822
diff
changeset
|
134 virtual void dump_replay_data(outputStream* st) { /* do nothing */ } |
0 | 135 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
136 // Note: some ciObjects refer to oops which have yet to be created. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
137 // We refer to these as "unloaded". Specifically, there are |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
138 // unloaded instances of java.lang.Class, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
139 // java.lang.invoke.MethodHandle, and java.lang.invoke.MethodType. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
140 // By convention the ciNullObject is considered loaded, and |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
141 // primitive types are considered loaded. |
0 | 142 bool is_loaded() const { |
143 return handle() != NULL || is_classless(); | |
144 } | |
145 | |
146 // Subclass casting with assertions. | |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
147 ciNullObject* as_null_object() { |
0 | 148 assert(is_null_object(), "bad cast"); |
149 return (ciNullObject*)this; | |
150 } | |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
151 ciCallSite* as_call_site() { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
152 assert(is_call_site(), "bad cast"); |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
153 return (ciCallSite*)this; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
154 } |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
155 ciInstance* as_instance() { |
0 | 156 assert(is_instance(), "bad cast"); |
157 return (ciInstance*)this; | |
158 } | |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
159 ciMemberName* as_member_name() { |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3402
diff
changeset
|
160 assert(is_member_name(), "bad cast"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3402
diff
changeset
|
161 return (ciMemberName*)this; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3402
diff
changeset
|
162 } |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
163 ciMethodHandle* as_method_handle() { |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
164 assert(is_method_handle(), "bad cast"); |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
165 return (ciMethodHandle*)this; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1137
diff
changeset
|
166 } |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
167 ciMethodType* as_method_type() { |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
168 assert(is_method_type(), "bad cast"); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
169 return (ciMethodType*)this; |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
170 } |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
171 ciArray* as_array() { |
0 | 172 assert(is_array(), "bad cast"); |
173 return (ciArray*)this; | |
174 } | |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
175 ciObjArray* as_obj_array() { |
0 | 176 assert(is_obj_array(), "bad cast"); |
177 return (ciObjArray*)this; | |
178 } | |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
6725
diff
changeset
|
179 ciTypeArray* as_type_array() { |
0 | 180 assert(is_type_array(), "bad cast"); |
181 return (ciTypeArray*)this; | |
182 } | |
183 | |
184 // Print debugging output about this ciObject. | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3402
diff
changeset
|
185 void print(outputStream* st); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3402
diff
changeset
|
186 void print() { print(tty); } // GDB cannot handle default arguments |
0 | 187 |
188 // Print debugging output about the oop this ciObject represents. | |
189 void print_oop(outputStream* st = tty); | |
190 }; | |
1972 | 191 |
192 #endif // SHARE_VM_CI_CIOBJECT_HPP |