Mercurial > hg > graal-compiler
annotate src/share/vm/interpreter/interpreterRuntime.hpp @ 3992:d1bdeef3e3e2
7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76
Summary: There is a race between one thread successfully forwarding and copying the klass mirror for the SoftReference class (including the static master clock) and another thread attempting to use the master clock while attempting to discover a soft reference object. Maintain a shadow copy of the soft reference master clock and use the shadow during reference discovery and reference processing.
Reviewed-by: tonyp, brutisso, ysr
author | johnc |
---|---|
date | Wed, 12 Oct 2011 10:25:51 -0700 |
parents | f08d439fab8c |
children | 1d7922586cf6 |
rev | line source |
---|---|
0 | 1 /* |
2142 | 2 * Copyright (c) 1997, 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:
1059
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1059
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:
1059
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_INTERPRETER_INTERPRETERRUNTIME_HPP |
26 #define SHARE_VM_INTERPRETER_INTERPRETERRUNTIME_HPP | |
27 | |
28 #include "interpreter/bytecode.hpp" | |
29 #include "interpreter/linkResolver.hpp" | |
30 #include "memory/universe.hpp" | |
31 #include "oops/methodOop.hpp" | |
32 #include "runtime/frame.inline.hpp" | |
33 #include "runtime/signature.hpp" | |
34 #include "utilities/top.hpp" | |
35 #ifdef TARGET_OS_FAMILY_linux | |
36 # include "thread_linux.inline.hpp" | |
37 #endif | |
38 #ifdef TARGET_OS_FAMILY_solaris | |
39 # include "thread_solaris.inline.hpp" | |
40 #endif | |
41 #ifdef TARGET_OS_FAMILY_windows | |
42 # include "thread_windows.inline.hpp" | |
43 #endif | |
3960 | 44 #ifdef TARGET_OS_FAMILY_bsd |
45 # include "thread_bsd.inline.hpp" | |
46 #endif | |
1972 | 47 |
0 | 48 // The InterpreterRuntime is called by the interpreter for everything |
49 // that cannot/should not be dealt with in assembly and needs C support. | |
50 | |
51 class InterpreterRuntime: AllStatic { | |
52 friend class BytecodeClosure; // for method and bcp | |
53 friend class PrintingClosure; // for method and bcp | |
54 | |
55 private: | |
56 // Helper functions to access current interpreter state | |
57 static frame last_frame(JavaThread *thread) { return thread->last_frame(); } | |
58 static methodOop method(JavaThread *thread) { return last_frame(thread).interpreter_frame_method(); } | |
59 static address bcp(JavaThread *thread) { return last_frame(thread).interpreter_frame_bcp(); } | |
1602 | 60 static int bci(JavaThread *thread) { return last_frame(thread).interpreter_frame_bci(); } |
0 | 61 static void set_bcp_and_mdp(address bcp, JavaThread*thread); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
62 static Bytecodes::Code code(JavaThread *thread) { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
63 // pass method to avoid calling unsafe bcp_to_method (partial fix 4926272) |
2142 | 64 return Bytecodes::code_at(method(thread), bcp(thread)); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
65 } |
0 | 66 static bool already_resolved(JavaThread *thread) { return cache_entry(thread)->is_resolved(code(thread)); } |
2142 | 67 static Bytecode bytecode(JavaThread *thread) { return Bytecode(method(thread), bcp(thread)); } |
1565 | 68 static int get_index_u1(JavaThread *thread, Bytecodes::Code bc) |
2142 | 69 { return bytecode(thread).get_index_u1(bc); } |
1565 | 70 static int get_index_u2(JavaThread *thread, Bytecodes::Code bc) |
2142 | 71 { return bytecode(thread).get_index_u2(bc); } |
1565 | 72 static int get_index_u2_cpcache(JavaThread *thread, Bytecodes::Code bc) |
2142 | 73 { return bytecode(thread).get_index_u2_cpcache(bc); } |
0 | 74 static int number_of_dimensions(JavaThread *thread) { return bcp(thread)[3]; } |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
75 |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
76 static ConstantPoolCacheEntry* cache_entry_at(JavaThread *thread, int i) { return method(thread)->constants()->cache()->entry_at(i); } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
77 static ConstantPoolCacheEntry* cache_entry(JavaThread *thread) { return cache_entry_at(thread, Bytes::get_native_u2(bcp(thread) + 1)); } |
0 | 78 static void note_trap(JavaThread *thread, int reason, TRAPS); |
79 | |
941 | 80 // Inner work method for Interpreter's frequency counter overflow |
81 static nmethod* frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp); | |
82 | |
0 | 83 public: |
84 // Constants | |
85 static void ldc (JavaThread* thread, bool wide); | |
1602 | 86 static void resolve_ldc (JavaThread* thread, Bytecodes::Code bytecode); |
0 | 87 |
88 // Allocation | |
89 static void _new (JavaThread* thread, constantPoolOopDesc* pool, int index); | |
90 static void newarray (JavaThread* thread, BasicType type, jint size); | |
91 static void anewarray (JavaThread* thread, constantPoolOopDesc* pool, int index, jint size); | |
92 static void multianewarray(JavaThread* thread, jint* first_size_address); | |
93 static void register_finalizer(JavaThread* thread, oopDesc* obj); | |
94 | |
95 // Quicken instance-of and check-cast bytecodes | |
96 static void quicken_io_cc(JavaThread* thread); | |
97 | |
98 // Exceptions thrown by the interpreter | |
99 static void throw_AbstractMethodError(JavaThread* thread); | |
100 static void throw_IncompatibleClassChangeError(JavaThread* thread); | |
101 static void throw_StackOverflowError(JavaThread* thread); | |
102 static void throw_ArrayIndexOutOfBoundsException(JavaThread* thread, char* name, jint index); | |
103 static void throw_ClassCastException(JavaThread* thread, oopDesc* obj); | |
104 static void create_exception(JavaThread* thread, char* name, char* message); | |
105 static void create_klass_exception(JavaThread* thread, char* name, oopDesc* obj); | |
106 static address exception_handler_for_exception(JavaThread* thread, oopDesc* exception); | |
107 static void throw_pending_exception(JavaThread* thread); | |
108 | |
109 // Statics & fields | |
110 static void resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode); | |
111 | |
112 // Synchronization | |
113 static void monitorenter(JavaThread* thread, BasicObjectLock* elem); | |
114 static void monitorexit (JavaThread* thread, BasicObjectLock* elem); | |
115 | |
116 static void throw_illegal_monitor_state_exception(JavaThread* thread); | |
117 static void new_illegal_monitor_state_exception(JavaThread* thread); | |
118 | |
119 // Calls | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
120 static void resolve_invoke (JavaThread* thread, Bytecodes::Code bytecode); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
121 static void resolve_invokedynamic(JavaThread* thread); |
0 | 122 |
123 // Breakpoints | |
124 static void _breakpoint(JavaThread* thread, methodOopDesc* method, address bcp); | |
125 static Bytecodes::Code get_original_bytecode_at(JavaThread* thread, methodOopDesc* method, address bcp); | |
126 static void set_original_bytecode_at(JavaThread* thread, methodOopDesc* method, address bcp, Bytecodes::Code new_code); | |
127 static bool is_breakpoint(JavaThread *thread) { return Bytecodes::code_or_bp_at(bcp(thread)) == Bytecodes::_breakpoint; } | |
128 | |
129 // Safepoints | |
130 static void at_safepoint(JavaThread* thread); | |
131 | |
132 // Debugger support | |
133 static void post_field_access(JavaThread *thread, oopDesc* obj, | |
134 ConstantPoolCacheEntry *cp_entry); | |
135 static void post_field_modification(JavaThread *thread, oopDesc* obj, | |
136 ConstantPoolCacheEntry *cp_entry, jvalue *value); | |
137 static void post_method_entry(JavaThread *thread); | |
138 static void post_method_exit (JavaThread *thread); | |
139 static int interpreter_contains(address pc); | |
140 | |
141 // Native signature handlers | |
142 static void prepare_native_call(JavaThread* thread, methodOopDesc* method); | |
143 static address slow_signature_handler(JavaThread* thread, | |
144 methodOopDesc* method, | |
145 intptr_t* from, intptr_t* to); | |
146 | |
3911
2fecca53a2c6
7085012: ARM: com/sun/jdi/PopSynchronousTest.java still fails
roland
parents:
3781
diff
changeset
|
147 #if defined(IA32) || defined(AMD64) || defined(ARM) |
2fecca53a2c6
7085012: ARM: com/sun/jdi/PopSynchronousTest.java still fails
roland
parents:
3781
diff
changeset
|
148 // Popframe support (only needed on x86, AMD64 and ARM) |
0 | 149 static void popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address); |
150 #endif | |
151 | |
152 // Platform dependent stuff | |
1972 | 153 #ifdef TARGET_ARCH_x86 |
154 # include "interpreterRT_x86.hpp" | |
155 #endif | |
156 #ifdef TARGET_ARCH_sparc | |
157 # include "interpreterRT_sparc.hpp" | |
158 #endif | |
159 #ifdef TARGET_ARCH_zero | |
160 # include "interpreterRT_zero.hpp" | |
161 #endif | |
2192
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
162 #ifdef TARGET_ARCH_arm |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
163 # include "interpreterRT_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
164 #endif |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
165 #ifdef TARGET_ARCH_ppc |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
166 # include "interpreterRT_ppc.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2144
diff
changeset
|
167 #endif |
1972 | 168 |
0 | 169 |
170 // Interpreter's frequency counter overflow | |
171 static nmethod* frequency_counter_overflow(JavaThread* thread, address branch_bcp); | |
172 | |
173 // Interpreter profiling support | |
174 static jint bcp_to_di(methodOopDesc* method, address cur_bcp); | |
2118
dd031b2226de
4930919: race condition in MDO creation at back branch locations
iveresov
parents:
1972
diff
changeset
|
175 static void profile_method(JavaThread* thread); |
0 | 176 static void update_mdp_for_ret(JavaThread* thread, int bci); |
177 #ifdef ASSERT | |
178 static void verify_mdp(methodOopDesc* method, address bcp, address mdp); | |
179 #endif // ASSERT | |
180 }; | |
181 | |
182 | |
183 class SignatureHandlerLibrary: public AllStatic { | |
184 public: | |
185 enum { buffer_size = 1*K }; // the size of the temporary code buffer | |
186 enum { blob_size = 32*K }; // the size of a handler code blob. | |
187 | |
188 private: | |
189 static BufferBlob* _handler_blob; // the current buffer blob containing the generated handlers | |
190 static address _handler; // next available address within _handler_blob; | |
191 static GrowableArray<uint64_t>* _fingerprints; // the fingerprint collection | |
192 static GrowableArray<address>* _handlers; // the corresponding handlers | |
193 static address _buffer; // the temporary code buffer | |
194 | |
195 static address set_handler_blob(); | |
196 static void initialize(); | |
197 static address set_handler(CodeBuffer* buffer); | |
198 static void pd_set_handler(address handler); | |
199 | |
200 public: | |
201 static void add(methodHandle method); | |
202 }; | |
1972 | 203 |
204 #endif // SHARE_VM_INTERPRETER_INTERPRETERRUNTIME_HPP |