annotate src/share/vm/runtime/interfaceSupport.hpp @ 2368:dde920245681

6896099: Integrate CMS heap ergo with default heap sizing ergo 6627787: CMS: JVM refuses to start up with -Xms16m -Xmx16m 7000125: CMS: Anti-monotone young gen sizing with respect to maximum whole heap size specification 7027529: CMS: retire CMSUseOldDefaults flag Summary: Simplify CMS heap sizing code, relying on ergonomic initial sizing consistent with other collectors for the most part, controlling only young gen sizing to rein in pause times. Make CMS young gen sizing default statically cpu-dependant. Remove inconsistencies wrt generation sizing and policy code, allowing for the fixing for 6627787 and 7000125. For 7027529, retire the flag CMSUseOldDefaults which had been introduced as a bridge from JDK 5 to JDK 6 a number of years ago. Reviewed-by: brutisso, poonam
author ysr
date Wed, 16 Mar 2011 10:37:08 -0700
parents 3582bf76420e
children 1d1603768966
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef SHARE_VM_RUNTIME_INTERFACESUPPORT_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_RUNTIME_INTERFACESUPPORT_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "memory/gcLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "runtime/orderAccess.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "runtime/os.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "runtime/safepoint.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "runtime/vmThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "utilities/globalDefinitions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #include "utilities/preserveException.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
39 # include "thread_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
40 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
41 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
42 # include "thread_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
43 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
44 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
45 # include "thread_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
46 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
47
0
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // Wrapper for all entry points to the virtual machine.
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // The HandleMarkCleaner is a faster version of HandleMark.
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // It relies on the fact that there is a HandleMark further
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // down the stack (in JavaCalls::call_helper), and just resets
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // to the saved values in that HandleMark.
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 class HandleMarkCleaner: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
56 Thread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
58 HandleMarkCleaner(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 _thread->last_handle_mark()->push();
a61af66fc99e Initial load
duke
parents:
diff changeset
61 }
a61af66fc99e Initial load
duke
parents:
diff changeset
62 ~HandleMarkCleaner() {
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _thread->last_handle_mark()->pop_and_restore();
a61af66fc99e Initial load
duke
parents:
diff changeset
64 }
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
67 inline void* operator new(size_t size, void* ptr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 return ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 }
a61af66fc99e Initial load
duke
parents:
diff changeset
70 };
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // InterfaceSupport provides functionality used by the __LEAF and __ENTRY
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // macros. These macros are used to guard entry points into the VM and
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // perform checks upon leave of the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 class InterfaceSupport: AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
78 # ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
79 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
80 static long _scavenge_alot_counter;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 static long _fullgc_alot_counter;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 static long _number_of_calls;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 static long _fullgc_alot_invocation;
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // tracing
a61af66fc99e Initial load
duke
parents:
diff changeset
86 static void trace(const char* result_type, const char* header);
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // Helper methods used to implement +ScavengeALot and +FullGCALot
a61af66fc99e Initial load
duke
parents:
diff changeset
89 static void check_gc_alot() { if (ScavengeALot || FullGCALot) gc_alot(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 static void gc_alot();
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 static void walk_stack_from(vframe* start_vf);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 static void walk_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 # ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
96 static void zap_dead_locals_old();
a61af66fc99e Initial load
duke
parents:
diff changeset
97 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 static void zombieAll();
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
100 static void unlinkSymbols();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101 static void deoptimizeAll();
a61af66fc99e Initial load
duke
parents:
diff changeset
102 static void stress_derived_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static void verify_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
104 static void verify_last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
105 # endif
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // OS dependent stuff
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
109 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
110 # include "interfaceSupport_linux.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
111 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
112 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
113 # include "interfaceSupport_solaris.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
114 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
115 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
116 # include "interfaceSupport_windows.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
117 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
118
0
a61af66fc99e Initial load
duke
parents:
diff changeset
119 };
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Basic class for all thread transition classes.
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 class ThreadStateTransition : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
126 JavaThread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
128 ThreadStateTransition(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 _thread = thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
130 assert(thread != NULL && thread->is_Java_thread(), "must be Java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // Change threadstate in a manner, so safepoint can detect changes.
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // Time-critical: called on exit from every runtime routine
a61af66fc99e Initial load
duke
parents:
diff changeset
135 static inline void transition(JavaThread *thread, JavaThreadState from, JavaThreadState to) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 assert(from != _thread_in_Java, "use transition_from_java");
a61af66fc99e Initial load
duke
parents:
diff changeset
137 assert(from != _thread_in_native, "use transition_from_native");
a61af66fc99e Initial load
duke
parents:
diff changeset
138 assert((from & 1) == 0 && (to & 1) == 0, "odd numbers are transitions states");
a61af66fc99e Initial load
duke
parents:
diff changeset
139 assert(thread->thread_state() == from, "coming from wrong thread state");
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // Change to transition state (assumes total store ordering! -Urs)
a61af66fc99e Initial load
duke
parents:
diff changeset
141 thread->set_thread_state((JavaThreadState)(from + 1));
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // Make sure new state is seen by VM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if (UseMembar) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Force a fence between the write above and read below
a61af66fc99e Initial load
duke
parents:
diff changeset
147 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
148 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // store to serialize page so VM thread can do pseudo remote membar
a61af66fc99e Initial load
duke
parents:
diff changeset
150 os::write_memory_serialize_page(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 if (SafepointSynchronize::do_call_back()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 SafepointSynchronize::block(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157 thread->set_thread_state(to);
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();)
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // transition_and_fence must be used on any thread state transition
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // where there might not be a Java call stub on the stack, in
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // particular on Windows where the Structured Exception Handler is
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // set up in the call stub. os::write_memory_serialize_page() can
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // fault and we can't recover from it on Windows without a SEH in
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // place.
a61af66fc99e Initial load
duke
parents:
diff changeset
168 static inline void transition_and_fence(JavaThread *thread, JavaThreadState from, JavaThreadState to) {
a61af66fc99e Initial load
duke
parents:
diff changeset
169 assert(thread->thread_state() == from, "coming from wrong thread state");
a61af66fc99e Initial load
duke
parents:
diff changeset
170 assert((from & 1) == 0 && (to & 1) == 0, "odd numbers are transitions states");
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // Change to transition state (assumes total store ordering! -Urs)
a61af66fc99e Initial load
duke
parents:
diff changeset
172 thread->set_thread_state((JavaThreadState)(from + 1));
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Make sure new state is seen by VM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
175 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 if (UseMembar) {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Force a fence between the write above and read below
a61af66fc99e Initial load
duke
parents:
diff changeset
178 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
179 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // Must use this rather than serialization page in particular on Windows
a61af66fc99e Initial load
duke
parents:
diff changeset
181 InterfaceSupport::serialize_memory(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 if (SafepointSynchronize::do_call_back()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 SafepointSynchronize::block(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188 thread->set_thread_state(to);
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();)
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // Same as above, but assumes from = _thread_in_Java. This is simpler, since we
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // never block on entry to the VM. This will break the code, since e.g. preserve arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // have not been setup.
a61af66fc99e Initial load
duke
parents:
diff changeset
196 static inline void transition_from_java(JavaThread *thread, JavaThreadState to) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 assert(thread->thread_state() == _thread_in_Java, "coming from wrong thread state");
a61af66fc99e Initial load
duke
parents:
diff changeset
198 thread->set_thread_state(to);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 static inline void transition_from_native(JavaThread *thread, JavaThreadState to) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 assert((to & 1) == 0, "odd numbers are transitions states");
a61af66fc99e Initial load
duke
parents:
diff changeset
203 assert(thread->thread_state() == _thread_in_native, "coming from wrong thread state");
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // Change to transition state (assumes total store ordering! -Urs)
a61af66fc99e Initial load
duke
parents:
diff changeset
205 thread->set_thread_state(_thread_in_native_trans);
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // Make sure new state is seen by GC thread
a61af66fc99e Initial load
duke
parents:
diff changeset
208 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 if (UseMembar) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // Force a fence between the write above and read below
a61af66fc99e Initial load
duke
parents:
diff changeset
211 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
212 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // Must use this rather than serialization page in particular on Windows
a61af66fc99e Initial load
duke
parents:
diff changeset
214 InterfaceSupport::serialize_memory(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // We never install asynchronous exceptions when coming (back) in
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // to the runtime from native code because the runtime is not set
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // up to handle exceptions floating around at arbitrary points.
a61af66fc99e Initial load
duke
parents:
diff changeset
221 if (SafepointSynchronize::do_call_back() || thread->is_suspend_after_native()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 JavaThread::check_safepoint_and_suspend_for_native_trans(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Clear unhandled oops anywhere where we could block, even if we don't.
a61af66fc99e Initial load
duke
parents:
diff changeset
225 CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();)
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 thread->set_thread_state(to);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
231 void trans(JavaThreadState from, JavaThreadState to) { transition(_thread, from, to); }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 void trans_from_java(JavaThreadState to) { transition_from_java(_thread, to); }
a61af66fc99e Initial load
duke
parents:
diff changeset
233 void trans_from_native(JavaThreadState to) { transition_from_native(_thread, to); }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 void trans_and_fence(JavaThreadState from, JavaThreadState to) { transition_and_fence(_thread, from, to); }
a61af66fc99e Initial load
duke
parents:
diff changeset
235 };
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 class ThreadInVMfromJava : public ThreadStateTransition {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
240 ThreadInVMfromJava(JavaThread* thread) : ThreadStateTransition(thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
241 trans_from_java(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
243 ~ThreadInVMfromJava() {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 trans(_thread_in_vm, _thread_in_Java);
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // Check for pending. async. exceptions or suspends.
a61af66fc99e Initial load
duke
parents:
diff changeset
246 if (_thread->has_special_runtime_exit_condition()) _thread->handle_special_runtime_exit_condition();
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248 };
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 class ThreadInVMfromUnknown {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
253 JavaThread* _thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
254 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
255 ThreadInVMfromUnknown() : _thread(NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 Thread* t = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
257 if (t->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 JavaThread* t2 = (JavaThread*) t;
a61af66fc99e Initial load
duke
parents:
diff changeset
259 if (t2->thread_state() == _thread_in_native) {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 _thread = t2;
a61af66fc99e Initial load
duke
parents:
diff changeset
261 ThreadStateTransition::transition_from_native(t2, _thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // Used to have a HandleMarkCleaner but that is dangerous as
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // it could free a handle in our (indirect, nested) caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // We expect any handles will be short lived and figure we
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // don't need an actual HandleMark.
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269 ~ThreadInVMfromUnknown() {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 if (_thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 ThreadStateTransition::transition_and_fence(_thread, _thread_in_vm, _thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274 };
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 class ThreadInVMfromNative : public ThreadStateTransition {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
279 ThreadInVMfromNative(JavaThread* thread) : ThreadStateTransition(thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 trans_from_native(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 ~ThreadInVMfromNative() {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 trans_and_fence(_thread_in_vm, _thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
285 };
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 class ThreadToNativeFromVM : public ThreadStateTransition {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
290 ThreadToNativeFromVM(JavaThread *thread) : ThreadStateTransition(thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // We are leaving the VM at this point and going directly to native code.
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // Block, if we are in the middle of a safepoint synchronization.
a61af66fc99e Initial load
duke
parents:
diff changeset
293 assert(!thread->owns_locks(), "must release all locks when leaving VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
294 thread->frame_anchor()->make_walkable(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
295 trans_and_fence(_thread_in_vm, _thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Check for pending. async. exceptions or suspends.
a61af66fc99e Initial load
duke
parents:
diff changeset
297 if (_thread->has_special_runtime_exit_condition()) _thread->handle_special_runtime_exit_condition(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 ~ThreadToNativeFromVM() {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 trans_from_native(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // We don't need to clear_walkable because it will happen automagically when we return to java
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304 };
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 class ThreadBlockInVM : public ThreadStateTransition {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
309 ThreadBlockInVM(JavaThread *thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
310 : ThreadStateTransition(thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Once we are blocked vm expects stack to be walkable
a61af66fc99e Initial load
duke
parents:
diff changeset
312 thread->frame_anchor()->make_walkable(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
313 trans_and_fence(_thread_in_vm, _thread_blocked);
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 ~ThreadBlockInVM() {
a61af66fc99e Initial load
duke
parents:
diff changeset
316 trans_and_fence(_thread_blocked, _thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // We don't need to clear_walkable because it will happen automagically when we return to java
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
319 };
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // This special transition class is only used to prevent asynchronous exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // from being installed on vm exit in situations where we can't tolerate them.
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // See bugs: 4324348, 4854693, 4998314, 5040492, 5050705.
a61af66fc99e Initial load
duke
parents:
diff changeset
325 class ThreadInVMfromJavaNoAsyncException : public ThreadStateTransition {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
327 ThreadInVMfromJavaNoAsyncException(JavaThread* thread) : ThreadStateTransition(thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 trans_from_java(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330 ~ThreadInVMfromJavaNoAsyncException() {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 trans(_thread_in_vm, _thread_in_Java);
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // NOTE: We do not check for pending. async. exceptions.
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // If we did and moved the pending async exception over into the
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // pending exception field, we would need to deopt (currently C2
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // only). However, to do so would require that we transition back
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // to the _thread_in_vm state. Instead we postpone the handling of
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // the async exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // Check for pending. suspends only.
a61af66fc99e Initial load
duke
parents:
diff changeset
340 if (_thread->has_special_runtime_exit_condition())
a61af66fc99e Initial load
duke
parents:
diff changeset
341 _thread->handle_special_runtime_exit_condition(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343 };
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // Debug class instantiated in JRT_ENTRY and ITR_ENTRY macro.
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // Can be used to verify properties on enter/exit of the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
349 class VMEntryWrapper {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
351 VMEntryWrapper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 if (VerifyLastFrame) {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 InterfaceSupport::verify_last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 ~VMEntryWrapper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 InterfaceSupport::check_gc_alot();
a61af66fc99e Initial load
duke
parents:
diff changeset
359 if (WalkStackALot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
360 InterfaceSupport::walk_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
362 #ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
363 if (ZapDeadLocalsOld) {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 InterfaceSupport::zap_dead_locals_old();
a61af66fc99e Initial load
duke
parents:
diff changeset
365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
366 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
367 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // This option is not used by Compiler 1
a61af66fc99e Initial load
duke
parents:
diff changeset
369 if (StressDerivedPointers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
370 InterfaceSupport::stress_derived_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
373 if (DeoptimizeALot || DeoptimizeRandom) {
a61af66fc99e Initial load
duke
parents:
diff changeset
374 InterfaceSupport::deoptimizeAll();
a61af66fc99e Initial load
duke
parents:
diff changeset
375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
376 if (ZombieALot) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 InterfaceSupport::zombieAll();
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
379 if (UnlinkSymbolsALot) {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
380 InterfaceSupport::unlinkSymbols();
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
381 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
382 // do verification AFTER potential deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
383 if (VerifyStack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
384 InterfaceSupport::verify_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
388 };
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390
a61af66fc99e Initial load
duke
parents:
diff changeset
391 class VMNativeEntryWrapper {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
393 VMNativeEntryWrapper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 if (GCALotAtAllSafepoints) InterfaceSupport::check_gc_alot();
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 ~VMNativeEntryWrapper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
398 if (GCALotAtAllSafepoints) InterfaceSupport::check_gc_alot();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400 };
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // VM-internal runtime interface support
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 class RuntimeHistogramElement : public HistogramElement {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
411 RuntimeHistogramElement(const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
412 };
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414 #define TRACE_CALL(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
415 InterfaceSupport::_number_of_calls++; \
a61af66fc99e Initial load
duke
parents:
diff changeset
416 if (TraceRuntimeCalls) \
a61af66fc99e Initial load
duke
parents:
diff changeset
417 InterfaceSupport::trace(#result_type, #header); \
a61af66fc99e Initial load
duke
parents:
diff changeset
418 if (CountRuntimeCalls) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
419 static RuntimeHistogramElement* e = new RuntimeHistogramElement(#header); \
a61af66fc99e Initial load
duke
parents:
diff changeset
420 if (e != NULL) e->increment_count(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
423 #define TRACE_CALL(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
424 /* do nothing */
a61af66fc99e Initial load
duke
parents:
diff changeset
425 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // LEAF routines do not lock, GC or throw exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
429
a61af66fc99e Initial load
duke
parents:
diff changeset
430 #define __LEAF(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
431 TRACE_CALL(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
432 debug_only(NoHandleMark __hm;) \
a61af66fc99e Initial load
duke
parents:
diff changeset
433 /* begin of body */
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // ENTRY routines may lock, GC and throw exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 #define __ENTRY(result_type, header, thread) \
a61af66fc99e Initial load
duke
parents:
diff changeset
439 TRACE_CALL(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
440 HandleMarkCleaner __hm(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
441 Thread* THREAD = thread; \
a61af66fc99e Initial load
duke
parents:
diff changeset
442 /* begin of body */
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // QUICK_ENTRY routines behave like ENTRY but without a handle mark
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 #define __QUICK_ENTRY(result_type, header, thread) \
a61af66fc99e Initial load
duke
parents:
diff changeset
448 TRACE_CALL(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
449 debug_only(NoHandleMark __hm;) \
a61af66fc99e Initial load
duke
parents:
diff changeset
450 Thread* THREAD = thread; \
a61af66fc99e Initial load
duke
parents:
diff changeset
451 /* begin of body */
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // Definitions for IRT (Interpreter Runtime)
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // (thread is an argument passed in to all these routines)
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 #define IRT_ENTRY(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
458 result_type header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
459 ThreadInVMfromJava __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
460 __ENTRY(result_type, header, thread) \
a61af66fc99e Initial load
duke
parents:
diff changeset
461 debug_only(VMEntryWrapper __vew;)
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 #define IRT_LEAF(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
465 result_type header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
466 __LEAF(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
467 debug_only(No_Safepoint_Verifier __nspv(true);)
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 #define IRT_ENTRY_NO_ASYNC(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
471 result_type header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
472 ThreadInVMfromJavaNoAsyncException __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
473 __ENTRY(result_type, header, thread) \
a61af66fc99e Initial load
duke
parents:
diff changeset
474 debug_only(VMEntryWrapper __vew;)
a61af66fc99e Initial load
duke
parents:
diff changeset
475
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // Another special case for nmethod_entry_point so the nmethod that the
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // interpreter is about to branch to doesn't get flushed before as we
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // branch to it's interpreter_entry_point. Skip stress testing here too.
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // Also we don't allow async exceptions because it is just too painful.
a61af66fc99e Initial load
duke
parents:
diff changeset
480 #define IRT_ENTRY_FOR_NMETHOD(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
481 result_type header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
482 nmethodLocker _nmlock(nm); \
a61af66fc99e Initial load
duke
parents:
diff changeset
483 ThreadInVMfromJavaNoAsyncException __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
484 __ENTRY(result_type, header, thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 #define IRT_END }
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // Definitions for JRT (Java (Compiler/Shared) Runtime)
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 #define JRT_ENTRY(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
492 result_type header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
493 ThreadInVMfromJava __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
494 __ENTRY(result_type, header, thread) \
a61af66fc99e Initial load
duke
parents:
diff changeset
495 debug_only(VMEntryWrapper __vew;)
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 #define JRT_LEAF(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
499 result_type header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
500 __LEAF(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
501 debug_only(JRT_Leaf_Verifier __jlv;)
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 #define JRT_ENTRY_NO_ASYNC(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
505 result_type header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
506 ThreadInVMfromJavaNoAsyncException __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
507 __ENTRY(result_type, header, thread) \
a61af66fc99e Initial load
duke
parents:
diff changeset
508 debug_only(VMEntryWrapper __vew;)
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // Same as JRT Entry but allows for return value after the safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // to get back into Java from the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
512 #define JRT_BLOCK_ENTRY(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
513 result_type header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
514 TRACE_CALL(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
515 HandleMarkCleaner __hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 #define JRT_BLOCK \
a61af66fc99e Initial load
duke
parents:
diff changeset
518 { \
a61af66fc99e Initial load
duke
parents:
diff changeset
519 ThreadInVMfromJava __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
520 Thread* THREAD = thread; \
a61af66fc99e Initial load
duke
parents:
diff changeset
521 debug_only(VMEntryWrapper __vew;)
a61af66fc99e Initial load
duke
parents:
diff changeset
522
a61af66fc99e Initial load
duke
parents:
diff changeset
523 #define JRT_BLOCK_END }
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 #define JRT_END }
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // Definitions for JNI
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529 #define JNI_ENTRY(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
530 JNI_ENTRY_NO_PRESERVE(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
531 WeakPreserveExceptionMark __wem(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 #define JNI_ENTRY_NO_PRESERVE(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
534 extern "C" { \
a61af66fc99e Initial load
duke
parents:
diff changeset
535 result_type JNICALL header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
536 JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
a61af66fc99e Initial load
duke
parents:
diff changeset
537 assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
538 ThreadInVMfromNative __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
539 debug_only(VMNativeEntryWrapper __vew;) \
a61af66fc99e Initial load
duke
parents:
diff changeset
540 __ENTRY(result_type, header, thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 // Ensure that the VMNativeEntryWrapper constructor, which can cause
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // a GC, is called outside the NoHandleMark (set via __QUICK_ENTRY).
a61af66fc99e Initial load
duke
parents:
diff changeset
545 #define JNI_QUICK_ENTRY(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
546 extern "C" { \
a61af66fc99e Initial load
duke
parents:
diff changeset
547 result_type JNICALL header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
548 JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
a61af66fc99e Initial load
duke
parents:
diff changeset
549 assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
550 ThreadInVMfromNative __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
551 debug_only(VMNativeEntryWrapper __vew;) \
a61af66fc99e Initial load
duke
parents:
diff changeset
552 __QUICK_ENTRY(result_type, header, thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554
a61af66fc99e Initial load
duke
parents:
diff changeset
555 #define JNI_LEAF(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
556 extern "C" { \
a61af66fc99e Initial load
duke
parents:
diff changeset
557 result_type JNICALL header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
558 JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
a61af66fc99e Initial load
duke
parents:
diff changeset
559 assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \
a61af66fc99e Initial load
duke
parents:
diff changeset
560 __LEAF(result_type, header)
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // Close the routine and the extern "C"
a61af66fc99e Initial load
duke
parents:
diff changeset
564 #define JNI_END } }
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // Definitions for JVM
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 #define JVM_ENTRY(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
571 extern "C" { \
a61af66fc99e Initial load
duke
parents:
diff changeset
572 result_type JNICALL header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
573 JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
a61af66fc99e Initial load
duke
parents:
diff changeset
574 ThreadInVMfromNative __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
575 debug_only(VMNativeEntryWrapper __vew;) \
a61af66fc99e Initial load
duke
parents:
diff changeset
576 __ENTRY(result_type, header, thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
577
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579 #define JVM_ENTRY_NO_ENV(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
580 extern "C" { \
a61af66fc99e Initial load
duke
parents:
diff changeset
581 result_type JNICALL header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
582 JavaThread* thread = (JavaThread*)ThreadLocalStorage::thread(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
583 ThreadInVMfromNative __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
584 debug_only(VMNativeEntryWrapper __vew;) \
a61af66fc99e Initial load
duke
parents:
diff changeset
585 __ENTRY(result_type, header, thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 #define JVM_QUICK_ENTRY(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
589 extern "C" { \
a61af66fc99e Initial load
duke
parents:
diff changeset
590 result_type JNICALL header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
591 JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
a61af66fc99e Initial load
duke
parents:
diff changeset
592 ThreadInVMfromNative __tiv(thread); \
a61af66fc99e Initial load
duke
parents:
diff changeset
593 debug_only(VMNativeEntryWrapper __vew;) \
a61af66fc99e Initial load
duke
parents:
diff changeset
594 __QUICK_ENTRY(result_type, header, thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 #define JVM_LEAF(result_type, header) \
a61af66fc99e Initial load
duke
parents:
diff changeset
598 extern "C" { \
a61af66fc99e Initial load
duke
parents:
diff changeset
599 result_type JNICALL header { \
a61af66fc99e Initial load
duke
parents:
diff changeset
600 VM_Exit::block_if_vm_exited(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
601 __LEAF(result_type, header)
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 #define JVM_END } }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
605
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
606 #endif // SHARE_VM_RUNTIME_INTERFACESUPPORT_HPP