Mercurial > hg > truffle
annotate src/share/vm/ci/ciSignature.cpp @ 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 | f6b0eb4e44cf |
children | 78bbf4d43a14 |
rev | line source |
---|---|
0 | 1 /* |
2426
1d1603768966
7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents:
2177
diff
changeset
|
2 * Copyright (c) 1999, 2011, 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:
0
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
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:
0
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
26 #include "ci/ciMethodType.hpp" |
1972 | 27 #include "ci/ciSignature.hpp" |
28 #include "ci/ciUtilities.hpp" | |
29 #include "memory/allocation.inline.hpp" | |
30 #include "oops/oop.inline.hpp" | |
31 #include "runtime/signature.hpp" | |
0 | 32 |
33 // ciSignature | |
34 // | |
35 // This class represents the signature of a method. | |
36 | |
37 // ------------------------------------------------------------------ | |
38 // ciSignature::ciSignature | |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
2426
diff
changeset
|
39 ciSignature::ciSignature(ciKlass* accessing_klass, constantPoolHandle cpool, ciSymbol* symbol) { |
0 | 40 ASSERT_IN_VM; |
41 EXCEPTION_CONTEXT; | |
42 _accessing_klass = accessing_klass; | |
43 _symbol = symbol; | |
44 | |
45 ciEnv* env = CURRENT_ENV; | |
46 Arena* arena = env->arena(); | |
47 _types = new (arena) GrowableArray<ciType*>(arena, 8, 0, NULL); | |
48 | |
49 int size = 0; | |
50 int count = 0; | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
51 ResourceMark rm(THREAD); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
52 Symbol* sh = symbol->get_symbol(); |
0 | 53 SignatureStream ss(sh); |
54 for (; ; ss.next()) { | |
55 // Process one element of the signature | |
56 ciType* type; | |
57 if (!ss.is_object()) { | |
58 type = ciType::make(ss.type()); | |
59 } else { | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
60 Symbol* name = ss.as_symbol(THREAD); |
0 | 61 if (HAS_PENDING_EXCEPTION) { |
62 type = ss.is_array() ? (ciType*)ciEnv::unloaded_ciobjarrayklass() | |
63 : (ciType*)ciEnv::unloaded_ciinstance_klass(); | |
64 env->record_out_of_memory_failure(); | |
65 CLEAR_PENDING_EXCEPTION; | |
66 } else { | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
67 ciSymbol* klass_name = env->get_symbol(name); |
3785
ddd894528dbc
7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents:
2426
diff
changeset
|
68 type = env->get_klass_by_name_impl(_accessing_klass, cpool, klass_name, false); |
0 | 69 } |
70 } | |
71 _types->append(type); | |
72 if (ss.at_return_type()) { | |
73 // Done processing the return type; do not add it into the count. | |
74 break; | |
75 } | |
76 size += type->size(); | |
77 count++; | |
78 } | |
79 _size = size; | |
80 _count = count; | |
81 } | |
82 | |
83 // ------------------------------------------------------------------ | |
6822
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
84 // ciSignature::ciSignature |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
85 ciSignature::ciSignature(ciKlass* accessing_klass, ciSymbol* symbol, ciMethodType* method_type) : |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
86 _symbol(symbol), |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
87 _accessing_klass(accessing_klass), |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
88 _size( method_type->ptype_slot_count()), |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
89 _count(method_type->ptype_count()) |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
90 { |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
91 ASSERT_IN_VM; |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
92 EXCEPTION_CONTEXT; |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
93 Arena* arena = CURRENT_ENV->arena(); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
94 _types = new (arena) GrowableArray<ciType*>(arena, _count + 1, 0, NULL); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
95 for (int i = 0; i < _count; i++) { |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
96 _types->append(method_type->ptype_at(i)); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
97 } |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
98 _types->append(method_type->rtype()); |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
99 } |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
100 |
f6b0eb4e44cf
7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents:
4001
diff
changeset
|
101 // ------------------------------------------------------------------ |
4001
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
102 // ciSignature::return_type |
0 | 103 // |
104 // What is the return type of this signature? | |
105 ciType* ciSignature::return_type() const { | |
106 return _types->at(_count); | |
107 } | |
108 | |
109 // ------------------------------------------------------------------ | |
4001
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
110 // ciSignature::type_at |
0 | 111 // |
112 // What is the type of the index'th element of this | |
113 // signature? | |
114 ciType* ciSignature::type_at(int index) const { | |
115 assert(index < _count, "out of bounds"); | |
116 // The first _klasses element holds the return klass. | |
117 return _types->at(index); | |
118 } | |
119 | |
120 // ------------------------------------------------------------------ | |
4001
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
121 // ciSignature::equals |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
122 // |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
123 // Compare this signature to another one. Signatures with different |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
124 // accessing classes but with signature-types resolved to the same |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
125 // types are defined to be equal. |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
126 bool ciSignature::equals(ciSignature* that) { |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
127 // Compare signature |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
128 if (!this->as_symbol()->equals(that->as_symbol())) return false; |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
129 // Compare all types of the arguments |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
130 for (int i = 0; i < _count; i++) { |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
131 if (this->type_at(i) != that->type_at(i)) return false; |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
132 } |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
133 // Compare the return type |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
134 if (this->return_type() != that->return_type()) return false; |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
135 return true; |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
136 } |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
137 |
5eb9169b1a14
7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents:
3785
diff
changeset
|
138 // ------------------------------------------------------------------ |
0 | 139 // ciSignature::print_signature |
140 void ciSignature::print_signature() { | |
141 _symbol->print_symbol(); | |
142 } | |
143 | |
144 // ------------------------------------------------------------------ | |
145 // ciSignature::print | |
146 void ciSignature::print() { | |
147 tty->print("<ciSignature symbol="); | |
148 print_signature(); | |
149 tty->print(" accessing_klass="); | |
150 _accessing_klass->print(); | |
151 tty->print(" address=0x%x>", (address)this); | |
152 } |