annotate src/share/vm/runtime/thread.cpp @ 1483:ba37b9335e1e

New option "-graal" that sets up the correct boot class path and C1X options using only the two environment variables MAXINE and GRAAL. This greatly simplifies command line arguments necessary to start the Graal VM.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Mon, 29 Nov 2010 16:58:26 +0100
parents 7cf1952ec5fb
children 2d26b0046e0d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1166
diff changeset
2 * Copyright 1997-2010 Sun Microsystems, Inc. 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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_thread.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 #ifdef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // Only bother with this argument setup if dtrace is available
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 HS_DTRACE_PROBE_DECL(hotspot, vm__init__begin);
a61af66fc99e Initial load
duke
parents:
diff changeset
33 HS_DTRACE_PROBE_DECL(hotspot, vm__init__end);
a61af66fc99e Initial load
duke
parents:
diff changeset
34 HS_DTRACE_PROBE_DECL5(hotspot, thread__start, char*, intptr_t,
a61af66fc99e Initial load
duke
parents:
diff changeset
35 intptr_t, intptr_t, bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
36 HS_DTRACE_PROBE_DECL5(hotspot, thread__stop, char*, intptr_t,
a61af66fc99e Initial load
duke
parents:
diff changeset
37 intptr_t, intptr_t, bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 #define DTRACE_THREAD_PROBE(probe, javathread) \
a61af66fc99e Initial load
duke
parents:
diff changeset
40 { \
a61af66fc99e Initial load
duke
parents:
diff changeset
41 ResourceMark rm(this); \
a61af66fc99e Initial load
duke
parents:
diff changeset
42 int len = 0; \
a61af66fc99e Initial load
duke
parents:
diff changeset
43 const char* name = (javathread)->get_thread_name(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
44 len = strlen(name); \
a61af66fc99e Initial load
duke
parents:
diff changeset
45 HS_DTRACE_PROBE5(hotspot, thread__##probe, \
a61af66fc99e Initial load
duke
parents:
diff changeset
46 name, len, \
a61af66fc99e Initial load
duke
parents:
diff changeset
47 java_lang_Thread::thread_id((javathread)->threadObj()), \
a61af66fc99e Initial load
duke
parents:
diff changeset
48 (javathread)->osthread()->thread_id(), \
a61af66fc99e Initial load
duke
parents:
diff changeset
49 java_lang_Thread::is_daemon((javathread)->threadObj())); \
a61af66fc99e Initial load
duke
parents:
diff changeset
50 }
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 #else // ndef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 #define DTRACE_THREAD_PROBE(probe, javathread)
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 #endif // ndef DTRACE_ENABLED
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // Class hierarchy
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // - Thread
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // - VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // - WatcherThread
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // - ConcurrentMarkSweepThread
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // - JavaThread
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // - CompilerThread
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // ======= Thread ========
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // Support for forcing alignment of thread objects for biased locking
a61af66fc99e Initial load
duke
parents:
diff changeset
69 void* Thread::operator new(size_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 const int alignment = markOopDesc::biased_lock_alignment;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 size_t aligned_size = size + (alignment - sizeof(intptr_t));
a61af66fc99e Initial load
duke
parents:
diff changeset
73 void* real_malloc_addr = CHeapObj::operator new(aligned_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 void* aligned_addr = (void*) align_size_up((intptr_t) real_malloc_addr, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 assert(((uintptr_t) aligned_addr + (uintptr_t) size) <=
a61af66fc99e Initial load
duke
parents:
diff changeset
76 ((uintptr_t) real_malloc_addr + (uintptr_t) aligned_size),
a61af66fc99e Initial load
duke
parents:
diff changeset
77 "JavaThread alignment code overflowed allocated storage");
a61af66fc99e Initial load
duke
parents:
diff changeset
78 if (TraceBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 if (aligned_addr != real_malloc_addr)
a61af66fc99e Initial load
duke
parents:
diff changeset
80 tty->print_cr("Aligned thread " INTPTR_FORMAT " to " INTPTR_FORMAT,
a61af66fc99e Initial load
duke
parents:
diff changeset
81 real_malloc_addr, aligned_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83 ((Thread*) aligned_addr)->_real_malloc_address = real_malloc_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 return aligned_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 return CHeapObj::operator new(size);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 void Thread::operator delete(void* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 void* real_malloc_addr = ((Thread*) p)->_real_malloc_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
93 CHeapObj::operator delete(real_malloc_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
95 CHeapObj::operator delete(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97 }
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // Base class for all threads: VMThread, WatcherThread, ConcurrentMarkSweepThread,
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // JavaThread
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 Thread::Thread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // stack
a61af66fc99e Initial load
duke
parents:
diff changeset
106 _stack_base = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 _stack_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 _self_raw_id = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 _lgrp_id = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 _osthread = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // allocated data structures
a61af66fc99e Initial load
duke
parents:
diff changeset
113 set_resource_area(new ResourceArea());
a61af66fc99e Initial load
duke
parents:
diff changeset
114 set_handle_area(new HandleArea(NULL));
a61af66fc99e Initial load
duke
parents:
diff changeset
115 set_active_handles(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 set_free_handle_block(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
117 set_last_handle_mark(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
118 set_osthread(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 // This initial value ==> never claimed.
a61af66fc99e Initial load
duke
parents:
diff changeset
121 _oops_do_parity = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // the handle mark links itself to last_handle_mark
a61af66fc99e Initial load
duke
parents:
diff changeset
124 new HandleMark(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // plain initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
127 debug_only(_owned_locks = NULL;)
a61af66fc99e Initial load
duke
parents:
diff changeset
128 debug_only(_allow_allocation_count = 0;)
a61af66fc99e Initial load
duke
parents:
diff changeset
129 NOT_PRODUCT(_allow_safepoint_count = 0;)
806
821269eca479 6820167: GCALotAtAllSafepoints + FullGCALot(ScavengeALot) options crash JVM
ysr
parents: 702
diff changeset
130 NOT_PRODUCT(_skip_gcalot = false;)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131 CHECK_UNHANDLED_OOPS_ONLY(_gc_locked_out_count = 0;)
a61af66fc99e Initial load
duke
parents:
diff changeset
132 _jvmti_env_iteration_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 _vm_operation_started_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 _vm_operation_completed_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 _current_pending_monitor = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _current_pending_monitor_is_from_java = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 _current_waiting_monitor = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _num_nested_signal = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 omFreeList = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 omFreeCount = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 omFreeProvision = 32 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 _SR_lock = new Monitor(Mutex::suspend_resume, "SR_lock", true);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 _suspend_flags = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // thread-specific hashCode stream generator state - Marsaglia shift-xor form
a61af66fc99e Initial load
duke
parents:
diff changeset
147 _hashStateX = os::random() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 _hashStateY = 842502087 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
149 _hashStateZ = 0x8767 ; // (int)(3579807591LL & 0xffff) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 _hashStateW = 273326509 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 _OnTrap = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 _schedctl = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 _Stalled = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 _TypeTag = 0x2BAD ;
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Many of the following fields are effectively final - immutable
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Note that nascent threads can't use the Native Monitor-Mutex
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // construct until the _MutexEvent is initialized ...
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // CONSIDER: instead of using a fixed set of purpose-dedicated ParkEvents
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // we might instead use a stack of ParkEvents that we could provision on-demand.
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // The stack would act as a cache to avoid calls to ParkEvent::Allocate()
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // and ::Release()
a61af66fc99e Initial load
duke
parents:
diff changeset
164 _ParkEvent = ParkEvent::Allocate (this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 _SleepEvent = ParkEvent::Allocate (this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
166 _MutexEvent = ParkEvent::Allocate (this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 _MuxEvent = ParkEvent::Allocate (this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 #ifdef CHECK_UNHANDLED_OOPS
a61af66fc99e Initial load
duke
parents:
diff changeset
170 if (CheckUnhandledOops) {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 _unhandled_oops = new UnhandledOops(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173 #endif // CHECK_UNHANDLED_OOPS
a61af66fc99e Initial load
duke
parents:
diff changeset
174 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
175 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 assert((((uintptr_t) this) & (markOopDesc::biased_lock_alignment - 1)) == 0, "forced alignment of thread object failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
177 assert(this == _real_malloc_address ||
a61af66fc99e Initial load
duke
parents:
diff changeset
178 this == (void*) align_size_up((intptr_t) _real_malloc_address, markOopDesc::biased_lock_alignment),
a61af66fc99e Initial load
duke
parents:
diff changeset
179 "bug in forced alignment of thread objects");
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181 #endif /* ASSERT */
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 void Thread::initialize_thread_local_storage() {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Note: Make sure this method only calls
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // non-blocking operations. Otherwise, it might not work
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // with the thread-startup/safepoint interaction.
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // During Java thread startup, safepoint code should allow this
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // method to complete because it may need to allocate memory to
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // store information for the new thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // initialize structure dependent on thread local storage
a61af66fc99e Initial load
duke
parents:
diff changeset
194 ThreadLocalStorage::set_thread(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // set up any platform-specific state.
a61af66fc99e Initial load
duke
parents:
diff changeset
197 os::initialize_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 void Thread::record_stack_base_and_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 set_stack_base(os::current_stack_base());
a61af66fc99e Initial load
duke
parents:
diff changeset
203 set_stack_size(os::current_stack_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 Thread::~Thread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // Reclaim the objectmonitors from the omFreeList of the moribund thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
209 ObjectSynchronizer::omFlush (this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // deallocate data structures
a61af66fc99e Initial load
duke
parents:
diff changeset
212 delete resource_area();
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // since the handle marks are using the handle area, we have to deallocated the root
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // handle mark before deallocating the thread's handle area,
a61af66fc99e Initial load
duke
parents:
diff changeset
215 assert(last_handle_mark() != NULL, "check we have an element");
a61af66fc99e Initial load
duke
parents:
diff changeset
216 delete last_handle_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
217 assert(last_handle_mark() == NULL, "check we have reached the end");
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // It's possible we can encounter a null _ParkEvent, etc., in stillborn threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // We NULL out the fields for good hygiene.
a61af66fc99e Initial load
duke
parents:
diff changeset
221 ParkEvent::Release (_ParkEvent) ; _ParkEvent = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
222 ParkEvent::Release (_SleepEvent) ; _SleepEvent = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 ParkEvent::Release (_MutexEvent) ; _MutexEvent = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 ParkEvent::Release (_MuxEvent) ; _MuxEvent = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 delete handle_area();
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // osthread() can be NULL, if creation of thread failed.
a61af66fc99e Initial load
duke
parents:
diff changeset
229 if (osthread() != NULL) os::free_thread(osthread());
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 delete _SR_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // clear thread local storage if the Thread is deleting itself
a61af66fc99e Initial load
duke
parents:
diff changeset
234 if (this == Thread::current()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 ThreadLocalStorage::set_thread(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // In the case where we're not the current thread, invalidate all the
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // caches in case some code tries to get the current thread or the
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // thread that was destroyed, and gets stale information.
a61af66fc99e Initial load
duke
parents:
diff changeset
240 ThreadLocalStorage::invalidate_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 CHECK_UNHANDLED_OOPS_ONLY(if (CheckUnhandledOops) delete unhandled_oops();)
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // NOTE: dummy function for assertion purpose.
a61af66fc99e Initial load
duke
parents:
diff changeset
246 void Thread::run() {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // Private method to check for dangling thread pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
252 void check_for_dangling_thread_pointer(Thread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
a61af66fc99e Initial load
duke
parents:
diff changeset
254 "possibility of dangling Thread pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // Tracing method for basic thread operations
a61af66fc99e Initial load
duke
parents:
diff changeset
261 void Thread::trace(const char* msg, const Thread* const thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 if (!TraceThreadEvents) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 ThreadCritical tc;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 const char *name = "non-Java thread";
a61af66fc99e Initial load
duke
parents:
diff changeset
266 int prio = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
267 if (thread->is_Java_thread()
a61af66fc99e Initial load
duke
parents:
diff changeset
268 && !thread->is_Compiler_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // The Threads_lock must be held to get information about
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // this thread but may not be in some situations when
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // tracing thread events.
a61af66fc99e Initial load
duke
parents:
diff changeset
272 bool release_Threads_lock = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 if (!Threads_lock->owned_by_self()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 Threads_lock->lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
275 release_Threads_lock = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277 JavaThread* jt = (JavaThread *)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 name = (char *)jt->get_thread_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
279 oop thread_oop = jt->threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
280 if (thread_oop != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 prio = java_lang_Thread::priority(thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 if (release_Threads_lock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
284 Threads_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 tty->print_cr("Thread::%s " INTPTR_FORMAT " [%lx] %s (prio: %d)", msg, thread, thread->osthread()->thread_id(), name, prio);
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 ThreadPriority Thread::get_priority(const Thread* const thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
293 trace("get priority", thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
294 ThreadPriority priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // Can return an error!
a61af66fc99e Initial load
duke
parents:
diff changeset
296 (void)os::get_priority(thread, priority);
a61af66fc99e Initial load
duke
parents:
diff changeset
297 assert(MinPriority <= priority && priority <= MaxPriority, "non-Java priority found");
a61af66fc99e Initial load
duke
parents:
diff changeset
298 return priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 void Thread::set_priority(Thread* thread, ThreadPriority priority) {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 trace("set priority", thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 debug_only(check_for_dangling_thread_pointer(thread);)
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // Can return an error!
a61af66fc99e Initial load
duke
parents:
diff changeset
305 (void)os::set_priority(thread, priority);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 void Thread::start(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 trace("start", thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Start is different from resume in that its safety is guaranteed by context or
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // being called from a Java method synchronized on the Thread object.
a61af66fc99e Initial load
duke
parents:
diff changeset
313 if (!DisableStartThread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 if (thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Initialize the thread state to RUNNABLE before starting this thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // Can not set it after the thread started because we do not know the
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // exact thread state at that time. It could be in MONITOR_WAIT or
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // in SLEEPING or some other state.
a61af66fc99e Initial load
duke
parents:
diff changeset
319 java_lang_Thread::set_thread_status(((JavaThread*)thread)->threadObj(),
a61af66fc99e Initial load
duke
parents:
diff changeset
320 java_lang_Thread::RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322 os::start_thread(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // Enqueue a VM_Operation to do the job for us - sometime later
a61af66fc99e Initial load
duke
parents:
diff changeset
327 void Thread::send_async_exception(oop java_thread, oop java_throwable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 VM_ThreadStop* vm_stop = new VM_ThreadStop(java_thread, java_throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 VMThread::execute(vm_stop);
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 //
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // Check if an external suspend request has completed (or has been
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // cancelled). Returns true if the thread is externally suspended and
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // false otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
337 //
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // The bits parameter returns information about the code path through
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // the routine. Useful for debugging:
a61af66fc99e Initial load
duke
parents:
diff changeset
340 //
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // set in is_ext_suspend_completed():
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // 0x00000001 - routine was entered
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // 0x00000010 - routine return false at end
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // 0x00000100 - thread exited (return false)
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // 0x00000200 - suspend request cancelled (return false)
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // 0x00000400 - thread suspended (return true)
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // 0x00001000 - thread is in a suspend equivalent state (return true)
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // 0x00002000 - thread is native and walkable (return true)
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // 0x00004000 - thread is native_trans and walkable (needed retry)
a61af66fc99e Initial load
duke
parents:
diff changeset
350 //
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // set in wait_for_ext_suspend_completion():
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // 0x00010000 - routine was entered
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // 0x00020000 - suspend request cancelled before loop (return false)
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // 0x00040000 - thread suspended before loop (return true)
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // 0x00080000 - suspend request cancelled in loop (return false)
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // 0x00100000 - thread suspended in loop (return true)
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // 0x00200000 - suspend not completed during retry loop (return false)
a61af66fc99e Initial load
duke
parents:
diff changeset
358 //
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // Helper class for tracing suspend wait debug bits.
a61af66fc99e Initial load
duke
parents:
diff changeset
361 //
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // 0x00000100 indicates that the target thread exited before it could
a61af66fc99e Initial load
duke
parents:
diff changeset
363 // self-suspend which is not a wait failure. 0x00000200, 0x00020000 and
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // 0x00080000 each indicate a cancelled suspend request so they don't
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // count as wait failures either.
a61af66fc99e Initial load
duke
parents:
diff changeset
366 #define DEBUG_FALSE_BITS (0x00000010 | 0x00200000)
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 class TraceSuspendDebugBits : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
370 JavaThread * jt;
a61af66fc99e Initial load
duke
parents:
diff changeset
371 bool is_wait;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 bool called_by_wait; // meaningful when !is_wait
a61af66fc99e Initial load
duke
parents:
diff changeset
373 uint32_t * bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
376 TraceSuspendDebugBits(JavaThread *_jt, bool _is_wait, bool _called_by_wait,
a61af66fc99e Initial load
duke
parents:
diff changeset
377 uint32_t *_bits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
378 jt = _jt;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 is_wait = _is_wait;
a61af66fc99e Initial load
duke
parents:
diff changeset
380 called_by_wait = _called_by_wait;
a61af66fc99e Initial load
duke
parents:
diff changeset
381 bits = _bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 ~TraceSuspendDebugBits() {
a61af66fc99e Initial load
duke
parents:
diff changeset
385 if (!is_wait) {
a61af66fc99e Initial load
duke
parents:
diff changeset
386 #if 1
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // By default, don't trace bits for is_ext_suspend_completed() calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // That trace is very chatty.
a61af66fc99e Initial load
duke
parents:
diff changeset
389 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
391 if (!called_by_wait) {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // If tracing for is_ext_suspend_completed() is enabled, then only
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // trace calls to it from wait_for_ext_suspend_completion()
a61af66fc99e Initial load
duke
parents:
diff changeset
394 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (AssertOnSuspendWaitFailure || TraceSuspendWaitFailures) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 if (bits != NULL && (*bits & DEBUG_FALSE_BITS) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 MutexLocker ml(Threads_lock); // needed for get_thread_name()
a61af66fc99e Initial load
duke
parents:
diff changeset
402 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
405 "Failed wait_for_ext_suspend_completion(thread=%s, debug_bits=%x)",
a61af66fc99e Initial load
duke
parents:
diff changeset
406 jt->get_thread_name(), *bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 guarantee(!AssertOnSuspendWaitFailure, "external suspend wait failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412 };
a61af66fc99e Initial load
duke
parents:
diff changeset
413 #undef DEBUG_FALSE_BITS
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 bool JavaThread::is_ext_suspend_completed(bool called_by_wait, int delay, uint32_t *bits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
417 TraceSuspendDebugBits tsdb(this, false /* !is_wait */, called_by_wait, bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
418
a61af66fc99e Initial load
duke
parents:
diff changeset
419 bool did_trans_retry = false; // only do thread_in_native_trans retry once
a61af66fc99e Initial load
duke
parents:
diff changeset
420 bool do_trans_retry; // flag to force the retry
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 *bits |= 0x00000001;
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
425 do_trans_retry = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 if (is_exiting()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // Thread is in the process of exiting. This is always checked
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // first to reduce the risk of dereferencing a freed JavaThread.
a61af66fc99e Initial load
duke
parents:
diff changeset
430 *bits |= 0x00000100;
a61af66fc99e Initial load
duke
parents:
diff changeset
431 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
432 }
a61af66fc99e Initial load
duke
parents:
diff changeset
433
a61af66fc99e Initial load
duke
parents:
diff changeset
434 if (!is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // Suspend request is cancelled. This is always checked before
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // is_ext_suspended() to reduce the risk of a rogue resume
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // confusing the thread that made the suspend request.
a61af66fc99e Initial load
duke
parents:
diff changeset
438 *bits |= 0x00000200;
a61af66fc99e Initial load
duke
parents:
diff changeset
439 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 if (is_ext_suspended()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // thread is suspended
a61af66fc99e Initial load
duke
parents:
diff changeset
444 *bits |= 0x00000400;
a61af66fc99e Initial load
duke
parents:
diff changeset
445 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
446 }
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // Now that we no longer do hard suspends of threads running
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // native code, the target thread can be changing thread state
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // while we are in this routine:
a61af66fc99e Initial load
duke
parents:
diff changeset
451 //
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // _thread_in_native -> _thread_in_native_trans -> _thread_blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
453 //
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // We save a copy of the thread state as observed at this moment
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // and make our decision about suspend completeness based on the
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // copy. This closes the race where the thread state is seen as
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // _thread_in_native_trans in the if-thread_blocked check, but is
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // seen as _thread_blocked in if-thread_in_native_trans check.
a61af66fc99e Initial load
duke
parents:
diff changeset
459 JavaThreadState save_state = thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 if (save_state == _thread_blocked && is_suspend_equivalent()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // If the thread's state is _thread_blocked and this blocking
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // condition is known to be equivalent to a suspend, then we can
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // consider the thread to be externally suspended. This means that
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // the code that sets _thread_blocked has been modified to do
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // self-suspension if the blocking condition releases. We also
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // used to check for CONDVAR_WAIT here, but that is now covered by
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // the _thread_blocked with self-suspension check.
a61af66fc99e Initial load
duke
parents:
diff changeset
469 //
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Return true since we wouldn't be here unless there was still an
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // external suspend request.
a61af66fc99e Initial load
duke
parents:
diff changeset
472 *bits |= 0x00001000;
a61af66fc99e Initial load
duke
parents:
diff changeset
473 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
474 } else if (save_state == _thread_in_native && frame_anchor()->walkable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // Threads running native code will self-suspend on native==>VM/Java
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // transitions. If its stack is walkable (should always be the case
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // unless this function is called before the actual java_suspend()
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // call), then the wait is done.
a61af66fc99e Initial load
duke
parents:
diff changeset
479 *bits |= 0x00002000;
a61af66fc99e Initial load
duke
parents:
diff changeset
480 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
481 } else if (!called_by_wait && !did_trans_retry &&
a61af66fc99e Initial load
duke
parents:
diff changeset
482 save_state == _thread_in_native_trans &&
a61af66fc99e Initial load
duke
parents:
diff changeset
483 frame_anchor()->walkable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // The thread is transitioning from thread_in_native to another
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // thread state. check_safepoint_and_suspend_for_native_trans()
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // will force the thread to self-suspend. If it hasn't gotten
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // there yet we may have caught the thread in-between the native
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // code check above and the self-suspend. Lucky us. If we were
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // called by wait_for_ext_suspend_completion(), then it
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // will be doing the retries so we don't have to.
a61af66fc99e Initial load
duke
parents:
diff changeset
491 //
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // Since we use the saved thread state in the if-statement above,
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // there is a chance that the thread has already transitioned to
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // _thread_blocked by the time we get here. In that case, we will
a61af66fc99e Initial load
duke
parents:
diff changeset
495 // make a single unnecessary pass through the logic below. This
a61af66fc99e Initial load
duke
parents:
diff changeset
496 // doesn't hurt anything since we still do the trans retry.
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 *bits |= 0x00004000;
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // Once the thread leaves thread_in_native_trans for another
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // thread state, we break out of this retry loop. We shouldn't
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // need this flag to prevent us from getting back here, but
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // sometimes paranoia is good.
a61af66fc99e Initial load
duke
parents:
diff changeset
504 did_trans_retry = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 // We wait for the thread to transition to a more usable state.
a61af66fc99e Initial load
duke
parents:
diff changeset
507 for (int i = 1; i <= SuspendRetryCount; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // We used to do an "os::yield_all(i)" call here with the intention
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // that yielding would increase on each retry. However, the parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // is ignored on Linux which means the yield didn't scale up. Waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // on the SR_lock below provides a much more predictable scale up for
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // the delay. It also provides a simple/direct point to check for any
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // safepoint requests from the VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // temporarily drops SR_lock while doing wait with safepoint check
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // (if we're a JavaThread - the WatcherThread can also call this)
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // and increase delay with each retry
a61af66fc99e Initial load
duke
parents:
diff changeset
518 SR_lock()->wait(!Thread::current()->is_Java_thread(), i * delay);
a61af66fc99e Initial load
duke
parents:
diff changeset
519
a61af66fc99e Initial load
duke
parents:
diff changeset
520 // check the actual thread state instead of what we saved above
a61af66fc99e Initial load
duke
parents:
diff changeset
521 if (thread_state() != _thread_in_native_trans) {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // the thread has transitioned to another thread state so
a61af66fc99e Initial load
duke
parents:
diff changeset
523 // try all the checks (except this one) one more time.
a61af66fc99e Initial load
duke
parents:
diff changeset
524 do_trans_retry = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
525 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
527 } // end retry loop
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
531 } while (do_trans_retry);
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 *bits |= 0x00000010;
a61af66fc99e Initial load
duke
parents:
diff changeset
534 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 //
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // Wait for an external suspend request to complete (or be cancelled).
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // Returns true if the thread is externally suspended and false otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
540 //
a61af66fc99e Initial load
duke
parents:
diff changeset
541 bool JavaThread::wait_for_ext_suspend_completion(int retries, int delay,
a61af66fc99e Initial load
duke
parents:
diff changeset
542 uint32_t *bits) {
a61af66fc99e Initial load
duke
parents:
diff changeset
543 TraceSuspendDebugBits tsdb(this, true /* is_wait */,
a61af66fc99e Initial load
duke
parents:
diff changeset
544 false /* !called_by_wait */, bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 // local flag copies to minimize SR_lock hold time
a61af66fc99e Initial load
duke
parents:
diff changeset
547 bool is_suspended;
a61af66fc99e Initial load
duke
parents:
diff changeset
548 bool pending;
a61af66fc99e Initial load
duke
parents:
diff changeset
549 uint32_t reset_bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 // set a marker so is_ext_suspend_completed() knows we are the caller
a61af66fc99e Initial load
duke
parents:
diff changeset
552 *bits |= 0x00010000;
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // We use reset_bits to reinitialize the bits value at the top of
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // each retry loop. This allows the caller to make use of any
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // unused bits for their own marking purposes.
a61af66fc99e Initial load
duke
parents:
diff changeset
557 reset_bits = *bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
558
a61af66fc99e Initial load
duke
parents:
diff changeset
559 {
a61af66fc99e Initial load
duke
parents:
diff changeset
560 MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
561 is_suspended = is_ext_suspend_completed(true /* called_by_wait */,
a61af66fc99e Initial load
duke
parents:
diff changeset
562 delay, bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
563 pending = is_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // must release SR_lock to allow suspension to complete
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 if (!pending) {
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // A cancelled suspend request is the only false return from
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // is_ext_suspend_completed() that keeps us from entering the
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // retry loop.
a61af66fc99e Initial load
duke
parents:
diff changeset
571 *bits |= 0x00020000;
a61af66fc99e Initial load
duke
parents:
diff changeset
572 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
574
a61af66fc99e Initial load
duke
parents:
diff changeset
575 if (is_suspended) {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 *bits |= 0x00040000;
a61af66fc99e Initial load
duke
parents:
diff changeset
577 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 for (int i = 1; i <= retries; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 *bits = reset_bits; // reinit to only track last retry
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // We used to do an "os::yield_all(i)" call here with the intention
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // that yielding would increase on each retry. However, the parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // is ignored on Linux which means the yield didn't scale up. Waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
586 // on the SR_lock below provides a much more predictable scale up for
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // the delay. It also provides a simple/direct point to check for any
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // safepoint requests from the VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
589
a61af66fc99e Initial load
duke
parents:
diff changeset
590 {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 MutexLocker ml(SR_lock());
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // wait with safepoint check (if we're a JavaThread - the WatcherThread
a61af66fc99e Initial load
duke
parents:
diff changeset
593 // can also call this) and increase delay with each retry
a61af66fc99e Initial load
duke
parents:
diff changeset
594 SR_lock()->wait(!Thread::current()->is_Java_thread(), i * delay);
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 is_suspended = is_ext_suspend_completed(true /* called_by_wait */,
a61af66fc99e Initial load
duke
parents:
diff changeset
597 delay, bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599 // It is possible for the external suspend request to be cancelled
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // (by a resume) before the actual suspend operation is completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // Refresh our local copy to see if we still need to wait.
a61af66fc99e Initial load
duke
parents:
diff changeset
602 pending = is_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 if (!pending) {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 // A cancelled suspend request is the only false return from
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // is_ext_suspend_completed() that keeps us from staying in the
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // retry loop.
a61af66fc99e Initial load
duke
parents:
diff changeset
609 *bits |= 0x00080000;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 if (is_suspended) {
a61af66fc99e Initial load
duke
parents:
diff changeset
614 *bits |= 0x00100000;
a61af66fc99e Initial load
duke
parents:
diff changeset
615 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617 } // end retry loop
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // thread did not suspend after all our retries
a61af66fc99e Initial load
duke
parents:
diff changeset
620 *bits |= 0x00200000;
a61af66fc99e Initial load
duke
parents:
diff changeset
621 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
625 void JavaThread::record_jump(address target, address instr, const char* file, int line) {
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // This should not need to be atomic as the only way for simultaneous
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // updates is via interrupts. Even then this should be rare or non-existant
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // and we don't care that much anyway.
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 int index = _jmp_ring_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
632 _jmp_ring_index = (index + 1 ) & (jump_ring_buffer_size - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
633 _jmp_ring[index]._target = (intptr_t) target;
a61af66fc99e Initial load
duke
parents:
diff changeset
634 _jmp_ring[index]._instruction = (intptr_t) instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
635 _jmp_ring[index]._file = file;
a61af66fc99e Initial load
duke
parents:
diff changeset
636 _jmp_ring[index]._line = line;
a61af66fc99e Initial load
duke
parents:
diff changeset
637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
638 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
639
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // Called by flat profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // Callers have already called wait_for_ext_suspend_completion
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // The assertion for that is currently too complex to put here:
a61af66fc99e Initial load
duke
parents:
diff changeset
643 bool JavaThread::profile_last_Java_frame(frame* _fr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 bool gotframe = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // self suspension saves needed state.
a61af66fc99e Initial load
duke
parents:
diff changeset
646 if (has_last_Java_frame() && _anchor.walkable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
647 *_fr = pd_last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
648 gotframe = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
650 return gotframe;
a61af66fc99e Initial load
duke
parents:
diff changeset
651 }
a61af66fc99e Initial load
duke
parents:
diff changeset
652
a61af66fc99e Initial load
duke
parents:
diff changeset
653 void Thread::interrupt(Thread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
654 trace("interrupt", thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
655 debug_only(check_for_dangling_thread_pointer(thread);)
a61af66fc99e Initial load
duke
parents:
diff changeset
656 os::interrupt(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 bool Thread::is_interrupted(Thread* thread, bool clear_interrupted) {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 trace("is_interrupted", thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
661 debug_only(check_for_dangling_thread_pointer(thread);)
a61af66fc99e Initial load
duke
parents:
diff changeset
662 // Note: If clear_interrupted==false, this simply fetches and
a61af66fc99e Initial load
duke
parents:
diff changeset
663 // returns the value of the field osthread()->interrupted().
a61af66fc99e Initial load
duke
parents:
diff changeset
664 return os::is_interrupted(thread, clear_interrupted);
a61af66fc99e Initial load
duke
parents:
diff changeset
665 }
a61af66fc99e Initial load
duke
parents:
diff changeset
666
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // GC Support
a61af66fc99e Initial load
duke
parents:
diff changeset
669 bool Thread::claim_oops_do_par_case(int strong_roots_parity) {
a61af66fc99e Initial load
duke
parents:
diff changeset
670 jint thread_parity = _oops_do_parity;
a61af66fc99e Initial load
duke
parents:
diff changeset
671 if (thread_parity != strong_roots_parity) {
a61af66fc99e Initial load
duke
parents:
diff changeset
672 jint res = Atomic::cmpxchg(strong_roots_parity, &_oops_do_parity, thread_parity);
a61af66fc99e Initial load
duke
parents:
diff changeset
673 if (res == thread_parity) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
674 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
675 guarantee(res == strong_roots_parity, "Or else what?");
a61af66fc99e Initial load
duke
parents:
diff changeset
676 assert(SharedHeap::heap()->n_par_threads() > 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
677 "Should only fail when parallel.");
a61af66fc99e Initial load
duke
parents:
diff changeset
678 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
679 }
a61af66fc99e Initial load
duke
parents:
diff changeset
680 }
a61af66fc99e Initial load
duke
parents:
diff changeset
681 assert(SharedHeap::heap()->n_par_threads() > 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
682 "Should only fail when parallel.");
a61af66fc99e Initial load
duke
parents:
diff changeset
683 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
685
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
686 void Thread::oops_do(OopClosure* f, CodeBlobClosure* cf) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
687 active_handles()->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
688 // Do oop for ThreadShadow
a61af66fc99e Initial load
duke
parents:
diff changeset
689 f->do_oop((oop*)&_pending_exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
690 handle_area()->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
691 }
a61af66fc99e Initial load
duke
parents:
diff changeset
692
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
693 void Thread::nmethods_do(CodeBlobClosure* cf) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
694 // no nmethods in a generic thread...
0
a61af66fc99e Initial load
duke
parents:
diff changeset
695 }
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697 void Thread::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // get_priority assumes osthread initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
699 if (osthread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 st->print("prio=%d tid=" INTPTR_FORMAT " ", get_priority(this), this);
a61af66fc99e Initial load
duke
parents:
diff changeset
701 osthread()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703 debug_only(if (WizardMode) print_owned_locks_on(st);)
a61af66fc99e Initial load
duke
parents:
diff changeset
704 }
a61af66fc99e Initial load
duke
parents:
diff changeset
705
a61af66fc99e Initial load
duke
parents:
diff changeset
706 // Thread::print_on_error() is called by fatal error handler. Don't use
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // any lock or allocate memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
708 void Thread::print_on_error(outputStream* st, char* buf, int buflen) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
709 if (is_VM_thread()) st->print("VMThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
710 else if (is_Compiler_thread()) st->print("CompilerThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
711 else if (is_Java_thread()) st->print("JavaThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
712 else if (is_GC_task_thread()) st->print("GCTaskThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
713 else if (is_Watcher_thread()) st->print("WatcherThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
714 else if (is_ConcurrentGC_thread()) st->print("ConcurrentGCThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
715 else st->print("Thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717 st->print(" [stack: " PTR_FORMAT "," PTR_FORMAT "]",
a61af66fc99e Initial load
duke
parents:
diff changeset
718 _stack_base - _stack_size, _stack_base);
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 if (osthread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
721 st->print(" [id=%d]", osthread()->thread_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
723 }
a61af66fc99e Initial load
duke
parents:
diff changeset
724
a61af66fc99e Initial load
duke
parents:
diff changeset
725 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
726 void Thread::print_owned_locks_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
727 Monitor *cur = _owned_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
728 if (cur == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 st->print(" (no locks) ");
a61af66fc99e Initial load
duke
parents:
diff changeset
730 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
731 st->print_cr(" Locks owned:");
a61af66fc99e Initial load
duke
parents:
diff changeset
732 while(cur) {
a61af66fc99e Initial load
duke
parents:
diff changeset
733 cur->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
734 cur = cur->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
736 }
a61af66fc99e Initial load
duke
parents:
diff changeset
737 }
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 static int ref_use_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
740
a61af66fc99e Initial load
duke
parents:
diff changeset
741 bool Thread::owns_locks_but_compiled_lock() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
742 for(Monitor *cur = _owned_locks; cur; cur = cur->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
743 if (cur != Compile_lock) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
744 }
a61af66fc99e Initial load
duke
parents:
diff changeset
745 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
747
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
750
a61af66fc99e Initial load
duke
parents:
diff changeset
751 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753 // The flag: potential_vm_operation notifies if this particular safepoint state could potential
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // invoke the vm-thread (i.e., and oop allocation). In that case, we also have to make sure that
a61af66fc99e Initial load
duke
parents:
diff changeset
755 // no threads which allow_vm_block's are held
a61af66fc99e Initial load
duke
parents:
diff changeset
756 void Thread::check_for_valid_safepoint_state(bool potential_vm_operation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
757 // Check if current thread is allowed to block at a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
758 if (!(_allow_safepoint_count == 0))
a61af66fc99e Initial load
duke
parents:
diff changeset
759 fatal("Possible safepoint reached by thread that does not allow it");
a61af66fc99e Initial load
duke
parents:
diff changeset
760 if (is_Java_thread() && ((JavaThread*)this)->thread_state() != _thread_in_vm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
761 fatal("LEAF method calling lock?");
a61af66fc99e Initial load
duke
parents:
diff changeset
762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
763
a61af66fc99e Initial load
duke
parents:
diff changeset
764 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
765 if (potential_vm_operation && is_Java_thread()
a61af66fc99e Initial load
duke
parents:
diff changeset
766 && !Universe::is_bootstrapping()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
767 // Make sure we do not hold any locks that the VM thread also uses.
a61af66fc99e Initial load
duke
parents:
diff changeset
768 // This could potentially lead to deadlocks
a61af66fc99e Initial load
duke
parents:
diff changeset
769 for(Monitor *cur = _owned_locks; cur; cur = cur->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
770 // Threads_lock is special, since the safepoint synchronization will not start before this is
a61af66fc99e Initial load
duke
parents:
diff changeset
771 // acquired. Hence, a JavaThread cannot be holding it at a safepoint. So is VMOperationRequest_lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
772 // since it is used to transfer control between JavaThreads and the VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // Do not *exclude* any locks unless you are absolutly sure it is correct. Ask someone else first!
a61af66fc99e Initial load
duke
parents:
diff changeset
774 if ( (cur->allow_vm_block() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
775 cur != Threads_lock &&
a61af66fc99e Initial load
duke
parents:
diff changeset
776 cur != Compile_lock && // Temporary: should not be necessary when we get spearate compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
777 cur != VMOperationRequest_lock &&
a61af66fc99e Initial load
duke
parents:
diff changeset
778 cur != VMOperationQueue_lock) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
779 cur->rank() == Mutex::special) {
a61af66fc99e Initial load
duke
parents:
diff changeset
780 warning("Thread holding lock at safepoint that vm can block on: %s", cur->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
781 }
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 if (GCALotAtAllSafepoints) {
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // We could enter a safepoint here and thus have a gc
a61af66fc99e Initial load
duke
parents:
diff changeset
787 InterfaceSupport::check_gc_alot();
a61af66fc99e Initial load
duke
parents:
diff changeset
788 }
a61af66fc99e Initial load
duke
parents:
diff changeset
789 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
791 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
792
a61af66fc99e Initial load
duke
parents:
diff changeset
793 bool Thread::is_in_stack(address adr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
794 assert(Thread::current() == this, "is_in_stack can only be called from current thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
795 address end = os::current_stack_pointer();
a61af66fc99e Initial load
duke
parents:
diff changeset
796 if (stack_base() >= adr && adr >= end) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
797
a61af66fc99e Initial load
duke
parents:
diff changeset
798 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // We had to move these methods here, because vm threads get into ObjectSynchronizer::enter
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // However, there is a note in JavaThread::is_lock_owned() about the VM threads not being
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // used for compilation in the future. If that change is made, the need for these methods
a61af66fc99e Initial load
duke
parents:
diff changeset
805 // should be revisited, and they should be removed if possible.
a61af66fc99e Initial load
duke
parents:
diff changeset
806
a61af66fc99e Initial load
duke
parents:
diff changeset
807 bool Thread::is_lock_owned(address adr) const {
702
b9fba36710f2 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 669
diff changeset
808 return (_stack_base >= adr && adr >= (_stack_base - _stack_size));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
809 }
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811 bool Thread::set_as_starting_thread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
812 // NOTE: this must be called inside the main thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
813 return os::create_main_thread((JavaThread*)this);
a61af66fc99e Initial load
duke
parents:
diff changeset
814 }
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816 static void initialize_class(symbolHandle class_name, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
817 klassOop klass = SystemDictionary::resolve_or_fail(class_name, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
818 instanceKlass::cast(klass)->initialize(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
819 }
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // Creates the initial ThreadGroup
a61af66fc99e Initial load
duke
parents:
diff changeset
823 static Handle create_initial_thread_group(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
824 klassOop k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_ThreadGroup(), true, CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
825 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
826
a61af66fc99e Initial load
duke
parents:
diff changeset
827 Handle system_instance = klass->allocate_instance_handle(CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
828 {
a61af66fc99e Initial load
duke
parents:
diff changeset
829 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
830 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
831 system_instance,
a61af66fc99e Initial load
duke
parents:
diff changeset
832 klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
833 vmSymbolHandles::object_initializer_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
834 vmSymbolHandles::void_method_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
835 CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
837 Universe::set_system_thread_group(system_instance());
a61af66fc99e Initial load
duke
parents:
diff changeset
838
a61af66fc99e Initial load
duke
parents:
diff changeset
839 Handle main_instance = klass->allocate_instance_handle(CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
840 {
a61af66fc99e Initial load
duke
parents:
diff changeset
841 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
842 Handle string = java_lang_String::create_from_str("main", CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
843 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
844 main_instance,
a61af66fc99e Initial load
duke
parents:
diff changeset
845 klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
846 vmSymbolHandles::object_initializer_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
847 vmSymbolHandles::threadgroup_string_void_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
848 system_instance,
a61af66fc99e Initial load
duke
parents:
diff changeset
849 string,
a61af66fc99e Initial load
duke
parents:
diff changeset
850 CHECK_NH);
a61af66fc99e Initial load
duke
parents:
diff changeset
851 }
a61af66fc99e Initial load
duke
parents:
diff changeset
852 return main_instance;
a61af66fc99e Initial load
duke
parents:
diff changeset
853 }
a61af66fc99e Initial load
duke
parents:
diff changeset
854
a61af66fc99e Initial load
duke
parents:
diff changeset
855 // Creates the initial Thread
a61af66fc99e Initial load
duke
parents:
diff changeset
856 static oop create_initial_thread(Handle thread_group, JavaThread* thread, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
857 klassOop k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_Thread(), true, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
858 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
859 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 java_lang_Thread::set_thread(thread_oop(), thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
862 java_lang_Thread::set_priority(thread_oop(), NormPriority);
a61af66fc99e Initial load
duke
parents:
diff changeset
863 thread->set_threadObj(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
864
a61af66fc99e Initial load
duke
parents:
diff changeset
865 Handle string = java_lang_String::create_from_str("main", CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
866
a61af66fc99e Initial load
duke
parents:
diff changeset
867 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
868 JavaCalls::call_special(&result, thread_oop,
a61af66fc99e Initial load
duke
parents:
diff changeset
869 klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
870 vmSymbolHandles::object_initializer_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
871 vmSymbolHandles::threadgroup_string_void_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
872 thread_group,
a61af66fc99e Initial load
duke
parents:
diff changeset
873 string,
a61af66fc99e Initial load
duke
parents:
diff changeset
874 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
875 return thread_oop();
a61af66fc99e Initial load
duke
parents:
diff changeset
876 }
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 static void call_initializeSystemClass(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
879 klassOop k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_System(), true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
880 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
881
a61af66fc99e Initial load
duke
parents:
diff changeset
882 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 JavaCalls::call_static(&result, klass, vmSymbolHandles::initializeSystemClass_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
884 vmSymbolHandles::void_method_signature(), CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886
1115
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
887 #ifdef KERNEL
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
888 static void set_jkernel_boot_classloader_hook(TRAPS) {
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
889 klassOop k = SystemDictionary::sun_jkernel_DownloadManager_klass();
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
890 instanceKlassHandle klass (THREAD, k);
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
891
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
892 if (k == NULL) {
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
893 // sun.jkernel.DownloadManager may not present in the JDK; just return
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
894 return;
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
895 }
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
896
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
897 JavaValue result(T_VOID);
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
898 JavaCalls::call_static(&result, klass, vmSymbolHandles::setBootClassLoaderHook_name(),
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
899 vmSymbolHandles::void_method_signature(), CHECK);
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
900 }
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
901 #endif // KERNEL
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
902
0
a61af66fc99e Initial load
duke
parents:
diff changeset
903 static void reset_vm_info_property(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
904 // the vm info string
a61af66fc99e Initial load
duke
parents:
diff changeset
905 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
906 const char *vm_info = VM_Version::vm_info_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
907
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // java.lang.System class
a61af66fc99e Initial load
duke
parents:
diff changeset
909 klassOop k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_System(), true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // setProperty arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
913 Handle key_str = java_lang_String::create_from_str("java.vm.info", CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
914 Handle value_str = java_lang_String::create_from_str(vm_info, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // return value
a61af66fc99e Initial load
duke
parents:
diff changeset
917 JavaValue r(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
918
a61af66fc99e Initial load
duke
parents:
diff changeset
919 // public static String setProperty(String key, String value);
a61af66fc99e Initial load
duke
parents:
diff changeset
920 JavaCalls::call_static(&r,
a61af66fc99e Initial load
duke
parents:
diff changeset
921 klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
922 vmSymbolHandles::setProperty_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
923 vmSymbolHandles::string_string_string_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
924 key_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
925 value_str,
a61af66fc99e Initial load
duke
parents:
diff changeset
926 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
927 }
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929
a61af66fc99e Initial load
duke
parents:
diff changeset
930 void JavaThread::allocate_threadObj(Handle thread_group, char* thread_name, bool daemon, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 assert(thread_group.not_null(), "thread group should be specified");
a61af66fc99e Initial load
duke
parents:
diff changeset
932 assert(threadObj() == NULL, "should only create Java thread object once");
a61af66fc99e Initial load
duke
parents:
diff changeset
933
a61af66fc99e Initial load
duke
parents:
diff changeset
934 klassOop k = SystemDictionary::resolve_or_fail(vmSymbolHandles::java_lang_Thread(), true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
935 instanceKlassHandle klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
936 instanceHandle thread_oop = klass->allocate_instance_handle(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938 java_lang_Thread::set_thread(thread_oop(), this);
a61af66fc99e Initial load
duke
parents:
diff changeset
939 java_lang_Thread::set_priority(thread_oop(), NormPriority);
a61af66fc99e Initial load
duke
parents:
diff changeset
940 set_threadObj(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
941
a61af66fc99e Initial load
duke
parents:
diff changeset
942 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
943 if (thread_name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
944 Handle name = java_lang_String::create_from_str(thread_name, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // Thread gets assigned specified name and null target
a61af66fc99e Initial load
duke
parents:
diff changeset
946 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
947 thread_oop,
a61af66fc99e Initial load
duke
parents:
diff changeset
948 klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
949 vmSymbolHandles::object_initializer_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
950 vmSymbolHandles::threadgroup_string_void_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
951 thread_group, // Argument 1
a61af66fc99e Initial load
duke
parents:
diff changeset
952 name, // Argument 2
a61af66fc99e Initial load
duke
parents:
diff changeset
953 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
954 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
955 // Thread gets assigned name "Thread-nnn" and null target
a61af66fc99e Initial load
duke
parents:
diff changeset
956 // (java.lang.Thread doesn't have a constructor taking only a ThreadGroup argument)
a61af66fc99e Initial load
duke
parents:
diff changeset
957 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
958 thread_oop,
a61af66fc99e Initial load
duke
parents:
diff changeset
959 klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
960 vmSymbolHandles::object_initializer_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
961 vmSymbolHandles::threadgroup_runnable_void_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
962 thread_group, // Argument 1
a61af66fc99e Initial load
duke
parents:
diff changeset
963 Handle(), // Argument 2
a61af66fc99e Initial load
duke
parents:
diff changeset
964 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
965 }
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967
a61af66fc99e Initial load
duke
parents:
diff changeset
968 if (daemon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
969 java_lang_Thread::set_daemon(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
970 }
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
973 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
974 }
a61af66fc99e Initial load
duke
parents:
diff changeset
975
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
976 KlassHandle group(this, SystemDictionary::ThreadGroup_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
977 Handle threadObj(this, this->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
978
a61af66fc99e Initial load
duke
parents:
diff changeset
979 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
980 thread_group,
a61af66fc99e Initial load
duke
parents:
diff changeset
981 group,
a61af66fc99e Initial load
duke
parents:
diff changeset
982 vmSymbolHandles::add_method_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
983 vmSymbolHandles::thread_void_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
984 threadObj, // Arg 1
a61af66fc99e Initial load
duke
parents:
diff changeset
985 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
986
a61af66fc99e Initial load
duke
parents:
diff changeset
987
a61af66fc99e Initial load
duke
parents:
diff changeset
988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990 // NamedThread -- non-JavaThread subclasses with multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // uniquely named instances should derive from this.
a61af66fc99e Initial load
duke
parents:
diff changeset
992 NamedThread::NamedThread() : Thread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
993 _name = NULL;
1119
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
994 _processed_thread = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
995 }
a61af66fc99e Initial load
duke
parents:
diff changeset
996
a61af66fc99e Initial load
duke
parents:
diff changeset
997 NamedThread::~NamedThread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
998 if (_name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
999 FREE_C_HEAP_ARRAY(char, _name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 _name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 void NamedThread::set_name(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 guarantee(_name == NULL, "Only get to set name once.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 _name = NEW_C_HEAP_ARRAY(char, max_name_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 guarantee(_name != NULL, "alloc failure");
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 jio_vsnprintf(_name, max_name_len, format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1013
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 // ======= WatcherThread ========
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // The watcher thread exists to simulate timer interrupts. It should
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 // be replaced by an abstraction over whatever native support for
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 // timer interrupts exists on the platform.
a61af66fc99e Initial load
duke
parents:
diff changeset
1019
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 WatcherThread* WatcherThread::_watcher_thread = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 bool WatcherThread::_should_terminate = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1022
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 WatcherThread::WatcherThread() : Thread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 assert(watcher_thread() == NULL, "we can only allocate one WatcherThread");
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 if (os::create_thread(this, os::watcher_thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 _watcher_thread = this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 // Set the watcher thread to the highest OS priority which should not be
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 // used, unless a Java thread with priority java.lang.Thread.MAX_PRIORITY
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // is created. The only normal thread using this priority is the reference
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 // handler thread, which runs for very short intervals only.
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 // If the VMThread's priority is not lower than the WatcherThread profiling
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 // will be inaccurate.
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 os::set_priority(this, MaxPriority);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 if (!DisableStartThread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 os::start_thread(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1040
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 void WatcherThread::run() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 assert(this == watcher_thread(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1043
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 this->record_stack_base_and_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 this->initialize_thread_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 this->set_active_handles(JNIHandleBlock::allocate_block());
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 while(!_should_terminate) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 assert(watcher_thread() == Thread::current(), "thread consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 assert(watcher_thread() == this, "thread consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 // Calculate how long it'll be until the next PeriodicTask work
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // should be done, and sleep that amount of time.
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 const size_t time_to_wait = PeriodicTask::time_to_wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 os::sleep(this, time_to_wait, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1055
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 if (is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 // A fatal error has happened, the error handler(VMError::report_and_die)
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // should abort JVM after creating an error log file. However in some
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 // rare cases, the error handler itself might deadlock. Here we try to
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 // kill JVM if the fatal error handler fails to abort in 2 minutes.
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 // This code is in WatcherThread because WatcherThread wakes up
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // periodically so the fatal error handler doesn't need to do anything;
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // also because the WatcherThread is less likely to crash than other
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
1066
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 if (!ShowMessageBoxOnError
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 && (OnError == NULL || OnError[0] == '\0')
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 && Arguments::abort_hook() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 os::sleep(this, 2 * 60 * 1000, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 fdStream err(defaultStream::output_fd());
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 err.print_raw_cr("# [ timer expired, abort... ]");
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 // skip atexit/vm_exit/vm_abort hooks
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 os::die();
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1077
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // Wake up 5 seconds later, the fatal handler may reset OnError or
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // ShowMessageBoxOnError when it is ready to abort.
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 os::sleep(this, 5 * 1000, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 PeriodicTask::real_time_tick(time_to_wait);
a61af66fc99e Initial load
duke
parents:
diff changeset
1085
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // If we have no more tasks left due to dynamic disenrollment,
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 // shut down the thread since we don't currently support dynamic enrollment
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 if (PeriodicTask::num_tasks() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 _should_terminate = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1092
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // Signal that it is terminated
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 MutexLockerEx mu(Terminator_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 _watcher_thread = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 Terminator_lock->notify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // Thread destructor usually does this..
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 ThreadLocalStorage::set_thread(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1103
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 void WatcherThread::start() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 if (watcher_thread() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 _should_terminate = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // Create the single instance of WatcherThread
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 new WatcherThread();
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1111
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 void WatcherThread::stop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 // it is ok to take late safepoints here, if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 MutexLocker mu(Terminator_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 _should_terminate = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 while(watcher_thread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 // This wait should make safepoint checks, wait without a timeout,
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 // and wait as a suspend-equivalent condition.
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 // Note: If the FlatProfiler is running, then this thread is waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 // for the WatcherThread to terminate and the WatcherThread, via the
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 // FlatProfiler task, is waiting for the external suspend request on
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 // this thread to complete. wait_for_ext_suspend_completion() will
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 // eventually timeout, but that takes time. Making this wait a
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // suspend-equivalent condition solves that timeout problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 Terminator_lock->wait(!Mutex::_no_safepoint_check_flag, 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 Mutex::_as_suspend_equivalent_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1131
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 void WatcherThread::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 st->print("\"%s\" ", name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 Thread::print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1137
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 // ======= JavaThread ========
a61af66fc99e Initial load
duke
parents:
diff changeset
1139
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 // A JavaThread is a normal Java thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 void JavaThread::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // Initialize fields
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1144
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1145 // Set the claimed par_id to -1 (ie not claiming any par_ids)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1146 set_claimed_par_id(-1);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1147
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 set_saved_exception_pc(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 set_threadObj(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 _anchor.clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 set_entry_point(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 set_jni_functions(jni_functions());
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 set_callee_target(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 set_vm_result(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 set_vm_result_2(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 set_vframe_array_head(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 set_vframe_array_last(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 set_deferred_locals(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 set_deopt_mark(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 clear_must_deopt_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 set_monitor_chunks(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 set_next(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 set_thread_state(_thread_new);
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 _terminated = _not_terminated;
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 _privileged_stack_top = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 _array_for_gc = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 _suspend_equivalent = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 _in_deopt_handler = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 _doing_unsafe_access = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 _stack_guard_state = stack_guard_unused;
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 _exception_oop = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 _exception_pc = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 _exception_handler_pc = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 _exception_stack_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 _jvmti_thread_state= NULL;
1213
6deeaebad47a 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 1166
diff changeset
1176 _should_post_on_exceptions_flag = JNI_FALSE;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 _jvmti_get_loaded_classes_closure = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 _interp_only_mode = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 _special_runtime_exit_condition = _no_async_condition;
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 _pending_async_exception = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 _is_compiling = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 _thread_stat = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 _thread_stat = new ThreadStatistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 _blocked_on_compilation = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 _jni_active_critical = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 _do_not_unlock_if_synchronized = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 _cached_monitor_info = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 _parker = Parker::Allocate(this) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1189
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 _jmp_ring_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 for (int ji = 0 ; ji < jump_ring_buffer_size ; ji++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 record_jump(NULL, NULL, NULL, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 #endif /* PRODUCT */
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 set_thread_profiler(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 if (FlatProfiler::is_active()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 // This is where we would decide to either give each thread it's own profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 // or use one global one from FlatProfiler,
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 // or up to some count of the number of profiled threads, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 ThreadProfiler* pp = new ThreadProfiler();
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 pp->engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 set_thread_profiler(pp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1206
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 // Setup safepoint state info for this thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 ThreadSafepointState::create(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1209
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 debug_only(_java_call_counter = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 // JVMTI PopFrame support
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 _popframe_condition = popframe_inactive;
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 _popframe_preserved_args = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 _popframe_preserved_args_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 pd_initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1219
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1220 #ifndef SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1221 SATBMarkQueueSet JavaThread::_satb_mark_queue_set;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1222 DirtyCardQueueSet JavaThread::_dirty_card_queue_set;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1223 #endif // !SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1224
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1225 JavaThread::JavaThread(bool is_attaching) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1226 Thread()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1227 #ifndef SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1228 , _satb_mark_queue(&_satb_mark_queue_set),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1229 _dirty_card_queue(&_dirty_card_queue_set)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1230 #endif // !SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1231 {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 _is_attaching = is_attaching;
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 997
diff changeset
1234 assert(_deferred_card_mark.is_empty(), "Default MemRegion ctor");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1236
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 bool JavaThread::reguard_stack(address cur_sp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 if (_stack_guard_state != stack_guard_yellow_disabled) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 return true; // Stack already guarded or guard pages not needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1241
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 if (register_stack_overflow()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 // For those architectures which have separate register and
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 // memory stacks, we must check the register stack to see if
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 // it has overflowed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1248
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 // Java code never executes within the yellow zone: the latter is only
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 // there to provoke an exception during stack banging. If java code
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 // is executing there, either StackShadowPages should be larger, or
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // some exception code in c1, c2 or the interpreter isn't unwinding
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 // when it should.
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 guarantee(cur_sp > stack_yellow_zone_base(), "not enough space to reguard - increase StackShadowPages");
a61af66fc99e Initial load
duke
parents:
diff changeset
1255
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 enable_stack_yellow_zone();
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1259
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 bool JavaThread::reguard_stack(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 return reguard_stack(os::current_stack_pointer());
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1263
a61af66fc99e Initial load
duke
parents:
diff changeset
1264
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 void JavaThread::block_if_vm_exited() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 if (_terminated == _vm_exited) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 // _vm_exited is set at safepoint, and Threads_lock is never released
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 // we will block here forever
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 Threads_lock->lock_without_safepoint_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1273
a61af66fc99e Initial load
duke
parents:
diff changeset
1274
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 // Remove this ifdef when C1 is ported to the compiler interface.
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 static void compiler_thread_entry(JavaThread* thread, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
1277
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1278 JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1279 Thread()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1280 #ifndef SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1281 , _satb_mark_queue(&_satb_mark_queue_set),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1282 _dirty_card_queue(&_dirty_card_queue_set)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1283 #endif // !SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
1284 {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 if (TraceThreadEvents) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 tty->print_cr("creating thread %p", this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 _is_attaching = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 set_entry_point(entry_point);
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 // Create the native thread itself.
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 // %note runtime_23
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 os::ThreadType thr_type = os::java_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread :
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 os::java_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 os::create_thread(this, thr_type, stack_sz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1297
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 // The _osthread may be NULL here because we ran out of memory (too many threads active).
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 // We need to throw and OutOfMemoryError - however we cannot do this here because the caller
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 // may hold a lock and all locks must be unlocked before throwing the exception (throwing
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 // the exception consists of creating the exception object & initializing it, initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 // will leave the VM via a JavaCall and then all locks must be unlocked).
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 // The thread is still suspended when we reach here. Thread must be explicit started
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 // by creator! Furthermore, the thread must also explicitly be added to the Threads list
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 // by calling Threads:add. The reason why this is not done here, is because the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 // object must be fully initialized (take a look at JVM_Start)
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1309
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 JavaThread::~JavaThread() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 if (TraceThreadEvents) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 tty->print_cr("terminate thread %p", this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1314
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 // JSR166 -- return the parker to the free list
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 Parker::Release(_parker);
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 _parker = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1318
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 // Free any remaining previous UnrollBlock
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 vframeArray* old_array = vframe_array_last();
a61af66fc99e Initial load
duke
parents:
diff changeset
1321
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 if (old_array != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 Deoptimization::UnrollBlock* old_info = old_array->unroll_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 old_array->set_unroll_block(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 delete old_info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 delete old_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1328
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 GrowableArray<jvmtiDeferredLocalVariableSet*>* deferred = deferred_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 if (deferred != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 // This can only happen if thread is destroyed before deoptimization occurs.
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 assert(deferred->length() != 0, "empty array!");
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 jvmtiDeferredLocalVariableSet* dlv = deferred->at(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 deferred->remove_at(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 // individual jvmtiDeferredLocalVariableSet are CHeapObj's
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 delete dlv;
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 } while (deferred->length() != 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 delete deferred;
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1341
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 // All Java related clean up happens in exit
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 ThreadSafepointState::destroy(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 if (_thread_profiler != NULL) delete _thread_profiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 if (_thread_stat != NULL) delete _thread_stat;
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1347
a61af66fc99e Initial load
duke
parents:
diff changeset
1348
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 // The first routine called by a new Java thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 void JavaThread::run() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 // initialize thread-local alloc buffer related fields
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 this->initialize_tlab();
a61af66fc99e Initial load
duke
parents:
diff changeset
1353
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 // used to test validitity of stack trace backs
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 this->record_base_of_stack_pointer();
a61af66fc99e Initial load
duke
parents:
diff changeset
1356
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 // Record real stack base and size.
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 this->record_stack_base_and_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1359
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 // Initialize thread local storage; set before calling MutexLocker
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 this->initialize_thread_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1362
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 this->create_stack_guard_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
1364
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 // Thread is now sufficient initialized to be handled by the safepoint code as being
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 // in the VM. Change thread state from _thread_new to _thread_in_vm
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 ThreadStateTransition::transition_and_fence(this, _thread_new, _thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1368
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 assert(JavaThread::current() == this, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 assert(!Thread::current()->owns_locks(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1371
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 DTRACE_THREAD_PROBE(start, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1373
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 // This operation might block. We call that after all safepoint checks for a new thread has
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 // been completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 this->set_active_handles(JNIHandleBlock::allocate_block());
a61af66fc99e Initial load
duke
parents:
diff changeset
1377
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 JvmtiExport::post_thread_start(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1381
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 // We call another function to do the rest so we are sure that the stack addresses used
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 // from there will be lower than the stack base just computed
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 thread_main_inner();
a61af66fc99e Initial load
duke
parents:
diff changeset
1385
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 // Note, thread is no longer valid at this point!
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 void JavaThread::thread_main_inner() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 assert(JavaThread::current() == this, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 assert(this->threadObj() != NULL, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1393
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 // Execute thread entry point. If this thread is being asked to restart,
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 // or has been stopped before starting, do not reexecute entry point.
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 // Note: Due to JVM_StopThread we can have pending exceptions already!
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 if (!this->has_pending_exception() && !java_lang_Thread::is_stillborn(this->threadObj())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 // enter the thread's entry point only if we have no pending exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 HandleMark hm(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 this->entry_point()(this, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1402
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 DTRACE_THREAD_PROBE(stop, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1404
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 this->exit(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 delete this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1408
a61af66fc99e Initial load
duke
parents:
diff changeset
1409
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 static void ensure_join(JavaThread* thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 // We do not need to grap the Threads_lock, since we are operating on ourself.
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 Handle threadObj(thread, thread->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 assert(threadObj.not_null(), "java thread object must exist");
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 ObjectLocker lock(threadObj, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 // Ignore pending exception (ThreadDeath), since we are exiting anyway
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 thread->clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 // It is of profound importance that we set the stillborn bit and reset the thread object,
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 // before we do the notify. Since, changing these two variable will make JVM_IsAlive return
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 // false. So in case another thread is doing a join on this thread , it will detect that the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 // is dead when it gets notified.
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 java_lang_Thread::set_stillborn(threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 // Thread is exiting. So set thread_status field in java.lang.Thread class to TERMINATED.
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED);
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 java_lang_Thread::set_thread(threadObj(), NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 lock.notify_all(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 // Ignore pending exception (ThreadDeath), since we are exiting anyway
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 thread->clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1429
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1430
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 // For any new cleanup additions, please check to see if they need to be applied to
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 // cleanup_failed_attach_current_thread as well.
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 void JavaThread::exit(bool destroy_vm, ExitType exit_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 assert(this == JavaThread::current(), "thread consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 if (!InitializeJavaLangSystem) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1436
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 HandleMark hm(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 Handle uncaught_exception(this, this->pending_exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 this->clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 Handle threadObj(this, this->threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 assert(threadObj.not_null(), "Java thread object should be created");
a61af66fc99e Initial load
duke
parents:
diff changeset
1442
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 if (get_thread_profiler() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 get_thread_profiler()->disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 get_thread_profiler()->print(get_thread_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1448
a61af66fc99e Initial load
duke
parents:
diff changeset
1449
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 // FIXIT: This code should be moved into else part, when reliable 1.2/1.3 check is in place
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1453
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 // FIXIT: The is_null check is only so it works better on JDK1.2 VM's. This
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 // has to be fixed by a runtime query method
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 if (!destroy_vm || JDK_Version::is_jdk12x_version()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 // JSR-166: change call from from ThreadGroup.uncaughtException to
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 // java.lang.Thread.dispatchUncaughtException
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 if (uncaught_exception.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 Handle group(this, java_lang_Thread::threadGroup(threadObj()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 Events::log("uncaught exception INTPTR_FORMAT " " INTPTR_FORMAT " " INTPTR_FORMAT",
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 (address)uncaught_exception(), (address)threadObj(), (address)group());
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 // Check if the method Thread.dispatchUncaughtException() exists. If so
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 // call it. Otherwise we have an older library without the JSR-166 changes,
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 // so call ThreadGroup.uncaughtException()
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 KlassHandle recvrKlass(THREAD, threadObj->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 CallInfo callinfo;
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1472 KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 LinkResolver::resolve_virtual_call(callinfo, threadObj, recvrKlass, thread_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 vmSymbolHandles::dispatchUncaughtException_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 vmSymbolHandles::throwable_void_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 KlassHandle(), false, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 methodHandle method = callinfo.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 if (method.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 threadObj, thread_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 vmSymbolHandles::dispatchUncaughtException_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 vmSymbolHandles::throwable_void_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 uncaught_exception,
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 } else {
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1488 KlassHandle thread_group(THREAD, SystemDictionary::ThreadGroup_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 group, thread_group,
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 vmSymbolHandles::uncaughtException_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 vmSymbolHandles::thread_throwable_void_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 threadObj, // Arg 1
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 uncaught_exception, // Arg 2
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1501
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 // Call Thread.exit(). We try 3 times in case we got another Thread.stop during
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 // the execution of the method. If that is not enough, then we don't really care. Thread.stop
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 // is deprecated anyhow.
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 { int count = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 while (java_lang_Thread::threadGroup(threadObj()) != NULL && (count-- > 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 JavaValue result(T_VOID);
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1509 KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 threadObj, thread_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 vmSymbolHandles::exit_method_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 vmSymbolHandles::void_method_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1518
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 // notify JVMTI
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 JvmtiExport::post_thread_end(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1523
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 // We have notified the agents that we are exiting, before we go on,
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 // we must check for a pending external suspend request and honor it
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 // in order to not surprise the thread that made the suspend request.
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 if (!is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 set_terminated(_thread_exiting);
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 ThreadService::current_thread_exiting(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 // Implied else:
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 // Things get a little tricky here. We have a pending external
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 // suspend request, but we are holding the SR_lock so we
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 // can't just self-suspend. So we temporarily drop the lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 // and then self-suspend.
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1541
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 ThreadBlockInVM tbivm(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 java_suspend_self();
a61af66fc99e Initial load
duke
parents:
diff changeset
1544
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 // We're done with this suspend request, but we have to loop around
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 // and check again. Eventually we will get SR_lock without a pending
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 // external suspend request and will be able to mark ourselves as
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 // exiting.
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 // no more external suspends are allowed at this point
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 // before_exit() has already posted JVMTI THREAD_END events
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1554
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 // Notify waiters on thread object. This has to be done after exit() is called
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 // on the thread (if the thread is the last thread in a daemon ThreadGroup the
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 // group should have the destroyed bit set before waiters are notified).
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 ensure_join(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 assert(!this->has_pending_exception(), "ensure_join should have cleared");
a61af66fc99e Initial load
duke
parents:
diff changeset
1560
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 // 6282335 JNI DetachCurrentThread spec states that all Java monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 // held by this thread must be released. A detach operation must only
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 // get here if there are no Java frames on the stack. Therefore, any
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 // owned monitors at this point MUST be JNI-acquired monitors which are
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 // pre-inflated and in the monitor cache.
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 // ensure_join() ignores IllegalThreadStateExceptions, and so does this.
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 if (exit_type == jni_detach && JNIDetachReleasesMonitors) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 assert(!this->has_last_Java_frame(), "detaching with Java frames?");
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 ObjectSynchronizer::release_monitors_owned_by_thread(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 assert(!this->has_pending_exception(), "release_monitors should have cleared");
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1573
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 // These things needs to be done while we are still a Java Thread. Make sure that thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 // is in a consistent state, in case GC happens
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 assert(_privileged_stack_top == NULL, "must be NULL when we get here");
a61af66fc99e Initial load
duke
parents:
diff changeset
1577
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 if (active_handles() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 JNIHandleBlock* block = active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 set_active_handles(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 JNIHandleBlock::release_block(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1583
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 if (free_handle_block() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 JNIHandleBlock* block = free_handle_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 set_free_handle_block(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 JNIHandleBlock::release_block(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1589
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 // These have to be removed while this is still a valid thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 remove_stack_guard_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
1592
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 if (UseTLAB) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 tlab().make_parsable(true); // retire TLAB
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1596
49
31000d79ec71 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 0
diff changeset
1597 if (jvmti_thread_state() != NULL) {
31000d79ec71 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 0
diff changeset
1598 JvmtiExport::cleanup_thread(this);
31000d79ec71 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 0
diff changeset
1599 }
31000d79ec71 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 0
diff changeset
1600
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1601 #ifndef SERIALGC
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1602 // We must flush G1-related buffers before removing a thread from
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1603 // the list of active threads.
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1604 if (UseG1GC) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1605 flush_barrier_queues();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1606 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1607 #endif
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1608
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 // Remove from list of active threads list, and notify VM thread if we are the last non-daemon thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 Threads::remove(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1612
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1613 #ifndef SERIALGC
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1614 // Flush G1-related queues.
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1615 void JavaThread::flush_barrier_queues() {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1616 satb_mark_queue().flush();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1617 dirty_card_queue().flush();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1618 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1619 #endif
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1620
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 void JavaThread::cleanup_failed_attach_current_thread() {
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1622 if (get_thread_profiler() != NULL) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1623 get_thread_profiler()->disengage();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1624 ResourceMark rm;
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1625 get_thread_profiler()->print(get_thread_name());
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1626 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1627
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1628 if (active_handles() != NULL) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1629 JNIHandleBlock* block = active_handles();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1630 set_active_handles(NULL);
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1631 JNIHandleBlock::release_block(block);
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1632 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1633
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1634 if (free_handle_block() != NULL) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1635 JNIHandleBlock* block = free_handle_block();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1636 set_free_handle_block(NULL);
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1637 JNIHandleBlock::release_block(block);
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1638 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1639
1290
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1213
diff changeset
1640 // These have to be removed while this is still a valid thread.
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1213
diff changeset
1641 remove_stack_guard_pages();
c8a467bf56ad 6914050: jvm assertion "guard pages must be in use" in -Xcomp mode
coleenp
parents: 1213
diff changeset
1642
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1643 if (UseTLAB) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1644 tlab().make_parsable(true); // retire TLAB, if any
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1645 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1646
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1647 #ifndef SERIALGC
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1648 if (UseG1GC) {
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1649 flush_barrier_queues();
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1650 }
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1651 #endif
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1652
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1653 Threads::remove(this);
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1654 delete this;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1656
a61af66fc99e Initial load
duke
parents:
diff changeset
1657
441
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1658
da9cb4e97a5f 6770608: G1: Mutator thread can flush barrier and satb queues during safepoint
iveresov
parents: 383
diff changeset
1659
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 JavaThread* JavaThread::active() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 Thread* thread = ThreadLocalStorage::thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 assert(thread != NULL, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 if (thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 return (JavaThread*) thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 assert(thread->is_VM_thread(), "this must be a vm thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 VM_Operation* op = ((VMThread*) thread)->vm_operation();
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 JavaThread *ret=op == NULL ? NULL : (JavaThread *)op->calling_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 assert(ret->is_Java_thread(), "must be a Java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1673
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 bool JavaThread::is_lock_owned(address adr) const {
702
b9fba36710f2 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 669
diff changeset
1675 if (Thread::is_lock_owned(adr)) return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1676
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 for (MonitorChunk* chunk = monitor_chunks(); chunk != NULL; chunk = chunk->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 if (chunk->contains(adr)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1680
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1683
a61af66fc99e Initial load
duke
parents:
diff changeset
1684
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 void JavaThread::add_monitor_chunk(MonitorChunk* chunk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 chunk->set_next(monitor_chunks());
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 set_monitor_chunks(chunk);
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1689
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 void JavaThread::remove_monitor_chunk(MonitorChunk* chunk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 guarantee(monitor_chunks() != NULL, "must be non empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 if (monitor_chunks() == chunk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 set_monitor_chunks(chunk->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 MonitorChunk* prev = monitor_chunks();
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 while (prev->next() != chunk) prev = prev->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 prev->set_next(chunk->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1700
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 // JVM support.
a61af66fc99e Initial load
duke
parents:
diff changeset
1702
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 // Note: this function shouldn't block if it's called in
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 // _thread_in_native_trans state (such as from
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 // check_special_condition_for_native_trans()).
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 void JavaThread::check_and_handle_async_exceptions(bool check_unsafe_error) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1707
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 if (has_last_Java_frame() && has_async_condition()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 // If we are at a polling page safepoint (not a poll return)
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 // then we must defer async exception because live registers
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 // will be clobbered by the exception path. Poll return is
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 // ok because the call we a returning from already collides
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 // with exception handling registers and so there is no issue.
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 // (The exception handling path kills call result registers but
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 // this is ok since the exception kills the result anyway).
a61af66fc99e Initial load
duke
parents:
diff changeset
1716
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 if (is_at_poll_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 // if the code we are returning to has deoptimized we must defer
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 // the exception otherwise live registers get clobbered on the
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 // exception path before deoptimization is able to retrieve them.
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 RegisterMap map(this, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 frame caller_fr = last_frame().sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 assert(caller_fr.is_compiled_frame(), "what?");
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 if (caller_fr.is_deoptimized_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 tty->print_cr("deferred async exception at compiled safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1734
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 JavaThread::AsyncRequests condition = clear_special_runtime_exit_condition();
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 if (condition == _no_async_condition) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 // Conditions have changed since has_special_runtime_exit_condition()
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 // was called:
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 // - if we were here only because of an external suspend request,
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 // then that was taken care of above (or cancelled) so we are done
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 // - if we were here because of another async request, then it has
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 // been cleared between the has_special_runtime_exit_condition()
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 // and now so again we are done
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1746
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 // Check for pending async. exception
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 if (_pending_async_exception != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 // Only overwrite an already pending exception, if it is not a threadDeath.
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1750 if (!has_pending_exception() || !pending_exception()->is_a(SystemDictionary::ThreadDeath_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1751
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 // We cannot call Exceptions::_throw(...) here because we cannot block
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 set_pending_exception(_pending_async_exception, __FILE__, __LINE__);
a61af66fc99e Initial load
duke
parents:
diff changeset
1754
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 tty->print("Async. exception installed at runtime exit (" INTPTR_FORMAT ")", this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 if (has_last_Java_frame() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 frame f = last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 tty->print(" (pc: " INTPTR_FORMAT " sp: " INTPTR_FORMAT " )", f.pc(), f.sp());
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 tty->print_cr(" of type: %s", instanceKlass::cast(_pending_async_exception->klass())->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 _pending_async_exception = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 clear_has_async_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1768
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 if (check_unsafe_error &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 condition == _async_unsafe_access_error && !has_pending_exception()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 condition = _no_async_condition; // done
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 switch (thread_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 case _thread_in_vm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 JavaThread* THREAD = this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in an unsafe memory access operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 case _thread_in_native:
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 ThreadInVMfromNative tiv(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 JavaThread* THREAD = this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in an unsafe memory access operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 case _thread_in_Java:
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 ThreadInVMfromJava tiv(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 JavaThread* THREAD = this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 THROW_MSG(vmSymbols::java_lang_InternalError(), "a fault occurred in a recent unsafe memory access operation in compiled Java code");
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1794
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 assert(condition == _no_async_condition || has_pending_exception() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 (!check_unsafe_error && condition == _async_unsafe_access_error),
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 "must have handled the async condition, if no exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1799
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 void JavaThread::handle_special_runtime_exit_condition(bool check_asyncs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 // Check for pending external suspend. Internal suspend requests do
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 // not use handle_special_runtime_exit_condition().
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 // If JNIEnv proxies are allowed, don't self-suspend if the target
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 // thread is not the current thread. In older versions of jdbx, jdbx
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 // threads could call into the VM with another thread's JNIEnv so we
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 // can be here operating on behalf of a suspended thread (4432884).
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 bool do_self_suspend = is_external_suspend_with_lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 if (do_self_suspend && (!AllowJNIEnvProxy || this == JavaThread::current())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 // Because thread is external suspended the safepoint code will count
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 // thread as at a safepoint. This can be odd because we can be here
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 // as _thread_in_Java which would normally transition to _thread_blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 // at a safepoint. We would like to mark the thread as _thread_blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 // before calling java_suspend_self like all other callers of it but
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 // we must then observe proper safepoint protocol. (We can't leave
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 // _thread_blocked with a safepoint in progress). However we can be
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 // here as _thread_in_native_trans so we can't use a normal transition
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 // constructor/destructor pair because they assert on that type of
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 // transition. We could do something like:
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 // JavaThreadState state = thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 // set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 // {
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 // ThreadBlockInVM tbivm(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 // java_suspend_self()
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 // set_thread_state(_thread_in_vm_trans);
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 // if (safepoint) block;
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 // set_thread_state(state);
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 // but that is pretty messy. Instead we just go with the way the
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 // code has worked before and note that this is the only path to
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 // java_suspend_self that doesn't put the thread in _thread_blocked
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 // mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
1836
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 frame_anchor()->make_walkable(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 java_suspend_self();
a61af66fc99e Initial load
duke
parents:
diff changeset
1839
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 // We might be here for reasons in addition to the self-suspend request
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 // so check for other async requests.
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1843
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 if (check_asyncs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 check_and_handle_async_exceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1848
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 void JavaThread::send_thread_stop(oop java_throwable) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 assert(Thread::current()->is_VM_thread(), "should be in the vm thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 assert(Threads_lock->is_locked(), "Threads_lock should be locked by safepoint code");
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 assert(SafepointSynchronize::is_at_safepoint(), "all threads are stopped");
a61af66fc99e Initial load
duke
parents:
diff changeset
1853
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 // Do not throw asynchronous exceptions against the compiler thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 // (the compiler thread should not be a Java thread -- fix in 1.4.2)
1410
b30a2cd5e3a2 Added methods to c1x_VMExits.cpp
Thomas Wuerthinger <thomas.wuerthinger@gmail.com>
parents: 1320
diff changeset
1856
b30a2cd5e3a2 Added methods to c1x_VMExits.cpp
Thomas Wuerthinger <thomas.wuerthinger@gmail.com>
parents: 1320
diff changeset
1857 // (tw) May we do this?
b30a2cd5e3a2 Added methods to c1x_VMExits.cpp
Thomas Wuerthinger <thomas.wuerthinger@gmail.com>
parents: 1320
diff changeset
1858 //if (is_Compiler_thread()) return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1859
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 // This is a change from JDK 1.1, but JDK 1.2 will also do it:
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1861 if (java_throwable->is_a(SystemDictionary::ThreadDeath_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 java_lang_Thread::set_stillborn(threadObj());
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1864
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 // Actually throw the Throwable against the target Thread - however
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 // only if there is no thread death exception installed already.
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1868 if (_pending_async_exception == NULL || !_pending_async_exception->is_a(SystemDictionary::ThreadDeath_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 // If the topmost frame is a runtime stub, then we are calling into
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 // OptoRuntime from compiled code. Some runtime stubs (new, monitor_exit..)
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 // must deoptimize the caller before continuing, as the compiled exception handler table
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 // may not be valid
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 if (has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 frame f = last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 if (f.is_runtime_frame() || f.is_safepoint_blob_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 RegisterMap reg_map(this, UseBiasedLocking);
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 frame compiled_frame = f.sender(&reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 if (compiled_frame.can_be_deoptimized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 Deoptimization::deoptimize(this, compiled_frame, &reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1884
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 // Set async. pending exception in thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 set_pending_async_exception(java_throwable);
a61af66fc99e Initial load
duke
parents:
diff changeset
1887
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 if (TraceExceptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 tty->print_cr("Pending Async. exception installed of type: %s", instanceKlass::cast(_pending_async_exception->klass())->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 // for AbortVMOnException flag
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 NOT_PRODUCT(Exceptions::debug_check_abort(instanceKlass::cast(_pending_async_exception->klass())->external_name()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1896
a61af66fc99e Initial load
duke
parents:
diff changeset
1897
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 // Interrupt thread so it will wake up from a potential wait()
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 Thread::interrupt(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1901
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 // External suspension mechanism.
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 // Tell the VM to suspend a thread when ever it knows that it does not hold on
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 // to any VM_locks and it is at a transition
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 // Self-suspension will happen on the transition out of the vm.
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 // Catch "this" coming in from JNIEnv pointers when the thread has been freed
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 // Guarantees on return:
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 // + Target thread will not execute any new bytecode (that's why we need to
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 // force a safepoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 // + Target thread will not enter any new monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 void JavaThread::java_suspend() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 { MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 if (!Threads::includes(this) || is_exiting() || this->threadObj() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1920
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 { MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 if (!is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 // a racing resume has cancelled us; bail out now
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1926
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 // suspend is done
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 uint32_t debug_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 // Warning: is_ext_suspend_completed() may temporarily drop the
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 // SR_lock to allow the thread to reach a stable thread state if
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 // it is currently in a transient thread state.
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 if (is_ext_suspend_completed(false /* !called_by_wait */,
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 SuspendRetryDelay, &debug_bits) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1937
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 VM_ForceSafepoint vm_suspend;
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 VMThread::execute(&vm_suspend);
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1941
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 // Part II of external suspension.
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 // A JavaThread self suspends when it detects a pending external suspend
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 // request. This is usually on transitions. It is also done in places
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 // where continuing to the next transition would surprise the caller,
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 // e.g., monitor entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 // Returns the number of times that the thread self-suspended.
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 // Note: DO NOT call java_suspend_self() when you just want to block current
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 // thread. java_suspend_self() is the second stage of cooperative
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 // suspension for external suspend requests and should only be used
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 // to complete an external suspend request.
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 int JavaThread::java_suspend_self() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 int ret = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1957
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 // we are in the process of exiting so don't suspend
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 if (is_exiting()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 clear_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1963
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 assert(_anchor.walkable() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 (is_Java_thread() && !((JavaThread*)this)->has_last_Java_frame()),
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 "must have walkable stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
1967
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1969
979
87770dcf831b 6876794: 4/4 sp07t002 hangs very intermittently
dcubed
parents: 844
diff changeset
1970 assert(!this->is_ext_suspended(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 "a thread trying to self-suspend should not already be suspended");
a61af66fc99e Initial load
duke
parents:
diff changeset
1972
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 if (this->is_suspend_equivalent()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 // If we are self-suspending as a result of the lifting of a
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 // suspend equivalent condition, then the suspend_equivalent
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 // flag is not cleared until we set the ext_suspended flag so
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 // that wait_for_ext_suspend_completion() returns consistent
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 // results.
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 this->clear_suspend_equivalent();
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1981
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 // A racing resume may have cancelled us before we grabbed SR_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 // above. Or another external suspend request could be waiting for us
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 // by the time we return from SR_lock()->wait(). The thread
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 // that requested the suspension may already be trying to walk our
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 // stack and if we return now, we can change the stack out from under
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 // it. This would be a "bad thing (TM)" and cause the stack walker
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 // to crash. We stay self-suspended until there are no more pending
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 // external suspend requests.
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 while (is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 ret++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 this->set_ext_suspended();
a61af66fc99e Initial load
duke
parents:
diff changeset
1993
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 // _ext_suspended flag is cleared by java_resume()
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 while (is_ext_suspended()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 this->SR_lock()->wait(Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1999
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 return ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2002
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 // verify the JavaThread has not yet been published in the Threads::list, and
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 // hence doesn't need protection from concurrent access at this stage
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 void JavaThread::verify_not_published() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 if (!Threads_lock->owned_by_self()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 MutexLockerEx ml(Threads_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 assert( !Threads::includes(this),
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 "java thread shouldn't have been published yet!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 assert( !Threads::includes(this),
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 "java thread shouldn't have been published yet!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2018
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 // Slow path when the native==>VM/Java barriers detect a safepoint is in
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 // progress or when _suspend_flags is non-zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 // Current thread needs to self-suspend if there is a suspend request and/or
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 // block if a safepoint is in progress.
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 // Async exception ISN'T checked.
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 // Note only the ThreadInVMfromNative transition can call this function
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 // directly and when thread state is _thread_in_native_trans
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 void JavaThread::check_safepoint_and_suspend_for_native_trans(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 assert(thread->thread_state() == _thread_in_native_trans, "wrong state");
a61af66fc99e Initial load
duke
parents:
diff changeset
2028
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 JavaThread *curJT = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 bool do_self_suspend = thread->is_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
2031
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 assert(!curJT->has_last_Java_frame() || curJT->frame_anchor()->walkable(), "Unwalkable stack in native->vm transition");
a61af66fc99e Initial load
duke
parents:
diff changeset
2033
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 // If JNIEnv proxies are allowed, don't self-suspend if the target
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 // thread is not the current thread. In older versions of jdbx, jdbx
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 // threads could call into the VM with another thread's JNIEnv so we
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 // can be here operating on behalf of a suspended thread (4432884).
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 if (do_self_suspend && (!AllowJNIEnvProxy || curJT == thread)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 JavaThreadState state = thread->thread_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
2040
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 // We mark this thread_blocked state as a suspend-equivalent so
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 // that a caller to is_ext_suspend_completed() won't be confused.
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 // The suspend-equivalent state is cleared by java_suspend_self().
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 thread->set_suspend_equivalent();
a61af66fc99e Initial load
duke
parents:
diff changeset
2045
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 // If the safepoint code sees the _thread_in_native_trans state, it will
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 // wait until the thread changes to other thread state. There is no
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 // guarantee on how soon we can obtain the SR_lock and complete the
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 // self-suspend request. It would be a bad idea to let safepoint wait for
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 // too long. Temporarily change the state to _thread_blocked to
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 // let the VM thread know that this thread is ready for GC. The problem
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 // of changing thread state is that safepoint could happen just after
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 // java_suspend_self() returns after being resumed, and VM thread will
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 // see the _thread_blocked state. We must check for safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 // after restoring the state and make sure we won't leave while a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 // is in progress.
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 thread->set_thread_state(_thread_blocked);
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 thread->java_suspend_self();
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 thread->set_thread_state(state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 // Make sure new state is seen by VM thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 if (UseMembar) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 // Force a fence between the write above and read below
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 // Must use this rather than serialization page in particular on Windows
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 InterfaceSupport::serialize_memory(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2071
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 if (SafepointSynchronize::do_call_back()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 // If we are safepointing, then block the caller which may not be
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 // the same as the target thread (see above).
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 SafepointSynchronize::block(curJT);
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2077
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 if (thread->is_deopt_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 thread->clear_deopt_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 RegisterMap map(thread, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 frame f = thread->last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 while ( f.id() != thread->must_deopt_id() && ! f.is_first_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 f = f.sender(&map);
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 if (f.id() == thread->must_deopt_id()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 thread->clear_must_deopt_id();
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 // Since we know we're safe to deopt the current state is a safe state
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 f.deoptimize(thread, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 fatal("missed deoptimization!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2094
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 // Slow path when the native==>VM/Java barriers detect a safepoint is in
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 // progress or when _suspend_flags is non-zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 // Current thread needs to self-suspend if there is a suspend request and/or
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 // block if a safepoint is in progress.
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 // Also check for pending async exception (not including unsafe access error).
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 // Note only the native==>VM/Java barriers can call this function and when
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 // thread state is _thread_in_native_trans.
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 void JavaThread::check_special_condition_for_native_trans(JavaThread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 check_safepoint_and_suspend_for_native_trans(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2104
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 if (thread->has_async_exception()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 // We are in _thread_in_native_trans state, don't handle unsafe
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 // access error since that may block.
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 thread->check_and_handle_async_exceptions(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2111
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 // We need to guarantee the Threads_lock here, since resumes are not
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 // allowed during safepoint synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 // Can only resume from an external suspension
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 void JavaThread::java_resume() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 assert_locked_or_safepoint(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2117
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 // Sanity check: thread is gone, has started exiting or the thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 // was not externally suspended.
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 if (!Threads::includes(this) || is_exiting() || !is_external_suspend()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2123
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 MutexLockerEx ml(SR_lock(), Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
2125
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 clear_external_suspend();
a61af66fc99e Initial load
duke
parents:
diff changeset
2127
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 if (is_ext_suspended()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 clear_ext_suspended();
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 SR_lock()->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2133
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 void JavaThread::create_stack_guard_pages() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 if (! os::uses_stack_guard_pages() || _stack_guard_state != stack_guard_unused) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 address low_addr = stack_base() - stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2138
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 int allocate = os::allocate_stack_guard_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 // warning("Guarding at " PTR_FORMAT " for len " SIZE_FORMAT "\n", low_addr, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
2141
1320
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1290
diff changeset
2142 if (allocate && !os::create_stack_guard_pages((char *) low_addr, len)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 warning("Attempt to allocate stack guard pages failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2146
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 if (os::guard_memory((char *) low_addr, len)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 _stack_guard_state = stack_guard_enabled;
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 warning("Attempt to protect stack guard pages failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 if (os::uncommit_memory((char *) low_addr, len)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 warning("Attempt to deallocate stack guard pages failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2156
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 void JavaThread::remove_stack_guard_pages() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 if (_stack_guard_state == stack_guard_unused) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 address low_addr = stack_base() - stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2161
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 if (os::allocate_stack_guard_pages()) {
1320
3b3d12e645e7 6929067: Stack guard pages should be removed when thread is detached
coleenp
parents: 1290
diff changeset
2163 if (os::remove_stack_guard_pages((char *) low_addr, len)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 _stack_guard_state = stack_guard_unused;
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 warning("Attempt to deallocate stack guard pages failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 if (_stack_guard_state == stack_guard_unused) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 if (os::unguard_memory((char *) low_addr, len)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 _stack_guard_state = stack_guard_unused;
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 warning("Attempt to unprotect stack guard pages failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2177
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 void JavaThread::enable_stack_yellow_zone() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 assert(_stack_guard_state != stack_guard_enabled, "already enabled");
a61af66fc99e Initial load
duke
parents:
diff changeset
2181
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 // The base notation is from the stacks point of view, growing downward.
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 // We need to adjust it to work correctly with guard_memory()
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 address base = stack_yellow_zone_base() - stack_yellow_zone_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2185
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 guarantee(base < stack_base(),"Error calculating stack yellow zone");
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 guarantee(base < os::current_stack_pointer(),"Error calculating stack yellow zone");
a61af66fc99e Initial load
duke
parents:
diff changeset
2188
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 if (os::guard_memory((char *) base, stack_yellow_zone_size())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 _stack_guard_state = stack_guard_enabled;
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 warning("Attempt to guard stack yellow zone failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 enable_register_stack_guard();
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2196
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 void JavaThread::disable_stack_yellow_zone() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 assert(_stack_guard_state != stack_guard_yellow_disabled, "already disabled");
a61af66fc99e Initial load
duke
parents:
diff changeset
2200
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 // Simply return if called for a thread that does not use guard pages.
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 if (_stack_guard_state == stack_guard_unused) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2203
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 // The base notation is from the stacks point of view, growing downward.
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 // We need to adjust it to work correctly with guard_memory()
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 address base = stack_yellow_zone_base() - stack_yellow_zone_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2207
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 if (os::unguard_memory((char *)base, stack_yellow_zone_size())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 _stack_guard_state = stack_guard_yellow_disabled;
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 warning("Attempt to unguard stack yellow zone failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 disable_register_stack_guard();
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2215
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 void JavaThread::enable_stack_red_zone() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 // The base notation is from the stacks point of view, growing downward.
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 // We need to adjust it to work correctly with guard_memory()
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 address base = stack_red_zone_base() - stack_red_zone_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2221
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 guarantee(base < stack_base(),"Error calculating stack red zone");
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 guarantee(base < os::current_stack_pointer(),"Error calculating stack red zone");
a61af66fc99e Initial load
duke
parents:
diff changeset
2224
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 if(!os::guard_memory((char *) base, stack_red_zone_size())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 warning("Attempt to guard stack red zone failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2229
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 void JavaThread::disable_stack_red_zone() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 // The base notation is from the stacks point of view, growing downward.
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 // We need to adjust it to work correctly with guard_memory()
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 assert(_stack_guard_state != stack_guard_unused, "must be using guard pages.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 address base = stack_red_zone_base() - stack_red_zone_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 if (!os::unguard_memory((char *)base, stack_red_zone_size())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 warning("Attempt to unguard stack red zone failed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2239
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 void JavaThread::frames_do(void f(frame*, const RegisterMap* map)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 // ignore is there is no stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 if (!has_last_Java_frame()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 // traverse the stack frames. Starts from top frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 frame* fr = fst.current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 f(fr, fst.register_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2249
a61af66fc99e Initial load
duke
parents:
diff changeset
2250
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 // Deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 // Function for testing deoptimization
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 void JavaThread::deoptimize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 StackFrameStream fst(this, UseBiasedLocking);
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 bool deopt = false; // Dump stack only if a deopt actually happens.
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 bool only_at = strlen(DeoptimizeOnlyAt) > 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 // Iterate over all frames in the thread and deoptimize
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 for(; !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 if(fst.current()->can_be_deoptimized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2262
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 if (only_at) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 // Deoptimize only at particular bcis. DeoptimizeOnlyAt
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 // consists of comma or carriage return separated numbers so
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 // search for the current bci in that string.
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 address pc = fst.current()->pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 nmethod* nm = (nmethod*) fst.current()->cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 ScopeDesc* sd = nm->scope_desc_at( pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 char buffer[8];
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 jio_snprintf(buffer, sizeof(buffer), "%d", sd->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 size_t len = strlen(buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 const char * found = strstr(DeoptimizeOnlyAt, buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 while (found != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 if ((found[len] == ',' || found[len] == '\n' || found[len] == '\0') &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 (found == DeoptimizeOnlyAt || found[-1] == ',' || found[-1] == '\n')) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 // Check that the bci found is bracketed by terminators.
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 found = strstr(found + 1, buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 if (!found) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2286
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 if (DebugDeoptimization && !deopt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 deopt = true; // One-time only print before deopt
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 tty->print_cr("[BEFORE Deoptimization]");
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 trace_frames();
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 trace_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 Deoptimization::deoptimize(this, *fst.current(), fst.register_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2296
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 if (DebugDeoptimization && deopt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 tty->print_cr("[AFTER Deoptimization]");
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 trace_frames();
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2302
a61af66fc99e Initial load
duke
parents:
diff changeset
2303
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 // Make zombies
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 void JavaThread::make_zombies() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 if (fst.current()->can_be_deoptimized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 // it is a Java nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 nmethod* nm = CodeCache::find_nmethod(fst.current()->pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 nm->make_not_entrant();
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2315
a61af66fc99e Initial load
duke
parents:
diff changeset
2316
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 void JavaThread::deoptimized_wrt_marked_nmethods() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 if (!has_last_Java_frame()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 // BiasedLocking needs an updated RegisterMap for the revoke monitors pass
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 StackFrameStream fst(this, UseBiasedLocking);
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 for(; !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 if (fst.current()->should_be_deoptimized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 Deoptimization::deoptimize(this, *fst.current(), fst.register_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2327
a61af66fc99e Initial load
duke
parents:
diff changeset
2328
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 // GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 static void frame_gc_epilogue(frame* f, const RegisterMap* map) { f->gc_epilogue(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2331
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 void JavaThread::gc_epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 frames_do(frame_gc_epilogue);
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2335
a61af66fc99e Initial load
duke
parents:
diff changeset
2336
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 static void frame_gc_prologue(frame* f, const RegisterMap* map) { f->gc_prologue(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2338
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 void JavaThread::gc_prologue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 frames_do(frame_gc_prologue);
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2342
1119
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2343 // If the caller is a NamedThread, then remember, in the current scope,
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2344 // the given JavaThread in its _processed_thread field.
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2345 class RememberProcessedThread: public StackObj {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2346 NamedThread* _cur_thr;
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2347 public:
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2348 RememberProcessedThread(JavaThread* jthr) {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2349 Thread* thread = Thread::current();
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2350 if (thread->is_Named_thread()) {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2351 _cur_thr = (NamedThread *)thread;
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2352 _cur_thr->set_processed_thread(jthr);
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2353 } else {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2354 _cur_thr = NULL;
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2355 }
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2356 }
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2357
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2358 ~RememberProcessedThread() {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2359 if (_cur_thr) {
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2360 _cur_thr->set_processed_thread(NULL);
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2361 }
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2362 }
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2363 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2364
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
2365 void JavaThread::oops_do(OopClosure* f, CodeBlobClosure* cf) {
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1144
diff changeset
2366 // Verify that the deferred card marks have been flushed.
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1144
diff changeset
2367 assert(deferred_card_mark().is_empty(), "Should be empty during GC");
1027
39b01ab7035a 6888898: CMS: ReduceInitialCardMarks unsafe in the presence of cms precleaning
ysr
parents: 997
diff changeset
2368
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 // The ThreadProfiler oops_do is done from FlatProfiler::oops_do
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 // since there may be more than one thread using each ThreadProfiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
2371
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 // Traverse the GCHandles
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
2373 Thread::oops_do(f, cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2374
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 assert( (!has_last_Java_frame() && java_call_counter() == 0) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2377
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 if (has_last_Java_frame()) {
1119
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2379 // Record JavaThread to GC thread
547f81740344 6361589: Print out stack trace for target thread of GC crash
minqi
parents: 1115
diff changeset
2380 RememberProcessedThread rpt(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2381
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 // Traverse the privileged stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 if (_privileged_stack_top != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 _privileged_stack_top->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2386
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 // traverse the registered growable array
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 if (_array_for_gc != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 for (int index = 0; index < _array_for_gc->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 f->do_oop(_array_for_gc->adr_at(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2393
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 // Traverse the monitor chunks
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 for (MonitorChunk* chunk = monitor_chunks(); chunk != NULL; chunk = chunk->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 chunk->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2398
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 // Traverse the execution stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
2401 fst.current()->oops_do(f, cf, fst.register_map());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2404
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 // callee_target is never live across a gc point so NULL it here should
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 // it still contain a methdOop.
a61af66fc99e Initial load
duke
parents:
diff changeset
2407
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 set_callee_target(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2409
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 assert(vframe_array_head() == NULL, "deopt in progress at a safepoint!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 // If we have deferred set_locals there might be oops waiting to be
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 // written
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 GrowableArray<jvmtiDeferredLocalVariableSet*>* list = deferred_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
2414 if (list != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 for (int i = 0; i < list->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 list->at(i)->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2419
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 // Traverse instance variables at the end since the GC may be moving things
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 // around using this function
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 f->do_oop((oop*) &_threadObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 f->do_oop((oop*) &_vm_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 f->do_oop((oop*) &_vm_result_2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 f->do_oop((oop*) &_exception_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 f->do_oop((oop*) &_pending_async_exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
2427
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 if (jvmti_thread_state() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 jvmti_thread_state()->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2432
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
2433 void JavaThread::nmethods_do(CodeBlobClosure* cf) {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
2434 Thread::nmethods_do(cf); // (super method is a no-op)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2435
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 assert( (!has_last_Java_frame() && java_call_counter() == 0) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 (has_last_Java_frame() && java_call_counter() > 0), "wrong java_sp info!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2438
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 if (has_last_Java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 // Traverse the execution stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
2442 fst.current()->nmethods_do(cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2446
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 const char* _get_thread_state_name(JavaThreadState _thread_state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 switch (_thread_state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 case _thread_uninitialized: return "_thread_uninitialized";
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 case _thread_new: return "_thread_new";
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 case _thread_new_trans: return "_thread_new_trans";
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 case _thread_in_native: return "_thread_in_native";
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 case _thread_in_native_trans: return "_thread_in_native_trans";
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 case _thread_in_vm: return "_thread_in_vm";
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 case _thread_in_vm_trans: return "_thread_in_vm_trans";
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 case _thread_in_Java: return "_thread_in_Java";
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 case _thread_in_Java_trans: return "_thread_in_Java_trans";
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 case _thread_blocked: return "_thread_blocked";
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 case _thread_blocked_trans: return "_thread_blocked_trans";
a61af66fc99e Initial load
duke
parents:
diff changeset
2461 default: return "unknown thread state";
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2464
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 void JavaThread::print_thread_state_on(outputStream *st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 st->print_cr(" JavaThread state: %s", _get_thread_state_name(_thread_state));
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 void JavaThread::print_thread_state() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 print_thread_state_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2473
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 // Called by Threads::print() for VM_PrintThreads operation
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 void JavaThread::print_on(outputStream *st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 st->print("\"%s\" ", get_thread_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 oop thread_oop = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 if (thread_oop != NULL && java_lang_Thread::is_daemon(thread_oop)) st->print("daemon ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 Thread::print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 // print guess for valid stack memory region (assume 4K pages); helps lock debugging
702
b9fba36710f2 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 669
diff changeset
2481 st->print_cr("[" INTPTR_FORMAT "]", (intptr_t)last_Java_sp() & ~right_n_bits(12));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 if (thread_oop != NULL && JDK_Version::is_gte_jdk15x_version()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 st->print_cr(" java.lang.Thread.State: %s", java_lang_Thread::thread_status_name(thread_oop));
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 print_thread_state_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 _safepoint_state->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2490
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 // Called by fatal error handler. The difference between this and
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 // JavaThread::print() is that we can't grab lock or allocate memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 void JavaThread::print_on_error(outputStream* st, char *buf, int buflen) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 st->print("JavaThread \"%s\"", get_thread_name_string(buf, buflen));
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 oop thread_obj = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 if (thread_obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 if (java_lang_Thread::is_daemon(thread_obj)) st->print(" daemon");
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 st->print(" [");
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 st->print("%s", _get_thread_state_name(_thread_state));
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 if (osthread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 st->print(", id=%d", osthread()->thread_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 st->print(", stack(" PTR_FORMAT "," PTR_FORMAT ")",
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 _stack_base - _stack_size, _stack_base);
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 st->print("]");
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2509
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 // Verification
a61af66fc99e Initial load
duke
parents:
diff changeset
2511
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 static void frame_verify(frame* f, const RegisterMap *map) { f->verify(map); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2513
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 void JavaThread::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 // Verify oops in the thread.
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
2516 oops_do(&VerifyOopClosure::verify_oop, NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2517
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 // Verify the stack frames.
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 frames_do(frame_verify);
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2521
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 // CR 6300358 (sub-CR 2137150)
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 // Most callers of this method assume that it can't return NULL but a
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 // thread may not have a name whilst it is in the process of attaching to
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 // the VM - see CR 6412693, and there are places where a JavaThread can be
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 // seen prior to having it's threadObj set (eg JNI attaching threads and
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 // if vm exit occurs during initialization). These cases can all be accounted
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 // for such that this method never returns NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 const char* JavaThread::get_thread_name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 // early safepoints can hit while current thread does not yet have TLS
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 if (!SafepointSynchronize::is_at_safepoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 Thread *cur = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 if (!(cur->is_Java_thread() && cur == this)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 // Current JavaThreads are allowed to get their own name without
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 // the Threads_lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 assert_locked_or_safepoint(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2540 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 return get_thread_name_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2543
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 // Returns a non-NULL representation of this thread's name, or a suitable
a61af66fc99e Initial load
duke
parents:
diff changeset
2545 // descriptive string if there is no set name
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 const char* JavaThread::get_thread_name_string(char* buf, int buflen) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 const char* name_str;
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 oop thread_obj = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 if (thread_obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 typeArrayOop name = java_lang_Thread::name(thread_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 if (buf == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 name_str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 name_str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length(), buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 else if (is_attaching()) { // workaround for 6412693 - see 6404306
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 name_str = "<no-name - thread is attaching>";
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2563 name_str = Thread::name();
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2567 name_str = Thread::name();
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 assert(name_str != NULL, "unexpected NULL thread name");
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 return name_str;
a61af66fc99e Initial load
duke
parents:
diff changeset
2571 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2572
a61af66fc99e Initial load
duke
parents:
diff changeset
2573
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 const char* JavaThread::get_threadgroup_name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 debug_only(if (JavaThread::current() != this) assert_locked_or_safepoint(Threads_lock);)
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 oop thread_obj = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 if (thread_obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 oop thread_group = java_lang_Thread::threadGroup(thread_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 if (thread_group != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 typeArrayOop name = java_lang_ThreadGroup::name(thread_group);
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 // ThreadGroup.name can be null
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 const char* str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 return str;
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2590
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 const char* JavaThread::get_parent_name() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 debug_only(if (JavaThread::current() != this) assert_locked_or_safepoint(Threads_lock);)
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 oop thread_obj = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 if (thread_obj != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 oop thread_group = java_lang_Thread::threadGroup(thread_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 if (thread_group != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 oop parent = java_lang_ThreadGroup::parent(thread_group);
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 if (parent != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 typeArrayOop name = java_lang_ThreadGroup::name(parent);
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 // ThreadGroup.name can be null
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 if (name != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 const char* str = UNICODE::as_utf8((jchar*) name->base(T_CHAR), name->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 return str;
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2610
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 ThreadPriority JavaThread::java_priority() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 oop thr_oop = threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 if (thr_oop == NULL) return NormPriority; // Bootstrapping
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 ThreadPriority priority = java_lang_Thread::priority(thr_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 assert(MinPriority <= priority && priority <= MaxPriority, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 return priority;
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2618
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 void JavaThread::prepare(jobject jni_thread, ThreadPriority prio) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2620
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 assert(Threads_lock->owner() == Thread::current(), "must have threads lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 // Link Java Thread object <-> C++ Thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2623
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 // Get the C++ thread object (an oop) from the JNI handle (a jthread)
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 // and put it into a new Handle. The Handle "thread_oop" can then
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 // be used to pass the C++ thread object to other methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
2627
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 // Set the Java level thread object (jthread) field of the
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 // new thread (a JavaThread *) to C++ thread object using the
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 // "thread_oop" handle.
a61af66fc99e Initial load
duke
parents:
diff changeset
2631
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 // Set the thread field (a JavaThread *) of the
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 // oop representing the java_lang_Thread to the new thread (a JavaThread *).
a61af66fc99e Initial load
duke
parents:
diff changeset
2634
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 Handle thread_oop(Thread::current(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 JNIHandles::resolve_non_null(jni_thread));
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 assert(instanceKlass::cast(thread_oop->klass())->is_linked(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 "must be initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 set_threadObj(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 java_lang_Thread::set_thread(thread_oop(), this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2641
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 if (prio == NoPriority) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 prio = java_lang_Thread::priority(thread_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 assert(prio != NoPriority, "A valid priority should be present");
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2646
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 // Push the Java priority down to the native thread; needs Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 Thread::set_priority(this, prio);
a61af66fc99e Initial load
duke
parents:
diff changeset
2649
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 // Add the new thread to the Threads list and set it in motion.
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 // We must have threads lock in order to call Threads::add.
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 // It is crucial that we do not block before the thread is
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 // added to the Threads list for if a GC happens, then the java_thread oop
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 // will not be visited by GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 Threads::add(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2657
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 oop JavaThread::current_park_blocker() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 // Support for JSR-166 locks
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 oop thread_oop = threadObj();
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
2661 if (thread_oop != NULL &&
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
2662 JDK_Version::current().supports_thread_park_blocker()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 return java_lang_Thread::park_blocker(thread_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2667
a61af66fc99e Initial load
duke
parents:
diff changeset
2668
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 void JavaThread::print_stack_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 if (!has_last_Java_frame()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2673
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 RegisterMap reg_map(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 vframe* start_vf = last_java_vframe(&reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 int count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 for (vframe* f = start_vf; f; f = f->sender() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 if (f->is_java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 javaVFrame* jvf = javaVFrame::cast(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 java_lang_Throwable::print_stack_element(st, jvf->method(), jvf->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
2681
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 // Print out lock information
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 if (JavaMonitorsInStackTrace) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 jvf->print_lock_info_on(st, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2686 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 // Ignore non-Java frames
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2689
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 // Bail-out case for too deep stacks
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 if (MaxJavaStackTraceDepth == count) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2695
a61af66fc99e Initial load
duke
parents:
diff changeset
2696
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 // JVMTI PopFrame support
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 void JavaThread::popframe_preserve_args(ByteSize size_in_bytes, void* start) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2699 assert(_popframe_preserved_args == NULL, "should not wipe out old PopFrame preserved arguments");
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 if (in_bytes(size_in_bytes) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 _popframe_preserved_args = NEW_C_HEAP_ARRAY(char, in_bytes(size_in_bytes));
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 _popframe_preserved_args_size = in_bytes(size_in_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 Copy::conjoint_bytes(start, _popframe_preserved_args, _popframe_preserved_args_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2704 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2706
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 void* JavaThread::popframe_preserved_args() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 return _popframe_preserved_args;
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2710
a61af66fc99e Initial load
duke
parents:
diff changeset
2711 ByteSize JavaThread::popframe_preserved_args_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 return in_ByteSize(_popframe_preserved_args_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2714
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 WordSize JavaThread::popframe_preserved_args_size_in_words() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 int sz = in_bytes(popframe_preserved_args_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 assert(sz % wordSize == 0, "argument size must be multiple of wordSize");
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 return in_WordSize(sz / wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2720
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 void JavaThread::popframe_free_preserved_args() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2722 assert(_popframe_preserved_args != NULL, "should not free PopFrame preserved arguments twice");
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 FREE_C_HEAP_ARRAY(char, (char*) _popframe_preserved_args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 _popframe_preserved_args = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 _popframe_preserved_args_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2727
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2729
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 void JavaThread::trace_frames() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2731 tty->print_cr("[Describe stack]");
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 int frame_no = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 tty->print(" %d. ", frame_no++);
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 fst.current()->print_value_on(tty,this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2737 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2739
a61af66fc99e Initial load
duke
parents:
diff changeset
2740
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 void JavaThread::trace_stack_from(vframe* start_vf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2743 int vframe_no = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2744 for (vframe* f = start_vf; f; f = f->sender() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 if (f->is_java_frame()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2746 javaVFrame::cast(f)->print_activation(vframe_no++);
a61af66fc99e Initial load
duke
parents:
diff changeset
2747 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 f->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2750 if (vframe_no > StackPrintLimit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2751 tty->print_cr("...<more frames>...");
a61af66fc99e Initial load
duke
parents:
diff changeset
2752 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2756
a61af66fc99e Initial load
duke
parents:
diff changeset
2757
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 void JavaThread::trace_stack() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2759 if (!has_last_Java_frame()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2760 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2761 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2762 RegisterMap reg_map(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2763 trace_stack_from(last_java_vframe(&reg_map));
a61af66fc99e Initial load
duke
parents:
diff changeset
2764 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2765
a61af66fc99e Initial load
duke
parents:
diff changeset
2766
a61af66fc99e Initial load
duke
parents:
diff changeset
2767 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2768
a61af66fc99e Initial load
duke
parents:
diff changeset
2769
a61af66fc99e Initial load
duke
parents:
diff changeset
2770 javaVFrame* JavaThread::last_java_vframe(RegisterMap *reg_map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 assert(reg_map != NULL, "a map must be given");
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 frame f = last_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
2773 for (vframe* vf = vframe::new_vframe(&f, reg_map, this); vf; vf = vf->sender() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2774 if (vf->is_java_frame()) return javaVFrame::cast(vf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2775 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2778
a61af66fc99e Initial load
duke
parents:
diff changeset
2779
a61af66fc99e Initial load
duke
parents:
diff changeset
2780 klassOop JavaThread::security_get_caller_class(int depth) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 vframeStream vfst(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
2782 vfst.security_get_caller_frame(depth);
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 if (!vfst.at_end()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 return vfst.method()->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
2785 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2786 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2787 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2788
a61af66fc99e Initial load
duke
parents:
diff changeset
2789 static void compiler_thread_entry(JavaThread* thread, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 assert(thread->is_Compiler_thread(), "must be compiler thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 CompileBroker::compiler_thread_loop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2793
a61af66fc99e Initial load
duke
parents:
diff changeset
2794 // Create a CompilerThread
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 CompilerThread::CompilerThread(CompileQueue* queue, CompilerCounters* counters)
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 : JavaThread(&compiler_thread_entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2797 _env = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 _log = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 _task = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 _queue = queue;
a61af66fc99e Initial load
duke
parents:
diff changeset
2801 _counters = counters;
1454
7cf1952ec5fb Added flag -XX:BootstrapC1X that precompiles Object::<init> and then every method in the compilation queue until it is empty.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents: 1410
diff changeset
2802 _is_compiling = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2803
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 _ideal_graph_printer = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2808
a61af66fc99e Initial load
duke
parents:
diff changeset
2809
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 // ======= Threads ========
a61af66fc99e Initial load
duke
parents:
diff changeset
2811
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 // The Threads class links together all active threads, and provides
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 // operations over all threads. It is protected by its own Mutex
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 // lock, which is also used in other contexts to protect thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2815 // operations from having the thread being operated on from exiting
a61af66fc99e Initial load
duke
parents:
diff changeset
2816 // and going away unexpectedly (e.g., safepoint synchronization)
a61af66fc99e Initial load
duke
parents:
diff changeset
2817
a61af66fc99e Initial load
duke
parents:
diff changeset
2818 JavaThread* Threads::_thread_list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 int Threads::_number_of_threads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 int Threads::_number_of_non_daemon_threads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2821 int Threads::_return_code = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 size_t JavaThread::_stack_size_at_create = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2823
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 // All JavaThreads
a61af66fc99e Initial load
duke
parents:
diff changeset
2825 #define ALL_JAVA_THREADS(X) for (JavaThread* X = _thread_list; X; X = X->next())
a61af66fc99e Initial load
duke
parents:
diff changeset
2826
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 void os_stream();
a61af66fc99e Initial load
duke
parents:
diff changeset
2828
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 // All JavaThreads + all non-JavaThreads (i.e., every thread in the system)
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 void Threads::threads_do(ThreadClosure* tc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 assert_locked_or_safepoint(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 // ALL_JAVA_THREADS iterates through all JavaThreads
a61af66fc99e Initial load
duke
parents:
diff changeset
2833 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 tc->do_thread(p);
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2836 // Someday we could have a table or list of all non-JavaThreads.
a61af66fc99e Initial load
duke
parents:
diff changeset
2837 // For now, just manually iterate through them.
a61af66fc99e Initial load
duke
parents:
diff changeset
2838 tc->do_thread(VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
2839 Universe::heap()->gc_threads_do(tc);
323
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2840 WatcherThread *wt = WatcherThread::watcher_thread();
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2841 // Strictly speaking, the following NULL check isn't sufficient to make sure
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2842 // the data for WatcherThread is still valid upon being examined. However,
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2843 // considering that WatchThread terminates when the VM is on the way to
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2844 // exit at safepoint, the chance of the above is extremely small. The right
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2845 // way to prevent termination of WatcherThread would be to acquire
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2846 // Terminator_lock, but we can't do that without violating the lock rank
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2847 // checking in some cases.
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2848 if (wt != NULL)
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2849 tc->do_thread(wt);
b33eef719520 6740526: sun/management/HotspotThreadMBean/GetInternalThreads.java test failed
xlu
parents: 286
diff changeset
2850
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2851 // If CompilerThreads ever become non-JavaThreads, add them here
a61af66fc99e Initial load
duke
parents:
diff changeset
2852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2853
a61af66fc99e Initial load
duke
parents:
diff changeset
2854 jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2855
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
2856 extern void JDK_Version_init();
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
2857
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2858 // Check version
a61af66fc99e Initial load
duke
parents:
diff changeset
2859 if (!is_supported_jni_version(args->version)) return JNI_EVERSION;
a61af66fc99e Initial load
duke
parents:
diff changeset
2860
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 // Initialize the output stream module
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 ostream_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
2863
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 // Process java launcher properties.
a61af66fc99e Initial load
duke
parents:
diff changeset
2865 Arguments::process_sun_java_launcher_properties(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2866
a61af66fc99e Initial load
duke
parents:
diff changeset
2867 // Initialize the os module before using TLS
a61af66fc99e Initial load
duke
parents:
diff changeset
2868 os::init();
a61af66fc99e Initial load
duke
parents:
diff changeset
2869
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 // Initialize system properties.
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 Arguments::init_system_properties();
a61af66fc99e Initial load
duke
parents:
diff changeset
2872
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
2873 // So that JDK version can be used as a discrimintor when parsing arguments
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
2874 JDK_Version_init();
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 196
diff changeset
2875
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2876 // Parse arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
2877 jint parse_result = Arguments::parse(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2878 if (parse_result != JNI_OK) return parse_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2879
a61af66fc99e Initial load
duke
parents:
diff changeset
2880 if (PauseAtStartup) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 os::pause();
a61af66fc99e Initial load
duke
parents:
diff changeset
2882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2883
a61af66fc99e Initial load
duke
parents:
diff changeset
2884 HS_DTRACE_PROBE(hotspot, vm__init__begin);
a61af66fc99e Initial load
duke
parents:
diff changeset
2885
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 // Record VM creation timing statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 TraceVmCreationTime create_vm_timer;
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 create_vm_timer.start();
a61af66fc99e Initial load
duke
parents:
diff changeset
2889
a61af66fc99e Initial load
duke
parents:
diff changeset
2890 // Timing (must come after argument parsing)
a61af66fc99e Initial load
duke
parents:
diff changeset
2891 TraceTime timer("Create VM", TraceStartupTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
2892
a61af66fc99e Initial load
duke
parents:
diff changeset
2893 // Initialize the os module after parsing the args
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 jint os_init_2_result = os::init_2();
a61af66fc99e Initial load
duke
parents:
diff changeset
2895 if (os_init_2_result != JNI_OK) return os_init_2_result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2896
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 // Initialize output stream logging
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 ostream_init_log();
a61af66fc99e Initial load
duke
parents:
diff changeset
2899
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 // Convert -Xrun to -agentlib: if there is no JVM_OnLoad
a61af66fc99e Initial load
duke
parents:
diff changeset
2901 // Must be before create_vm_init_agents()
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 if (Arguments::init_libraries_at_startup()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 convert_vm_init_libraries_to_agents();
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2905
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 // Launch -agentlib/-agentpath and converted -Xrun agents
a61af66fc99e Initial load
duke
parents:
diff changeset
2907 if (Arguments::init_agents_at_startup()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 create_vm_init_agents();
a61af66fc99e Initial load
duke
parents:
diff changeset
2909 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2910
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 // Initialize Threads state
a61af66fc99e Initial load
duke
parents:
diff changeset
2912 _thread_list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2913 _number_of_threads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2914 _number_of_non_daemon_threads = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2915
a61af66fc99e Initial load
duke
parents:
diff changeset
2916 // Initialize TLS
a61af66fc99e Initial load
duke
parents:
diff changeset
2917 ThreadLocalStorage::init();
a61af66fc99e Initial load
duke
parents:
diff changeset
2918
a61af66fc99e Initial load
duke
parents:
diff changeset
2919 // Initialize global data structures and create system classes in heap
a61af66fc99e Initial load
duke
parents:
diff changeset
2920 vm_init_globals();
a61af66fc99e Initial load
duke
parents:
diff changeset
2921
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 // Attach the main thread to this os thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 JavaThread* main_thread = new JavaThread();
a61af66fc99e Initial load
duke
parents:
diff changeset
2924 main_thread->set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
2925 // must do this before set_active_handles and initialize_thread_local_storage
a61af66fc99e Initial load
duke
parents:
diff changeset
2926 // Note: on solaris initialize_thread_local_storage() will (indirectly)
a61af66fc99e Initial load
duke
parents:
diff changeset
2927 // change the stack size recorded here to one based on the java thread
a61af66fc99e Initial load
duke
parents:
diff changeset
2928 // stacksize. This adjusted size is what is used to figure the placement
a61af66fc99e Initial load
duke
parents:
diff changeset
2929 // of the guard pages.
a61af66fc99e Initial load
duke
parents:
diff changeset
2930 main_thread->record_stack_base_and_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 main_thread->initialize_thread_local_storage();
a61af66fc99e Initial load
duke
parents:
diff changeset
2932
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 main_thread->set_active_handles(JNIHandleBlock::allocate_block());
a61af66fc99e Initial load
duke
parents:
diff changeset
2934
a61af66fc99e Initial load
duke
parents:
diff changeset
2935 if (!main_thread->set_as_starting_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2936 vm_shutdown_during_initialization(
a61af66fc99e Initial load
duke
parents:
diff changeset
2937 "Failed necessary internal allocation. Out of swap space");
a61af66fc99e Initial load
duke
parents:
diff changeset
2938 delete main_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
2939 *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
a61af66fc99e Initial load
duke
parents:
diff changeset
2940 return JNI_ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
2941 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2942
a61af66fc99e Initial load
duke
parents:
diff changeset
2943 // Enable guard page *after* os::create_main_thread(), otherwise it would
a61af66fc99e Initial load
duke
parents:
diff changeset
2944 // crash Linux VM, see notes in os_linux.cpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
2945 main_thread->create_stack_guard_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
2946
a61af66fc99e Initial load
duke
parents:
diff changeset
2947 // Initialize Java-Leve synchronization subsystem
a61af66fc99e Initial load
duke
parents:
diff changeset
2948 ObjectSynchronizer::Initialize() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
2949
a61af66fc99e Initial load
duke
parents:
diff changeset
2950 // Initialize global modules
a61af66fc99e Initial load
duke
parents:
diff changeset
2951 jint status = init_globals();
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 if (status != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2953 delete main_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 *canTryAgain = false; // don't let caller call JNI_CreateJavaVM again
a61af66fc99e Initial load
duke
parents:
diff changeset
2955 return status;
a61af66fc99e Initial load
duke
parents:
diff changeset
2956 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2957
a61af66fc99e Initial load
duke
parents:
diff changeset
2958 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2959
a61af66fc99e Initial load
duke
parents:
diff changeset
2960 { MutexLocker mu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2961 Threads::add(main_thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2962 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2963
a61af66fc99e Initial load
duke
parents:
diff changeset
2964 // Any JVMTI raw monitors entered in onload will transition into
a61af66fc99e Initial load
duke
parents:
diff changeset
2965 // real raw monitor. VM is setup enough here for raw monitor enter.
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 JvmtiExport::transition_pending_onload_raw_monitors();
a61af66fc99e Initial load
duke
parents:
diff changeset
2967
a61af66fc99e Initial load
duke
parents:
diff changeset
2968 if (VerifyBeforeGC &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2969 Universe::heap()->total_collections() >= VerifyGCStartAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2970 Universe::heap()->prepare_for_verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2971 Universe::verify(); // make sure we're starting with a clean slate
a61af66fc99e Initial load
duke
parents:
diff changeset
2972 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2973
a61af66fc99e Initial load
duke
parents:
diff changeset
2974 // Create the VMThread
a61af66fc99e Initial load
duke
parents:
diff changeset
2975 { TraceTime timer("Start VMThread", TraceStartupTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
2976 VMThread::create();
a61af66fc99e Initial load
duke
parents:
diff changeset
2977 Thread* vmthread = VMThread::vm_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
2978
a61af66fc99e Initial load
duke
parents:
diff changeset
2979 if (!os::create_thread(vmthread, os::vm_thread))
a61af66fc99e Initial load
duke
parents:
diff changeset
2980 vm_exit_during_initialization("Cannot create VM thread. Out of system resources.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2981
a61af66fc99e Initial load
duke
parents:
diff changeset
2982 // Wait for the VM thread to become ready, and VMThread::run to initialize
a61af66fc99e Initial load
duke
parents:
diff changeset
2983 // Monitors can have spurious returns, must always check another state flag
a61af66fc99e Initial load
duke
parents:
diff changeset
2984 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2985 MutexLocker ml(Notify_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2986 os::start_thread(vmthread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 while (vmthread->active_handles() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2988 Notify_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
2989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2991 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2992
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 assert (Universe::is_fully_initialized(), "not initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
2994 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
2995
a61af66fc99e Initial load
duke
parents:
diff changeset
2996 // At this point, the Universe is initialized, but we have not executed
a61af66fc99e Initial load
duke
parents:
diff changeset
2997 // any byte code. Now is a good time (the only time) to dump out the
a61af66fc99e Initial load
duke
parents:
diff changeset
2998 // internal state of the JVM for sharing.
a61af66fc99e Initial load
duke
parents:
diff changeset
2999
a61af66fc99e Initial load
duke
parents:
diff changeset
3000 if (DumpSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3001 Universe::heap()->preload_and_dump(CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3002 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3004
a61af66fc99e Initial load
duke
parents:
diff changeset
3005 // Always call even when there are not JVMTI environments yet, since environments
a61af66fc99e Initial load
duke
parents:
diff changeset
3006 // may be attached late and JVMTI must track phases of VM execution
a61af66fc99e Initial load
duke
parents:
diff changeset
3007 JvmtiExport::enter_start_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
3008
a61af66fc99e Initial load
duke
parents:
diff changeset
3009 // Notify JVMTI agents that VM has started (JNI is up) - nop if no agents.
a61af66fc99e Initial load
duke
parents:
diff changeset
3010 JvmtiExport::post_vm_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
3011
a61af66fc99e Initial load
duke
parents:
diff changeset
3012 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 TraceTime timer("Initialize java.lang classes", TraceStartupTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
3014
a61af66fc99e Initial load
duke
parents:
diff changeset
3015 if (EagerXrunInit && Arguments::init_libraries_at_startup()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 create_vm_init_libraries();
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3018
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 if (InitializeJavaLangString) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 initialize_class(vmSymbolHandles::java_lang_String(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3022 warning("java.lang.String not initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
3023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3024
18
c7d713375c94 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 0
diff changeset
3025 if (AggressiveOpts) {
192
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3026 {
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3027 // Forcibly initialize java/util/HashMap and mutate the private
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3028 // static final "frontCacheEnabled" field before we start creating instances
18
c7d713375c94 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 0
diff changeset
3029 #ifdef ASSERT
192
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3030 klassOop tmp_k = SystemDictionary::find(vmSymbolHandles::java_util_HashMap(), Handle(), Handle(), CHECK_0);
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3031 assert(tmp_k == NULL, "java/util/HashMap should not be loaded yet");
18
c7d713375c94 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 0
diff changeset
3032 #endif
192
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3033 klassOop k_o = SystemDictionary::resolve_or_null(vmSymbolHandles::java_util_HashMap(), Handle(), Handle(), CHECK_0);
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3034 KlassHandle k = KlassHandle(THREAD, k_o);
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3035 guarantee(k.not_null(), "Must find java/util/HashMap");
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3036 instanceKlassHandle ik = instanceKlassHandle(THREAD, k());
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3037 ik->initialize(CHECK_0);
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3038 fieldDescriptor fd;
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3039 // Possible we might not find this field; if so, don't break
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3040 if (ik->find_local_field(vmSymbols::frontCacheEnabled_name(), vmSymbols::bool_signature(), &fd)) {
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3041 k()->bool_field_put(fd.offset(), true);
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3042 }
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3043 }
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3044
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3045 if (UseStringCache) {
669
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3046 // Forcibly initialize java/lang/StringValue and mutate the private
192
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3047 // static final "stringCacheEnabled" field before we start creating instances
669
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3048 klassOop k_o = SystemDictionary::resolve_or_null(vmSymbolHandles::java_lang_StringValue(), Handle(), Handle(), CHECK_0);
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3049 // Possible that StringValue isn't present: if so, silently don't break
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3050 if (k_o != NULL) {
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3051 KlassHandle k = KlassHandle(THREAD, k_o);
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3052 instanceKlassHandle ik = instanceKlassHandle(THREAD, k());
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3053 ik->initialize(CHECK_0);
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3054 fieldDescriptor fd;
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3055 // Possible we might not find this field: if so, silently don't break
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3056 if (ik->find_local_field(vmSymbols::stringCacheEnabled_name(), vmSymbols::bool_signature(), &fd)) {
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3057 k()->bool_field_put(fd.offset(), true);
eca19a8425b5 6810653: Change String cache class used by Hotspot from String to StringValue
phh
parents: 441
diff changeset
3058 }
192
6d13fcb3663f 6714404: Add UseStringCache switch to enable String caching under AggressiveOpts
kvn
parents: 62
diff changeset
3059 }
18
c7d713375c94 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 0
diff changeset
3060 }
c7d713375c94 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 0
diff changeset
3061 }
c7d713375c94 6621621: HashMap front cache should be enabled only with AggressiveOpts
phh
parents: 0
diff changeset
3062
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3063 // Initialize java_lang.System (needed before creating the thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
3064 if (InitializeJavaLangSystem) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3065 initialize_class(vmSymbolHandles::java_lang_System(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3066 initialize_class(vmSymbolHandles::java_lang_ThreadGroup(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3067 Handle thread_group = create_initial_thread_group(CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3068 Universe::set_main_thread_group(thread_group());
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 initialize_class(vmSymbolHandles::java_lang_Thread(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3070 oop thread_object = create_initial_thread(thread_group, main_thread, CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3071 main_thread->set_threadObj(thread_object);
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 // Set thread status to running since main thread has
a61af66fc99e Initial load
duke
parents:
diff changeset
3073 // been started and running.
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 java_lang_Thread::set_thread_status(thread_object,
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 java_lang_Thread::RUNNABLE);
a61af66fc99e Initial load
duke
parents:
diff changeset
3076
a61af66fc99e Initial load
duke
parents:
diff changeset
3077 // The VM preresolve methods to these classes. Make sure that get initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
3078 initialize_class(vmSymbolHandles::java_lang_reflect_Method(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3079 initialize_class(vmSymbolHandles::java_lang_ref_Finalizer(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3080 // The VM creates & returns objects of this class. Make sure it's initialized.
a61af66fc99e Initial load
duke
parents:
diff changeset
3081 initialize_class(vmSymbolHandles::java_lang_Class(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3082 call_initializeSystemClass(CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3083 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3084 warning("java.lang.System not initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
3085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3086
a61af66fc99e Initial load
duke
parents:
diff changeset
3087 // an instance of OutOfMemory exception has been allocated earlier
a61af66fc99e Initial load
duke
parents:
diff changeset
3088 if (InitializeJavaLangExceptionsErrors) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3089 initialize_class(vmSymbolHandles::java_lang_OutOfMemoryError(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3090 initialize_class(vmSymbolHandles::java_lang_NullPointerException(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3091 initialize_class(vmSymbolHandles::java_lang_ClassCastException(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3092 initialize_class(vmSymbolHandles::java_lang_ArrayStoreException(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3093 initialize_class(vmSymbolHandles::java_lang_ArithmeticException(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3094 initialize_class(vmSymbolHandles::java_lang_StackOverflowError(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3095 initialize_class(vmSymbolHandles::java_lang_IllegalMonitorStateException(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3097 warning("java.lang.OutOfMemoryError has not been initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
3098 warning("java.lang.NullPointerException has not been initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
3099 warning("java.lang.ClassCastException has not been initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
3100 warning("java.lang.ArrayStoreException has not been initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
3101 warning("java.lang.ArithmeticException has not been initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
3102 warning("java.lang.StackOverflowError has not been initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
3103 }
1135
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1027
diff changeset
3104
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1027
diff changeset
3105 if (EnableInvokeDynamic) {
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1027
diff changeset
3106 // JSR 292: An intialized java.dyn.InvokeDynamic is required in
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1027
diff changeset
3107 // the compiler.
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1027
diff changeset
3108 initialize_class(vmSymbolHandles::java_dyn_InvokeDynamic(), CHECK_0);
e66fd840cb6b 6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents: 1027
diff changeset
3109 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3111
a61af66fc99e Initial load
duke
parents:
diff changeset
3112 // See : bugid 4211085.
a61af66fc99e Initial load
duke
parents:
diff changeset
3113 // Background : the static initializer of java.lang.Compiler tries to read
a61af66fc99e Initial load
duke
parents:
diff changeset
3114 // property"java.compiler" and read & write property "java.vm.info".
a61af66fc99e Initial load
duke
parents:
diff changeset
3115 // When a security manager is installed through the command line
a61af66fc99e Initial load
duke
parents:
diff changeset
3116 // option "-Djava.security.manager", the above properties are not
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 // readable and the static initializer for java.lang.Compiler fails
a61af66fc99e Initial load
duke
parents:
diff changeset
3118 // resulting in a NoClassDefFoundError. This can happen in any
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 // user code which calls methods in java.lang.Compiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 // Hack : the hack is to pre-load and initialize this class, so that only
a61af66fc99e Initial load
duke
parents:
diff changeset
3121 // system domains are on the stack when the properties are read.
a61af66fc99e Initial load
duke
parents:
diff changeset
3122 // Currently even the AWT code has calls to methods in java.lang.Compiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 // On the classic VM, java.lang.Compiler is loaded very early to load the JIT.
a61af66fc99e Initial load
duke
parents:
diff changeset
3124 // Future Fix : the best fix is to grant everyone permissions to read "java.compiler" and
a61af66fc99e Initial load
duke
parents:
diff changeset
3125 // read and write"java.vm.info" in the default policy file. See bugid 4211383
a61af66fc99e Initial load
duke
parents:
diff changeset
3126 // Once that is done, we should remove this hack.
a61af66fc99e Initial load
duke
parents:
diff changeset
3127 initialize_class(vmSymbolHandles::java_lang_Compiler(), CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3128
a61af66fc99e Initial load
duke
parents:
diff changeset
3129 // More hackery - the static initializer of java.lang.Compiler adds the string "nojit" to
a61af66fc99e Initial load
duke
parents:
diff changeset
3130 // the java.vm.info property if no jit gets loaded through java.lang.Compiler (the hotspot
a61af66fc99e Initial load
duke
parents:
diff changeset
3131 // compiler does not get loaded through java.lang.Compiler). "java -version" with the
a61af66fc99e Initial load
duke
parents:
diff changeset
3132 // hotspot vm says "nojit" all the time which is confusing. So, we reset it here.
a61af66fc99e Initial load
duke
parents:
diff changeset
3133 // This should also be taken out as soon as 4211383 gets fixed.
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 reset_vm_info_property(CHECK_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3135
a61af66fc99e Initial load
duke
parents:
diff changeset
3136 quicken_jni_functions();
a61af66fc99e Initial load
duke
parents:
diff changeset
3137
a61af66fc99e Initial load
duke
parents:
diff changeset
3138 // Set flag that basic initialization has completed. Used by exceptions and various
a61af66fc99e Initial load
duke
parents:
diff changeset
3139 // debug stuff, that does not work until all basic classes have been initialized.
a61af66fc99e Initial load
duke
parents:
diff changeset
3140 set_init_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
3141
a61af66fc99e Initial load
duke
parents:
diff changeset
3142 HS_DTRACE_PROBE(hotspot, vm__init__end);
a61af66fc99e Initial load
duke
parents:
diff changeset
3143
a61af66fc99e Initial load
duke
parents:
diff changeset
3144 // record VM initialization completion time
a61af66fc99e Initial load
duke
parents:
diff changeset
3145 Management::record_vm_init_completed();
a61af66fc99e Initial load
duke
parents:
diff changeset
3146
a61af66fc99e Initial load
duke
parents:
diff changeset
3147 // Compute system loader. Note that this has to occur after set_init_completed, since
a61af66fc99e Initial load
duke
parents:
diff changeset
3148 // valid exceptions may be thrown in the process.
a61af66fc99e Initial load
duke
parents:
diff changeset
3149 // Note that we do not use CHECK_0 here since we are inside an EXCEPTION_MARK and
a61af66fc99e Initial load
duke
parents:
diff changeset
3150 // set_init_completed has just been called, causing exceptions not to be shortcut
a61af66fc99e Initial load
duke
parents:
diff changeset
3151 // anymore. We call vm_exit_during_initialization directly instead.
a61af66fc99e Initial load
duke
parents:
diff changeset
3152 SystemDictionary::compute_java_system_loader(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3153 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3154 vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
a61af66fc99e Initial load
duke
parents:
diff changeset
3155 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3156
1115
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
3157 #ifdef KERNEL
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
3158 if (JDK_Version::is_gte_jdk17x_version()) {
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
3159 set_jkernel_boot_classloader_hook(THREAD);
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
3160 }
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
3161 #endif // KERNEL
4b966d9946a3 6888880: JKernel VM to inject the sun.jkernel.DownloadManager as a boot classloader hook
mchung
parents: 1027
diff changeset
3162
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3163 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
3164 // Support for ConcurrentMarkSweep. This should be cleaned up
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3165 // and better encapsulated. The ugly nested if test would go away
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3166 // once things are properly refactored. XXX YSR
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3167 if (UseConcMarkSweepGC || UseG1GC) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3168 if (UseConcMarkSweepGC) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3169 ConcurrentMarkSweepThread::makeSurrogateLockerThread(THREAD);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3170 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3171 ConcurrentMarkThread::makeSurrogateLockerThread(THREAD);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 62
diff changeset
3172 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3173 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3174 vm_exit_during_initialization(Handle(THREAD, PENDING_EXCEPTION));
a61af66fc99e Initial load
duke
parents:
diff changeset
3175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3177 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
3178
a61af66fc99e Initial load
duke
parents:
diff changeset
3179 // Always call even when there are not JVMTI environments yet, since environments
a61af66fc99e Initial load
duke
parents:
diff changeset
3180 // may be attached late and JVMTI must track phases of VM execution
a61af66fc99e Initial load
duke
parents:
diff changeset
3181 JvmtiExport::enter_live_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
3182
a61af66fc99e Initial load
duke
parents:
diff changeset
3183 // Signal Dispatcher needs to be started before VMInit event is posted
a61af66fc99e Initial load
duke
parents:
diff changeset
3184 os::signal_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
3185
a61af66fc99e Initial load
duke
parents:
diff changeset
3186 // Start Attach Listener if +StartAttachListener or it can't be started lazily
a61af66fc99e Initial load
duke
parents:
diff changeset
3187 if (!DisableAttachMechanism) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3188 if (StartAttachListener || AttachListener::init_at_startup()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 AttachListener::init();
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3192
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 // Launch -Xrun agents
a61af66fc99e Initial load
duke
parents:
diff changeset
3194 // Must be done in the JVMTI live phase so that for backward compatibility the JDWP
a61af66fc99e Initial load
duke
parents:
diff changeset
3195 // back-end can launch with -Xdebug -Xrunjdwp.
a61af66fc99e Initial load
duke
parents:
diff changeset
3196 if (!EagerXrunInit && Arguments::init_libraries_at_startup()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3197 create_vm_init_libraries();
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3199
a61af66fc99e Initial load
duke
parents:
diff changeset
3200 // Notify JVMTI agents that VM initialization is complete - nop if no agents.
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 JvmtiExport::post_vm_initialized();
a61af66fc99e Initial load
duke
parents:
diff changeset
3202
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 Chunk::start_chunk_pool_cleaner_task();
a61af66fc99e Initial load
duke
parents:
diff changeset
3204
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 // initialize compiler(s)
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 CompileBroker::compilation_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
3207
a61af66fc99e Initial load
duke
parents:
diff changeset
3208 Management::initialize(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3209 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3210 // management agent fails to start possibly due to
a61af66fc99e Initial load
duke
parents:
diff changeset
3211 // configuration problem and is responsible for printing
a61af66fc99e Initial load
duke
parents:
diff changeset
3212 // stack trace if appropriate. Simply exit VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
3213 vm_exit(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3215
a61af66fc99e Initial load
duke
parents:
diff changeset
3216 if (Arguments::has_profile()) FlatProfiler::engage(main_thread, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
3217 if (Arguments::has_alloc_profile()) AllocationProfiler::engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
3218 if (MemProfiling) MemProfiler::engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
3219 StatSampler::engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
3220 if (CheckJNICalls) JniPeriodicChecker::engage();
a61af66fc99e Initial load
duke
parents:
diff changeset
3221
a61af66fc99e Initial load
duke
parents:
diff changeset
3222 BiasedLocking::init();
a61af66fc99e Initial load
duke
parents:
diff changeset
3223
a61af66fc99e Initial load
duke
parents:
diff changeset
3224
a61af66fc99e Initial load
duke
parents:
diff changeset
3225 // Start up the WatcherThread if there are any periodic tasks
a61af66fc99e Initial load
duke
parents:
diff changeset
3226 // NOTE: All PeriodicTasks should be registered by now. If they
a61af66fc99e Initial load
duke
parents:
diff changeset
3227 // aren't, late joiners might appear to start slowly (we might
a61af66fc99e Initial load
duke
parents:
diff changeset
3228 // take a while to process their first tick).
a61af66fc99e Initial load
duke
parents:
diff changeset
3229 if (PeriodicTask::num_tasks() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3230 WatcherThread::start();
a61af66fc99e Initial load
duke
parents:
diff changeset
3231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3232
a61af66fc99e Initial load
duke
parents:
diff changeset
3233 create_vm_timer.end();
a61af66fc99e Initial load
duke
parents:
diff changeset
3234 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3236
a61af66fc99e Initial load
duke
parents:
diff changeset
3237 // type for the Agent_OnLoad and JVM_OnLoad entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
3238 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
3239 typedef jint (JNICALL *OnLoadEntry_t)(JavaVM *, char *, void *);
a61af66fc99e Initial load
duke
parents:
diff changeset
3240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3241 // Find a command line agent library and return its entry point for
a61af66fc99e Initial load
duke
parents:
diff changeset
3242 // -agentlib: -agentpath: -Xrun
a61af66fc99e Initial load
duke
parents:
diff changeset
3243 // num_symbol_entries must be passed-in since only the caller knows the number of symbols in the array.
a61af66fc99e Initial load
duke
parents:
diff changeset
3244 static OnLoadEntry_t lookup_on_load(AgentLibrary* agent, const char *on_load_symbols[], size_t num_symbol_entries) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 OnLoadEntry_t on_load_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3246 void *library = agent->os_lib(); // check if we have looked it up before
a61af66fc99e Initial load
duke
parents:
diff changeset
3247
a61af66fc99e Initial load
duke
parents:
diff changeset
3248 if (library == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3249 char buffer[JVM_MAXPATHLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
3250 char ebuf[1024];
a61af66fc99e Initial load
duke
parents:
diff changeset
3251 const char *name = agent->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
3252
a61af66fc99e Initial load
duke
parents:
diff changeset
3253 if (agent->is_absolute_path()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3254 library = hpi::dll_load(name, ebuf, sizeof ebuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3255 if (library == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3256 // If we can't find the agent, exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
3257 vm_exit_during_initialization("Could not find agent library in absolute path", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
3258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3259 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3260 // Try to load the agent from the standard dll directory
a61af66fc99e Initial load
duke
parents:
diff changeset
3261 hpi::dll_build_name(buffer, sizeof(buffer), Arguments::get_dll_dir(), name);
a61af66fc99e Initial load
duke
parents:
diff changeset
3262 library = hpi::dll_load(buffer, ebuf, sizeof ebuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3263 #ifdef KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
3264 // Download instrument dll
a61af66fc99e Initial load
duke
parents:
diff changeset
3265 if (library == NULL && strcmp(name, "instrument") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3266 char *props = Arguments::get_kernel_properties();
a61af66fc99e Initial load
duke
parents:
diff changeset
3267 char *home = Arguments::get_java_home();
a61af66fc99e Initial load
duke
parents:
diff changeset
3268 const char *fmt = "%s/bin/java %s -Dkernel.background.download=false"
a61af66fc99e Initial load
duke
parents:
diff changeset
3269 " sun.jkernel.DownloadManager -download client_jvm";
a61af66fc99e Initial load
duke
parents:
diff changeset
3270 int length = strlen(props) + strlen(home) + strlen(fmt) + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 char *cmd = AllocateHeap(length);
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 jio_snprintf(cmd, length, fmt, home, props);
a61af66fc99e Initial load
duke
parents:
diff changeset
3273 int status = os::fork_and_exec(cmd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3274 FreeHeap(props);
a61af66fc99e Initial load
duke
parents:
diff changeset
3275 FreeHeap(cmd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3276 if (status == -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3277 warning(cmd);
a61af66fc99e Initial load
duke
parents:
diff changeset
3278 vm_exit_during_initialization("fork_and_exec failed: %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
3279 strerror(errno));
a61af66fc99e Initial load
duke
parents:
diff changeset
3280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3281 // when this comes back the instrument.dll should be where it belongs.
a61af66fc99e Initial load
duke
parents:
diff changeset
3282 library = hpi::dll_load(buffer, ebuf, sizeof ebuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3284 #endif // KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
3285 if (library == NULL) { // Try the local directory
a61af66fc99e Initial load
duke
parents:
diff changeset
3286 char ns[1] = {0};
a61af66fc99e Initial load
duke
parents:
diff changeset
3287 hpi::dll_build_name(buffer, sizeof(buffer), ns, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
3288 library = hpi::dll_load(buffer, ebuf, sizeof ebuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
3289 if (library == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3290 // If we can't find the agent, exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
3291 vm_exit_during_initialization("Could not find agent library on the library path or in the local directory", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
3292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 agent->set_os_lib(library);
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3297
a61af66fc99e Initial load
duke
parents:
diff changeset
3298 // Find the OnLoad function.
a61af66fc99e Initial load
duke
parents:
diff changeset
3299 for (size_t symbol_index = 0; symbol_index < num_symbol_entries; symbol_index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3300 on_load_entry = CAST_TO_FN_PTR(OnLoadEntry_t, hpi::dll_lookup(library, on_load_symbols[symbol_index]));
a61af66fc99e Initial load
duke
parents:
diff changeset
3301 if (on_load_entry != NULL) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3303 return on_load_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
3304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3305
a61af66fc99e Initial load
duke
parents:
diff changeset
3306 // Find the JVM_OnLoad entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
3307 static OnLoadEntry_t lookup_jvm_on_load(AgentLibrary* agent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3308 const char *on_load_symbols[] = JVM_ONLOAD_SYMBOLS;
a61af66fc99e Initial load
duke
parents:
diff changeset
3309 return lookup_on_load(agent, on_load_symbols, sizeof(on_load_symbols) / sizeof(char*));
a61af66fc99e Initial load
duke
parents:
diff changeset
3310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3311
a61af66fc99e Initial load
duke
parents:
diff changeset
3312 // Find the Agent_OnLoad entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
3313 static OnLoadEntry_t lookup_agent_on_load(AgentLibrary* agent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3314 const char *on_load_symbols[] = AGENT_ONLOAD_SYMBOLS;
a61af66fc99e Initial load
duke
parents:
diff changeset
3315 return lookup_on_load(agent, on_load_symbols, sizeof(on_load_symbols) / sizeof(char*));
a61af66fc99e Initial load
duke
parents:
diff changeset
3316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3317
a61af66fc99e Initial load
duke
parents:
diff changeset
3318 // For backwards compatibility with -Xrun
a61af66fc99e Initial load
duke
parents:
diff changeset
3319 // Convert libraries with no JVM_OnLoad, but which have Agent_OnLoad to be
a61af66fc99e Initial load
duke
parents:
diff changeset
3320 // treated like -agentpath:
a61af66fc99e Initial load
duke
parents:
diff changeset
3321 // Must be called before agent libraries are created
a61af66fc99e Initial load
duke
parents:
diff changeset
3322 void Threads::convert_vm_init_libraries_to_agents() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3323 AgentLibrary* agent;
a61af66fc99e Initial load
duke
parents:
diff changeset
3324 AgentLibrary* next;
a61af66fc99e Initial load
duke
parents:
diff changeset
3325
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 for (agent = Arguments::libraries(); agent != NULL; agent = next) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3327 next = agent->next(); // cache the next agent now as this agent may get moved off this list
a61af66fc99e Initial load
duke
parents:
diff changeset
3328 OnLoadEntry_t on_load_entry = lookup_jvm_on_load(agent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3329
a61af66fc99e Initial load
duke
parents:
diff changeset
3330 // If there is an JVM_OnLoad function it will get called later,
a61af66fc99e Initial load
duke
parents:
diff changeset
3331 // otherwise see if there is an Agent_OnLoad
a61af66fc99e Initial load
duke
parents:
diff changeset
3332 if (on_load_entry == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3333 on_load_entry = lookup_agent_on_load(agent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3334 if (on_load_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3335 // switch it to the agent list -- so that Agent_OnLoad will be called,
a61af66fc99e Initial load
duke
parents:
diff changeset
3336 // JVM_OnLoad won't be attempted and Agent_OnUnload will
a61af66fc99e Initial load
duke
parents:
diff changeset
3337 Arguments::convert_library_to_agent(agent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3338 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3339 vm_exit_during_initialization("Could not find JVM_OnLoad or Agent_OnLoad function in the library", agent->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
3340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3341 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3344
a61af66fc99e Initial load
duke
parents:
diff changeset
3345 // Create agents for -agentlib: -agentpath: and converted -Xrun
a61af66fc99e Initial load
duke
parents:
diff changeset
3346 // Invokes Agent_OnLoad
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 // Called very early -- before JavaThreads exist
a61af66fc99e Initial load
duke
parents:
diff changeset
3348 void Threads::create_vm_init_agents() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3349 extern struct JavaVM_ main_vm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3350 AgentLibrary* agent;
a61af66fc99e Initial load
duke
parents:
diff changeset
3351
a61af66fc99e Initial load
duke
parents:
diff changeset
3352 JvmtiExport::enter_onload_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
3353 for (agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3354 OnLoadEntry_t on_load_entry = lookup_agent_on_load(agent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3355
a61af66fc99e Initial load
duke
parents:
diff changeset
3356 if (on_load_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3357 // Invoke the Agent_OnLoad function
a61af66fc99e Initial load
duke
parents:
diff changeset
3358 jint err = (*on_load_entry)(&main_vm, agent->options(), NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3359 if (err != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 vm_exit_during_initialization("agent library failed to init", agent->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
3361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3362 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 vm_exit_during_initialization("Could not find Agent_OnLoad function in the agent library", agent->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
3364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3366 JvmtiExport::enter_primordial_phase();
a61af66fc99e Initial load
duke
parents:
diff changeset
3367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3368
a61af66fc99e Initial load
duke
parents:
diff changeset
3369 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
3370 typedef void (JNICALL *Agent_OnUnload_t)(JavaVM *);
a61af66fc99e Initial load
duke
parents:
diff changeset
3371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3372
a61af66fc99e Initial load
duke
parents:
diff changeset
3373 void Threads::shutdown_vm_agents() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3374 // Send any Agent_OnUnload notifications
a61af66fc99e Initial load
duke
parents:
diff changeset
3375 const char *on_unload_symbols[] = AGENT_ONUNLOAD_SYMBOLS;
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 extern struct JavaVM_ main_vm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3377 for (AgentLibrary* agent = Arguments::agents(); agent != NULL; agent = agent->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3378
a61af66fc99e Initial load
duke
parents:
diff changeset
3379 // Find the Agent_OnUnload function.
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 for (uint symbol_index = 0; symbol_index < ARRAY_SIZE(on_unload_symbols); symbol_index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 Agent_OnUnload_t unload_entry = CAST_TO_FN_PTR(Agent_OnUnload_t,
a61af66fc99e Initial load
duke
parents:
diff changeset
3382 hpi::dll_lookup(agent->os_lib(), on_unload_symbols[symbol_index]));
a61af66fc99e Initial load
duke
parents:
diff changeset
3383
a61af66fc99e Initial load
duke
parents:
diff changeset
3384 // Invoke the Agent_OnUnload function
a61af66fc99e Initial load
duke
parents:
diff changeset
3385 if (unload_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3386 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3387 ThreadToNativeFromVM ttn(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3388 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3389 (*unload_entry)(&main_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
3390 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3393 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3395
a61af66fc99e Initial load
duke
parents:
diff changeset
3396 // Called for after the VM is initialized for -Xrun libraries which have not been converted to agent libraries
a61af66fc99e Initial load
duke
parents:
diff changeset
3397 // Invokes JVM_OnLoad
a61af66fc99e Initial load
duke
parents:
diff changeset
3398 void Threads::create_vm_init_libraries() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3399 extern struct JavaVM_ main_vm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3400 AgentLibrary* agent;
a61af66fc99e Initial load
duke
parents:
diff changeset
3401
a61af66fc99e Initial load
duke
parents:
diff changeset
3402 for (agent = Arguments::libraries(); agent != NULL; agent = agent->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 OnLoadEntry_t on_load_entry = lookup_jvm_on_load(agent);
a61af66fc99e Initial load
duke
parents:
diff changeset
3404
a61af66fc99e Initial load
duke
parents:
diff changeset
3405 if (on_load_entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3406 // Invoke the JVM_OnLoad function
a61af66fc99e Initial load
duke
parents:
diff changeset
3407 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3408 ThreadToNativeFromVM ttn(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3409 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3410 jint err = (*on_load_entry)(&main_vm, agent->options(), NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3411 if (err != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3412 vm_exit_during_initialization("-Xrun library failed to init", agent->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
3413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3414 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3415 vm_exit_during_initialization("Could not find JVM_OnLoad function in -Xrun library", agent->name());
a61af66fc99e Initial load
duke
parents:
diff changeset
3416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3418 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3419
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 // Last thread running calls java.lang.Shutdown.shutdown()
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 void JavaThread::invoke_shutdown_hooks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3422 HandleMark hm(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
3423
a61af66fc99e Initial load
duke
parents:
diff changeset
3424 // We could get here with a pending exception, if so clear it now.
a61af66fc99e Initial load
duke
parents:
diff changeset
3425 if (this->has_pending_exception()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3426 this->clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
3427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3428
a61af66fc99e Initial load
duke
parents:
diff changeset
3429 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
3430 klassOop k =
a61af66fc99e Initial load
duke
parents:
diff changeset
3431 SystemDictionary::resolve_or_null(vmSymbolHandles::java_lang_Shutdown(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3432 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3433 if (k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3434 // SystemDictionary::resolve_or_null will return null if there was
a61af66fc99e Initial load
duke
parents:
diff changeset
3435 // an exception. If we cannot load the Shutdown class, just don't
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 // call Shutdown.shutdown() at all. This will mean the shutdown hooks
a61af66fc99e Initial load
duke
parents:
diff changeset
3437 // and finalizers (if runFinalizersOnExit is set) won't be run.
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 // Note that if a shutdown hook was registered or runFinalizersOnExit
a61af66fc99e Initial load
duke
parents:
diff changeset
3439 // was called, the Shutdown class would have already been loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
3440 // (Runtime.addShutdownHook and runFinalizersOnExit will load it).
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 instanceKlassHandle shutdown_klass (THREAD, k);
a61af66fc99e Initial load
duke
parents:
diff changeset
3442 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
3443 JavaCalls::call_static(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
3444 shutdown_klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
3445 vmSymbolHandles::shutdown_method_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 vmSymbolHandles::void_method_signature(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3447 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
3448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3451
a61af66fc99e Initial load
duke
parents:
diff changeset
3452 // Threads::destroy_vm() is normally called from jni_DestroyJavaVM() when
a61af66fc99e Initial load
duke
parents:
diff changeset
3453 // the program falls off the end of main(). Another VM exit path is through
a61af66fc99e Initial load
duke
parents:
diff changeset
3454 // vm_exit() when the program calls System.exit() to return a value or when
a61af66fc99e Initial load
duke
parents:
diff changeset
3455 // there is a serious error in VM. The two shutdown paths are not exactly
a61af66fc99e Initial load
duke
parents:
diff changeset
3456 // the same, but they share Shutdown.shutdown() at Java level and before_exit()
a61af66fc99e Initial load
duke
parents:
diff changeset
3457 // and VM_Exit op at VM level.
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3459 // Shutdown sequence:
a61af66fc99e Initial load
duke
parents:
diff changeset
3460 // + Wait until we are the last non-daemon thread to execute
a61af66fc99e Initial load
duke
parents:
diff changeset
3461 // <-- every thing is still working at this moment -->
a61af66fc99e Initial load
duke
parents:
diff changeset
3462 // + Call java.lang.Shutdown.shutdown(), which will invoke Java level
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 // shutdown hooks, run finalizers if finalization-on-exit
a61af66fc99e Initial load
duke
parents:
diff changeset
3464 // + Call before_exit(), prepare for VM exit
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 // > run VM level shutdown hooks (they are registered through JVM_OnExit(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 // currently the only user of this mechanism is File.deleteOnExit())
a61af66fc99e Initial load
duke
parents:
diff changeset
3467 // > stop flat profiler, StatSampler, watcher thread, CMS threads,
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 // post thread end and vm death events to JVMTI,
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 // stop signal thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3470 // + Call JavaThread::exit(), it will:
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 // > release JNI handle blocks, remove stack guard pages
a61af66fc99e Initial load
duke
parents:
diff changeset
3472 // > remove this thread from Threads list
a61af66fc99e Initial load
duke
parents:
diff changeset
3473 // <-- no more Java code from this thread after this point -->
a61af66fc99e Initial load
duke
parents:
diff changeset
3474 // + Stop VM thread, it will bring the remaining VM to a safepoint and stop
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 // the compiler threads at safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 // <-- do not use anything that could get blocked by Safepoint -->
a61af66fc99e Initial load
duke
parents:
diff changeset
3477 // + Disable tracing at JNI/JVM barriers
a61af66fc99e Initial load
duke
parents:
diff changeset
3478 // + Set _vm_exited flag for threads that are still running native code
a61af66fc99e Initial load
duke
parents:
diff changeset
3479 // + Delete this thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3480 // + Call exit_globals()
a61af66fc99e Initial load
duke
parents:
diff changeset
3481 // > deletes tty
a61af66fc99e Initial load
duke
parents:
diff changeset
3482 // > deletes PerfMemory resources
a61af66fc99e Initial load
duke
parents:
diff changeset
3483 // + Return to caller
a61af66fc99e Initial load
duke
parents:
diff changeset
3484
a61af66fc99e Initial load
duke
parents:
diff changeset
3485 bool Threads::destroy_vm() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3486 JavaThread* thread = JavaThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
3487
a61af66fc99e Initial load
duke
parents:
diff changeset
3488 // Wait until we are the last non-daemon thread to execute
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 { MutexLocker nu(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3490 while (Threads::number_of_non_daemon_threads() > 1 )
a61af66fc99e Initial load
duke
parents:
diff changeset
3491 // This wait should make safepoint checks, wait without a timeout,
a61af66fc99e Initial load
duke
parents:
diff changeset
3492 // and wait as a suspend-equivalent condition.
a61af66fc99e Initial load
duke
parents:
diff changeset
3493 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3494 // Note: If the FlatProfiler is running and this thread is waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
3495 // for another non-daemon thread to finish, then the FlatProfiler
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 // is waiting for the external suspend request on this thread to
a61af66fc99e Initial load
duke
parents:
diff changeset
3497 // complete. wait_for_ext_suspend_completion() will eventually
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 // timeout, but that takes time. Making this wait a suspend-
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 // equivalent condition solves that timeout problem.
a61af66fc99e Initial load
duke
parents:
diff changeset
3500 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 Threads_lock->wait(!Mutex::_no_safepoint_check_flag, 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 Mutex::_as_suspend_equivalent_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
3503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3504
a61af66fc99e Initial load
duke
parents:
diff changeset
3505 // Hang forever on exit if we are reporting an error.
a61af66fc99e Initial load
duke
parents:
diff changeset
3506 if (ShowMessageBoxOnError && is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3507 os::infinite_sleep();
a61af66fc99e Initial load
duke
parents:
diff changeset
3508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3509
a61af66fc99e Initial load
duke
parents:
diff changeset
3510 if (JDK_Version::is_jdk12x_version()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3511 // We are the last thread running, so check if finalizers should be run.
a61af66fc99e Initial load
duke
parents:
diff changeset
3512 // For 1.3 or later this is done in thread->invoke_shutdown_hooks()
a61af66fc99e Initial load
duke
parents:
diff changeset
3513 HandleMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3514 Universe::run_finalizers_on_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
3515 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3516 // run Java level shutdown hooks
a61af66fc99e Initial load
duke
parents:
diff changeset
3517 thread->invoke_shutdown_hooks();
a61af66fc99e Initial load
duke
parents:
diff changeset
3518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3519
a61af66fc99e Initial load
duke
parents:
diff changeset
3520 before_exit(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3521
a61af66fc99e Initial load
duke
parents:
diff changeset
3522 thread->exit(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
3523
a61af66fc99e Initial load
duke
parents:
diff changeset
3524 // Stop VM thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
3525 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3526 // 4945125 The vm thread comes to a safepoint during exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
3527 // GC vm_operations can get caught at the safepoint, and the
a61af66fc99e Initial load
duke
parents:
diff changeset
3528 // heap is unparseable if they are caught. Grab the Heap_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3529 // to prevent this. The GC vm_operations will not be able to
a61af66fc99e Initial load
duke
parents:
diff changeset
3530 // queue until after the vm thread is dead.
a61af66fc99e Initial load
duke
parents:
diff changeset
3531 MutexLocker ml(Heap_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3532
a61af66fc99e Initial load
duke
parents:
diff changeset
3533 VMThread::wait_for_vm_thread_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
3534 assert(SafepointSynchronize::is_at_safepoint(), "VM thread should exit at Safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
3535 VMThread::destroy();
a61af66fc99e Initial load
duke
parents:
diff changeset
3536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3537
a61af66fc99e Initial load
duke
parents:
diff changeset
3538 // clean up ideal graph printers
a61af66fc99e Initial load
duke
parents:
diff changeset
3539 #if defined(COMPILER2) && !defined(PRODUCT)
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 IdealGraphPrinter::clean_up();
a61af66fc99e Initial load
duke
parents:
diff changeset
3541 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3542
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 // Now, all Java threads are gone except daemon threads. Daemon threads
a61af66fc99e Initial load
duke
parents:
diff changeset
3544 // running Java code or in VM are stopped by the Safepoint. However,
a61af66fc99e Initial load
duke
parents:
diff changeset
3545 // daemon threads executing native code are still running. But they
a61af66fc99e Initial load
duke
parents:
diff changeset
3546 // will be stopped at native=>Java/VM barriers. Note that we can't
a61af66fc99e Initial load
duke
parents:
diff changeset
3547 // simply kill or suspend them, as it is inherently deadlock-prone.
a61af66fc99e Initial load
duke
parents:
diff changeset
3548
a61af66fc99e Initial load
duke
parents:
diff changeset
3549 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
3550 // disable function tracing at JNI/JVM barriers
a61af66fc99e Initial load
duke
parents:
diff changeset
3551 TraceHPI = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3552 TraceJNICalls = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3553 TraceJVMCalls = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3554 TraceRuntimeCalls = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3555 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3556
a61af66fc99e Initial load
duke
parents:
diff changeset
3557 VM_Exit::set_vm_exited();
a61af66fc99e Initial load
duke
parents:
diff changeset
3558
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 notify_vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
3560
a61af66fc99e Initial load
duke
parents:
diff changeset
3561 delete thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
3562
a61af66fc99e Initial load
duke
parents:
diff changeset
3563 // exit_globals() will delete tty
a61af66fc99e Initial load
duke
parents:
diff changeset
3564 exit_globals();
a61af66fc99e Initial load
duke
parents:
diff changeset
3565
a61af66fc99e Initial load
duke
parents:
diff changeset
3566 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3568
a61af66fc99e Initial load
duke
parents:
diff changeset
3569
a61af66fc99e Initial load
duke
parents:
diff changeset
3570 jboolean Threads::is_supported_jni_version_including_1_1(jint version) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3571 if (version == JNI_VERSION_1_1) return JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3572 return is_supported_jni_version(version);
a61af66fc99e Initial load
duke
parents:
diff changeset
3573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3574
a61af66fc99e Initial load
duke
parents:
diff changeset
3575
a61af66fc99e Initial load
duke
parents:
diff changeset
3576 jboolean Threads::is_supported_jni_version(jint version) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3577 if (version == JNI_VERSION_1_2) return JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3578 if (version == JNI_VERSION_1_4) return JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3579 if (version == JNI_VERSION_1_6) return JNI_TRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3580 return JNI_FALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3582
a61af66fc99e Initial load
duke
parents:
diff changeset
3583
a61af66fc99e Initial load
duke
parents:
diff changeset
3584 void Threads::add(JavaThread* p, bool force_daemon) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3585 // The threads lock must be owned at this point
a61af66fc99e Initial load
duke
parents:
diff changeset
3586 assert_locked_or_safepoint(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 p->set_next(_thread_list);
a61af66fc99e Initial load
duke
parents:
diff changeset
3588 _thread_list = p;
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 _number_of_threads++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3590 oop threadObj = p->threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 bool daemon = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3592 // Bootstrapping problem: threadObj can be null for initial
a61af66fc99e Initial load
duke
parents:
diff changeset
3593 // JavaThread (or for threads attached via JNI)
a61af66fc99e Initial load
duke
parents:
diff changeset
3594 if ((!force_daemon) && (threadObj == NULL || !java_lang_Thread::is_daemon(threadObj))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3595 _number_of_non_daemon_threads++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 daemon = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3598
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 ThreadService::add_thread(p, daemon);
a61af66fc99e Initial load
duke
parents:
diff changeset
3600
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 // Possible GC point.
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 Events::log("Thread added: " INTPTR_FORMAT, p);
a61af66fc99e Initial load
duke
parents:
diff changeset
3603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3604
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 void Threads::remove(JavaThread* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 // Extra scope needed for Thread_lock, so we can check
a61af66fc99e Initial load
duke
parents:
diff changeset
3607 // that we do not remove thread without safepoint code notice
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 { MutexLocker ml(Threads_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
3609
a61af66fc99e Initial load
duke
parents:
diff changeset
3610 assert(includes(p), "p must be present");
a61af66fc99e Initial load
duke
parents:
diff changeset
3611
a61af66fc99e Initial load
duke
parents:
diff changeset
3612 JavaThread* current = _thread_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
3613 JavaThread* prev = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3614
a61af66fc99e Initial load
duke
parents:
diff changeset
3615 while (current != p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3616 prev = current;
a61af66fc99e Initial load
duke
parents:
diff changeset
3617 current = current->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
3618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3619
a61af66fc99e Initial load
duke
parents:
diff changeset
3620 if (prev) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 prev->set_next(current->next());
a61af66fc99e Initial load
duke
parents:
diff changeset
3622 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3623 _thread_list = p->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
3624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3625 _number_of_threads--;
a61af66fc99e Initial load
duke
parents:
diff changeset
3626 oop threadObj = p->threadObj();
a61af66fc99e Initial load
duke
parents:
diff changeset
3627 bool daemon = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3628 if (threadObj == NULL || !java_lang_Thread::is_daemon(threadObj)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3629 _number_of_non_daemon_threads--;
a61af66fc99e Initial load
duke
parents:
diff changeset
3630 daemon = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3631
a61af66fc99e Initial load
duke
parents:
diff changeset
3632 // Only one thread left, do a notify on the Threads_lock so a thread waiting
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 // on destroy_vm will wake up.
a61af66fc99e Initial load
duke
parents:
diff changeset
3634 if (number_of_non_daemon_threads() == 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
3635 Threads_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
3636 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3637 ThreadService::remove_thread(p, daemon);
a61af66fc99e Initial load
duke
parents:
diff changeset
3638
a61af66fc99e Initial load
duke
parents:
diff changeset
3639 // Make sure that safepoint code disregard this thread. This is needed since
a61af66fc99e Initial load
duke
parents:
diff changeset
3640 // the thread might mess around with locks after this point. This can cause it
a61af66fc99e Initial load
duke
parents:
diff changeset
3641 // to do callbacks into the safepoint code. However, the safepoint code is not aware
a61af66fc99e Initial load
duke
parents:
diff changeset
3642 // of this thread since it is removed from the queue.
a61af66fc99e Initial load
duke
parents:
diff changeset
3643 p->set_terminated_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 } // unlock Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3645
a61af66fc99e Initial load
duke
parents:
diff changeset
3646 // Since Events::log uses a lock, we grab it outside the Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 Events::log("Thread exited: " INTPTR_FORMAT, p);
a61af66fc99e Initial load
duke
parents:
diff changeset
3648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3649
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 // Threads_lock must be held when this is called (or must be called during a safepoint)
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 bool Threads::includes(JavaThread* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 assert(Threads_lock->is_locked(), "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 ALL_JAVA_THREADS(q) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3654 if (q == p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3655 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
3656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3658 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3660
a61af66fc99e Initial load
duke
parents:
diff changeset
3661 // Operations on the Threads list for GC. These are not explicitly locked,
a61af66fc99e Initial load
duke
parents:
diff changeset
3662 // but the garbage collector must provide a safe context for them to run.
a61af66fc99e Initial load
duke
parents:
diff changeset
3663 // In particular, these things should never be called when the Threads_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
3664 // is held by some other thread. (Note: the Safepoint abstraction also
a61af66fc99e Initial load
duke
parents:
diff changeset
3665 // uses the Threads_lock to gurantee this property. It also makes sure that
a61af66fc99e Initial load
duke
parents:
diff changeset
3666 // all threads gets blocked when exiting or starting).
a61af66fc99e Initial load
duke
parents:
diff changeset
3667
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
3668 void Threads::oops_do(OopClosure* f, CodeBlobClosure* cf) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3669 ALL_JAVA_THREADS(p) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
3670 p->oops_do(f, cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3671 }
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
3672 VMThread::vm_thread()->oops_do(f, cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3674
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
3675 void Threads::possibly_parallel_oops_do(OopClosure* f, CodeBlobClosure* cf) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 // Introduce a mechanism allowing parallel threads to claim threads as
a61af66fc99e Initial load
duke
parents:
diff changeset
3677 // root groups. Overhead should be small enough to use all the time,
a61af66fc99e Initial load
duke
parents:
diff changeset
3678 // even in sequential code.
a61af66fc99e Initial load
duke
parents:
diff changeset
3679 SharedHeap* sh = SharedHeap::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
3680 bool is_par = (sh->n_par_threads() > 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3681 int cp = SharedHeap::heap()->strong_roots_parity();
a61af66fc99e Initial load
duke
parents:
diff changeset
3682 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3683 if (p->claim_oops_do(is_par, cp)) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
3684 p->oops_do(f, cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3687 VMThread* vmt = VMThread::vm_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 if (vmt->claim_oops_do(is_par, cp))
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
3689 vmt->oops_do(f, cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3690 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3691
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
3693 // Used by ParallelScavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
3694 void Threads::create_thread_roots_tasks(GCTaskQueue* q) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3695 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3696 q->enqueue(new ThreadRootsTask(p));
a61af66fc99e Initial load
duke
parents:
diff changeset
3697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3698 q->enqueue(new ThreadRootsTask(VMThread::vm_thread()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3700
a61af66fc99e Initial load
duke
parents:
diff changeset
3701 // Used by Parallel Old
a61af66fc99e Initial load
duke
parents:
diff changeset
3702 void Threads::create_thread_roots_marking_tasks(GCTaskQueue* q) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3703 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3704 q->enqueue(new ThreadRootsMarkingTask(p));
a61af66fc99e Initial load
duke
parents:
diff changeset
3705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3706 q->enqueue(new ThreadRootsMarkingTask(VMThread::vm_thread()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3707 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3708 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
3709
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
3710 void Threads::nmethods_do(CodeBlobClosure* cf) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3711 ALL_JAVA_THREADS(p) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
3712 p->nmethods_do(cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3713 }
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
3714 VMThread::vm_thread()->nmethods_do(cf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3716
a61af66fc99e Initial load
duke
parents:
diff changeset
3717 void Threads::gc_epilogue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3718 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3719 p->gc_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
3720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3721 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3722
a61af66fc99e Initial load
duke
parents:
diff changeset
3723 void Threads::gc_prologue() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3724 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3725 p->gc_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
3726 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3727 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3728
a61af66fc99e Initial load
duke
parents:
diff changeset
3729 void Threads::deoptimized_wrt_marked_nmethods() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3730 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3731 p->deoptimized_wrt_marked_nmethods();
a61af66fc99e Initial load
duke
parents:
diff changeset
3732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3733 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3734
a61af66fc99e Initial load
duke
parents:
diff changeset
3735
a61af66fc99e Initial load
duke
parents:
diff changeset
3736 // Get count Java threads that are waiting to enter the specified monitor.
a61af66fc99e Initial load
duke
parents:
diff changeset
3737 GrowableArray<JavaThread*>* Threads::get_pending_threads(int count,
a61af66fc99e Initial load
duke
parents:
diff changeset
3738 address monitor, bool doLock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3739 assert(doLock || SafepointSynchronize::is_at_safepoint(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3740 "must grab Threads_lock or be at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
3741 GrowableArray<JavaThread*>* result = new GrowableArray<JavaThread*>(count);
a61af66fc99e Initial load
duke
parents:
diff changeset
3742
a61af66fc99e Initial load
duke
parents:
diff changeset
3743 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3744 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3745 MutexLockerEx ml(doLock ? Threads_lock : NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3746 ALL_JAVA_THREADS(p) {
1410
b30a2cd5e3a2 Added methods to c1x_VMExits.cpp
Thomas Wuerthinger <thomas.wuerthinger@gmail.com>
parents: 1320
diff changeset
3747
b30a2cd5e3a2 Added methods to c1x_VMExits.cpp
Thomas Wuerthinger <thomas.wuerthinger@gmail.com>
parents: 1320
diff changeset
3748 // (tw) May we do this?
b30a2cd5e3a2 Added methods to c1x_VMExits.cpp
Thomas Wuerthinger <thomas.wuerthinger@gmail.com>
parents: 1320
diff changeset
3749 //if (p->is_Compiler_thread()) continue;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3750
a61af66fc99e Initial load
duke
parents:
diff changeset
3751 address pending = (address)p->current_pending_monitor();
a61af66fc99e Initial load
duke
parents:
diff changeset
3752 if (pending == monitor) { // found a match
a61af66fc99e Initial load
duke
parents:
diff changeset
3753 if (i < count) result->append(p); // save the first count matches
a61af66fc99e Initial load
duke
parents:
diff changeset
3754 i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
3755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3757 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3758 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
3759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3760
a61af66fc99e Initial load
duke
parents:
diff changeset
3761
a61af66fc99e Initial load
duke
parents:
diff changeset
3762 JavaThread *Threads::owning_thread_from_monitor_owner(address owner, bool doLock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3763 assert(doLock ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3764 Threads_lock->owned_by_self() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
3765 SafepointSynchronize::is_at_safepoint(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3766 "must grab Threads_lock or be at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
3767
a61af66fc99e Initial load
duke
parents:
diff changeset
3768 // NULL owner means not locked so we can skip the search
a61af66fc99e Initial load
duke
parents:
diff changeset
3769 if (owner == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3770
a61af66fc99e Initial load
duke
parents:
diff changeset
3771 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3772 MutexLockerEx ml(doLock ? Threads_lock : NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3773 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3774 // first, see if owner is the address of a Java thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3775 if (owner == (address)p) return p;
a61af66fc99e Initial load
duke
parents:
diff changeset
3776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3778 assert(UseHeavyMonitors == false, "Did not find owning Java thread with UseHeavyMonitors enabled");
a61af66fc99e Initial load
duke
parents:
diff changeset
3779 if (UseHeavyMonitors) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3780
a61af66fc99e Initial load
duke
parents:
diff changeset
3781 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3782 // If we didn't find a matching Java thread and we didn't force use of
a61af66fc99e Initial load
duke
parents:
diff changeset
3783 // heavyweight monitors, then the owner is the stack address of the
a61af66fc99e Initial load
duke
parents:
diff changeset
3784 // Lock Word in the owning Java thread's stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
3785 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3786 JavaThread* the_owner = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3787 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3788 MutexLockerEx ml(doLock ? Threads_lock : NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
3789 ALL_JAVA_THREADS(q) {
702
b9fba36710f2 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 669
diff changeset
3790 if (q->is_lock_owned(owner)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3791 the_owner = q;
702
b9fba36710f2 6699669: Hotspot server leaves synchronized block with monitor in bad state
xlu
parents: 669
diff changeset
3792 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3796 assert(the_owner != NULL, "Did not find owning Java thread for lock word address");
a61af66fc99e Initial load
duke
parents:
diff changeset
3797 return the_owner;
a61af66fc99e Initial load
duke
parents:
diff changeset
3798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3799
a61af66fc99e Initial load
duke
parents:
diff changeset
3800 // Threads::print_on() is called at safepoint by VM_PrintThreads operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
3801 void Threads::print_on(outputStream* st, bool print_stacks, bool internal_format, bool print_concurrent_locks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3802 char buf[32];
a61af66fc99e Initial load
duke
parents:
diff changeset
3803 st->print_cr(os::local_time_string(buf, sizeof(buf)));
a61af66fc99e Initial load
duke
parents:
diff changeset
3804
a61af66fc99e Initial load
duke
parents:
diff changeset
3805 st->print_cr("Full thread dump %s (%s %s):",
a61af66fc99e Initial load
duke
parents:
diff changeset
3806 Abstract_VM_Version::vm_name(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3807 Abstract_VM_Version::vm_release(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3808 Abstract_VM_Version::vm_info_string()
a61af66fc99e Initial load
duke
parents:
diff changeset
3809 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3810 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3811
a61af66fc99e Initial load
duke
parents:
diff changeset
3812 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
3813 // Dump concurrent locks
a61af66fc99e Initial load
duke
parents:
diff changeset
3814 ConcurrentLocksDump concurrent_locks;
a61af66fc99e Initial load
duke
parents:
diff changeset
3815 if (print_concurrent_locks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3816 concurrent_locks.dump_at_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
3817 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3818 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
3819
a61af66fc99e Initial load
duke
parents:
diff changeset
3820 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3821 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
3822 p->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
3823 if (print_stacks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3824 if (internal_format) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3825 p->trace_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
3826 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3827 p->print_stack_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
3828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3830 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3831 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
3832 if (print_concurrent_locks) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3833 concurrent_locks.print_locks_on(p, st);
a61af66fc99e Initial load
duke
parents:
diff changeset
3834 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3835 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
3836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3837
a61af66fc99e Initial load
duke
parents:
diff changeset
3838 VMThread::vm_thread()->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
3839 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3840 Universe::heap()->print_gc_threads_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
3841 WatcherThread* wt = WatcherThread::watcher_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3842 if (wt != NULL) wt->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
3843 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3844 CompileBroker::print_compiler_threads_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
3845 st->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
3846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3847
a61af66fc99e Initial load
duke
parents:
diff changeset
3848 // Threads::print_on_error() is called by fatal error handler. It's possible
a61af66fc99e Initial load
duke
parents:
diff changeset
3849 // that VM is not at safepoint and/or current thread is inside signal handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
3850 // Don't print stack trace, as the stack may not be walkable. Don't allocate
a61af66fc99e Initial load
duke
parents:
diff changeset
3851 // memory (even in resource area), it might deadlock the error handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
3852 void Threads::print_on_error(outputStream* st, Thread* current, char* buf, int buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3853 bool found_current = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
3854 st->print_cr("Java Threads: ( => current thread )");
a61af66fc99e Initial load
duke
parents:
diff changeset
3855 ALL_JAVA_THREADS(thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3856 bool is_current = (current == thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3857 found_current = found_current || is_current;
a61af66fc99e Initial load
duke
parents:
diff changeset
3858
a61af66fc99e Initial load
duke
parents:
diff changeset
3859 st->print("%s", is_current ? "=>" : " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
3860
a61af66fc99e Initial load
duke
parents:
diff changeset
3861 st->print(PTR_FORMAT, thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
3862 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
3863 thread->print_on_error(st, buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
3864 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3866 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3867
a61af66fc99e Initial load
duke
parents:
diff changeset
3868 st->print_cr("Other Threads:");
a61af66fc99e Initial load
duke
parents:
diff changeset
3869 if (VMThread::vm_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3870 bool is_current = (current == VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
3871 found_current = found_current || is_current;
a61af66fc99e Initial load
duke
parents:
diff changeset
3872 st->print("%s", current == VMThread::vm_thread() ? "=>" : " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
3873
a61af66fc99e Initial load
duke
parents:
diff changeset
3874 st->print(PTR_FORMAT, VMThread::vm_thread());
a61af66fc99e Initial load
duke
parents:
diff changeset
3875 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
3876 VMThread::vm_thread()->print_on_error(st, buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
3877 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3879 WatcherThread* wt = WatcherThread::watcher_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
3880 if (wt != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3881 bool is_current = (current == wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
3882 found_current = found_current || is_current;
a61af66fc99e Initial load
duke
parents:
diff changeset
3883 st->print("%s", is_current ? "=>" : " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
3884
a61af66fc99e Initial load
duke
parents:
diff changeset
3885 st->print(PTR_FORMAT, wt);
a61af66fc99e Initial load
duke
parents:
diff changeset
3886 st->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
3887 wt->print_on_error(st, buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
3888 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3890 if (!found_current) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3891 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3892 st->print("=>" PTR_FORMAT " (exited) ", current);
a61af66fc99e Initial load
duke
parents:
diff changeset
3893 current->print_on_error(st, buf, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
3894 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
3895 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3897
a61af66fc99e Initial load
duke
parents:
diff changeset
3898
a61af66fc99e Initial load
duke
parents:
diff changeset
3899 // Lifecycle management for TSM ParkEvents.
a61af66fc99e Initial load
duke
parents:
diff changeset
3900 // ParkEvents are type-stable (TSM).
a61af66fc99e Initial load
duke
parents:
diff changeset
3901 // In our particular implementation they happen to be immortal.
a61af66fc99e Initial load
duke
parents:
diff changeset
3902 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3903 // We manage concurrency on the FreeList with a CAS-based
a61af66fc99e Initial load
duke
parents:
diff changeset
3904 // detach-modify-reattach idiom that avoids the ABA problems
a61af66fc99e Initial load
duke
parents:
diff changeset
3905 // that would otherwise be present in a simple CAS-based
a61af66fc99e Initial load
duke
parents:
diff changeset
3906 // push-pop implementation. (push-one and pop-all)
a61af66fc99e Initial load
duke
parents:
diff changeset
3907 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3908 // Caveat: Allocate() and Release() may be called from threads
a61af66fc99e Initial load
duke
parents:
diff changeset
3909 // other than the thread associated with the Event!
a61af66fc99e Initial load
duke
parents:
diff changeset
3910 // If we need to call Allocate() when running as the thread in
a61af66fc99e Initial load
duke
parents:
diff changeset
3911 // question then look for the PD calls to initialize native TLS.
a61af66fc99e Initial load
duke
parents:
diff changeset
3912 // Native TLS (Win32/Linux/Solaris) can only be initialized or
a61af66fc99e Initial load
duke
parents:
diff changeset
3913 // accessed by the associated thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
3914 // See also pd_initialize().
a61af66fc99e Initial load
duke
parents:
diff changeset
3915 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3916 // Note that we could defer associating a ParkEvent with a thread
a61af66fc99e Initial load
duke
parents:
diff changeset
3917 // until the 1st time the thread calls park(). unpark() calls to
a61af66fc99e Initial load
duke
parents:
diff changeset
3918 // an unprovisioned thread would be ignored. The first park() call
a61af66fc99e Initial load
duke
parents:
diff changeset
3919 // for a thread would allocate and associate a ParkEvent and return
a61af66fc99e Initial load
duke
parents:
diff changeset
3920 // immediately.
a61af66fc99e Initial load
duke
parents:
diff changeset
3921
a61af66fc99e Initial load
duke
parents:
diff changeset
3922 volatile int ParkEvent::ListLock = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3923 ParkEvent * volatile ParkEvent::FreeList = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3924
a61af66fc99e Initial load
duke
parents:
diff changeset
3925 ParkEvent * ParkEvent::Allocate (Thread * t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3926 // In rare cases -- JVM_RawMonitor* operations -- we can find t == null.
a61af66fc99e Initial load
duke
parents:
diff changeset
3927 ParkEvent * ev ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3928
a61af66fc99e Initial load
duke
parents:
diff changeset
3929 // Start by trying to recycle an existing but unassociated
a61af66fc99e Initial load
duke
parents:
diff changeset
3930 // ParkEvent from the global free list.
a61af66fc99e Initial load
duke
parents:
diff changeset
3931 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3932 ev = FreeList ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3933 if (ev == NULL) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3934 // 1: Detach - sequester or privatize the list
a61af66fc99e Initial load
duke
parents:
diff changeset
3935 // Tantamount to ev = Swap (&FreeList, NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
3936 if (Atomic::cmpxchg_ptr (NULL, &FreeList, ev) != ev) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3937 continue ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3938 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3939
a61af66fc99e Initial load
duke
parents:
diff changeset
3940 // We've detached the list. The list in-hand is now
a61af66fc99e Initial load
duke
parents:
diff changeset
3941 // local to this thread. This thread can operate on the
a61af66fc99e Initial load
duke
parents:
diff changeset
3942 // list without risk of interference from other threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
3943 // 2: Extract -- pop the 1st element from the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
3944 ParkEvent * List = ev->FreeNext ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3945 if (List == NULL) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3946 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3947 // 3: Try to reattach the residual list
a61af66fc99e Initial load
duke
parents:
diff changeset
3948 guarantee (List != NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3949 ParkEvent * Arv = (ParkEvent *) Atomic::cmpxchg_ptr (List, &FreeList, NULL) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3950 if (Arv == NULL) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3951
a61af66fc99e Initial load
duke
parents:
diff changeset
3952 // New nodes arrived. Try to detach the recent arrivals.
a61af66fc99e Initial load
duke
parents:
diff changeset
3953 if (Atomic::cmpxchg_ptr (NULL, &FreeList, Arv) != Arv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3954 continue ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3955 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3956 guarantee (Arv != NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3957 // 4: Merge Arv into List
a61af66fc99e Initial load
duke
parents:
diff changeset
3958 ParkEvent * Tail = List ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3959 while (Tail->FreeNext != NULL) Tail = Tail->FreeNext ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3960 Tail->FreeNext = Arv ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3961 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3962 break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3963 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3964
a61af66fc99e Initial load
duke
parents:
diff changeset
3965 if (ev != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3966 guarantee (ev->AssociatedWith == NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3967 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3968 // Do this the hard way -- materialize a new ParkEvent.
a61af66fc99e Initial load
duke
parents:
diff changeset
3969 // In rare cases an allocating thread might detach a long list --
a61af66fc99e Initial load
duke
parents:
diff changeset
3970 // installing null into FreeList -- and then stall or be obstructed.
a61af66fc99e Initial load
duke
parents:
diff changeset
3971 // A 2nd thread calling Allocate() would see FreeList == null.
a61af66fc99e Initial load
duke
parents:
diff changeset
3972 // The list held privately by the 1st thread is unavailable to the 2nd thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
3973 // In that case the 2nd thread would have to materialize a new ParkEvent,
a61af66fc99e Initial load
duke
parents:
diff changeset
3974 // even though free ParkEvents existed in the system. In this case we end up
a61af66fc99e Initial load
duke
parents:
diff changeset
3975 // with more ParkEvents in circulation than we need, but the race is
a61af66fc99e Initial load
duke
parents:
diff changeset
3976 // rare and the outcome is benign. Ideally, the # of extant ParkEvents
a61af66fc99e Initial load
duke
parents:
diff changeset
3977 // is equal to the maximum # of threads that existed at any one time.
a61af66fc99e Initial load
duke
parents:
diff changeset
3978 // Because of the race mentioned above, segments of the freelist
a61af66fc99e Initial load
duke
parents:
diff changeset
3979 // can be transiently inaccessible. At worst we may end up with the
a61af66fc99e Initial load
duke
parents:
diff changeset
3980 // # of ParkEvents in circulation slightly above the ideal.
a61af66fc99e Initial load
duke
parents:
diff changeset
3981 // Note that if we didn't have the TSM/immortal constraint, then
a61af66fc99e Initial load
duke
parents:
diff changeset
3982 // when reattaching, above, we could trim the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
3983 ev = new ParkEvent () ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3984 guarantee ((intptr_t(ev) & 0xFF) == 0, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3986 ev->reset() ; // courtesy to caller
a61af66fc99e Initial load
duke
parents:
diff changeset
3987 ev->AssociatedWith = t ; // Associate ev with t
a61af66fc99e Initial load
duke
parents:
diff changeset
3988 ev->FreeNext = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3989 return ev ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3990 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3991
a61af66fc99e Initial load
duke
parents:
diff changeset
3992 void ParkEvent::Release (ParkEvent * ev) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3993 if (ev == NULL) return ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3994 guarantee (ev->FreeNext == NULL , "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3995 ev->AssociatedWith = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
3996 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3997 // Push ev onto FreeList
a61af66fc99e Initial load
duke
parents:
diff changeset
3998 // The mechanism is "half" lock-free.
a61af66fc99e Initial load
duke
parents:
diff changeset
3999 ParkEvent * List = FreeList ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4000 ev->FreeNext = List ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4001 if (Atomic::cmpxchg_ptr (ev, &FreeList, List) == List) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4002 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4003 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4004
a61af66fc99e Initial load
duke
parents:
diff changeset
4005 // Override operator new and delete so we can ensure that the
a61af66fc99e Initial load
duke
parents:
diff changeset
4006 // least significant byte of ParkEvent addresses is 0.
a61af66fc99e Initial load
duke
parents:
diff changeset
4007 // Beware that excessive address alignment is undesirable
a61af66fc99e Initial load
duke
parents:
diff changeset
4008 // as it can result in D$ index usage imbalance as
a61af66fc99e Initial load
duke
parents:
diff changeset
4009 // well as bank access imbalance on Niagara-like platforms,
a61af66fc99e Initial load
duke
parents:
diff changeset
4010 // although Niagara's hash function should help.
a61af66fc99e Initial load
duke
parents:
diff changeset
4011
a61af66fc99e Initial load
duke
parents:
diff changeset
4012 void * ParkEvent::operator new (size_t sz) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4013 return (void *) ((intptr_t (CHeapObj::operator new (sz + 256)) + 256) & -256) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4014 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4015
a61af66fc99e Initial load
duke
parents:
diff changeset
4016 void ParkEvent::operator delete (void * a) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4017 // ParkEvents are type-stable and immortal ...
a61af66fc99e Initial load
duke
parents:
diff changeset
4018 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
4019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4020
a61af66fc99e Initial load
duke
parents:
diff changeset
4021
a61af66fc99e Initial load
duke
parents:
diff changeset
4022 // 6399321 As a temporary measure we copied & modified the ParkEvent::
a61af66fc99e Initial load
duke
parents:
diff changeset
4023 // allocate() and release() code for use by Parkers. The Parker:: forms
a61af66fc99e Initial load
duke
parents:
diff changeset
4024 // will eventually be removed as we consolide and shift over to ParkEvents
a61af66fc99e Initial load
duke
parents:
diff changeset
4025 // for both builtin synchronization and JSR166 operations.
a61af66fc99e Initial load
duke
parents:
diff changeset
4026
a61af66fc99e Initial load
duke
parents:
diff changeset
4027 volatile int Parker::ListLock = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4028 Parker * volatile Parker::FreeList = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4029
a61af66fc99e Initial load
duke
parents:
diff changeset
4030 Parker * Parker::Allocate (JavaThread * t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4031 guarantee (t != NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4032 Parker * p ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4033
a61af66fc99e Initial load
duke
parents:
diff changeset
4034 // Start by trying to recycle an existing but unassociated
a61af66fc99e Initial load
duke
parents:
diff changeset
4035 // Parker from the global free list.
a61af66fc99e Initial load
duke
parents:
diff changeset
4036 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4037 p = FreeList ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4038 if (p == NULL) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4039 // 1: Detach
a61af66fc99e Initial load
duke
parents:
diff changeset
4040 // Tantamount to p = Swap (&FreeList, NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
4041 if (Atomic::cmpxchg_ptr (NULL, &FreeList, p) != p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4042 continue ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4044
a61af66fc99e Initial load
duke
parents:
diff changeset
4045 // We've detached the list. The list in-hand is now
a61af66fc99e Initial load
duke
parents:
diff changeset
4046 // local to this thread. This thread can operate on the
a61af66fc99e Initial load
duke
parents:
diff changeset
4047 // list without risk of interference from other threads.
a61af66fc99e Initial load
duke
parents:
diff changeset
4048 // 2: Extract -- pop the 1st element from the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
4049 Parker * List = p->FreeNext ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4050 if (List == NULL) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4051 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4052 // 3: Try to reattach the residual list
a61af66fc99e Initial load
duke
parents:
diff changeset
4053 guarantee (List != NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4054 Parker * Arv = (Parker *) Atomic::cmpxchg_ptr (List, &FreeList, NULL) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4055 if (Arv == NULL) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4056
a61af66fc99e Initial load
duke
parents:
diff changeset
4057 // New nodes arrived. Try to detach the recent arrivals.
a61af66fc99e Initial load
duke
parents:
diff changeset
4058 if (Atomic::cmpxchg_ptr (NULL, &FreeList, Arv) != Arv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4059 continue ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4060 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4061 guarantee (Arv != NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4062 // 4: Merge Arv into List
a61af66fc99e Initial load
duke
parents:
diff changeset
4063 Parker * Tail = List ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4064 while (Tail->FreeNext != NULL) Tail = Tail->FreeNext ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4065 Tail->FreeNext = Arv ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4066 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4067 break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4069
a61af66fc99e Initial load
duke
parents:
diff changeset
4070 if (p != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4071 guarantee (p->AssociatedWith == NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4072 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
4073 // Do this the hard way -- materialize a new Parker..
a61af66fc99e Initial load
duke
parents:
diff changeset
4074 // In rare cases an allocating thread might detach
a61af66fc99e Initial load
duke
parents:
diff changeset
4075 // a long list -- installing null into FreeList --and
a61af66fc99e Initial load
duke
parents:
diff changeset
4076 // then stall. Another thread calling Allocate() would see
a61af66fc99e Initial load
duke
parents:
diff changeset
4077 // FreeList == null and then invoke the ctor. In this case we
a61af66fc99e Initial load
duke
parents:
diff changeset
4078 // end up with more Parkers in circulation than we need, but
a61af66fc99e Initial load
duke
parents:
diff changeset
4079 // the race is rare and the outcome is benign.
a61af66fc99e Initial load
duke
parents:
diff changeset
4080 // Ideally, the # of extant Parkers is equal to the
a61af66fc99e Initial load
duke
parents:
diff changeset
4081 // maximum # of threads that existed at any one time.
a61af66fc99e Initial load
duke
parents:
diff changeset
4082 // Because of the race mentioned above, segments of the
a61af66fc99e Initial load
duke
parents:
diff changeset
4083 // freelist can be transiently inaccessible. At worst
a61af66fc99e Initial load
duke
parents:
diff changeset
4084 // we may end up with the # of Parkers in circulation
a61af66fc99e Initial load
duke
parents:
diff changeset
4085 // slightly above the ideal.
a61af66fc99e Initial load
duke
parents:
diff changeset
4086 p = new Parker() ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4088 p->AssociatedWith = t ; // Associate p with t
a61af66fc99e Initial load
duke
parents:
diff changeset
4089 p->FreeNext = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4090 return p ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4092
a61af66fc99e Initial load
duke
parents:
diff changeset
4093
a61af66fc99e Initial load
duke
parents:
diff changeset
4094 void Parker::Release (Parker * p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4095 if (p == NULL) return ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4096 guarantee (p->AssociatedWith != NULL, "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4097 guarantee (p->FreeNext == NULL , "invariant") ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4098 p->AssociatedWith = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4099 for (;;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4100 // Push p onto FreeList
a61af66fc99e Initial load
duke
parents:
diff changeset
4101 Parker * List = FreeList ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4102 p->FreeNext = List ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4103 if (Atomic::cmpxchg_ptr (p, &FreeList, List) == List) break ;
a61af66fc99e Initial load
duke
parents:
diff changeset
4104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4106
a61af66fc99e Initial load
duke
parents:
diff changeset
4107 void Threads::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
4108 ALL_JAVA_THREADS(p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
4109 p->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
4110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
4111 VMThread* thread = VMThread::vm_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
4112 if (thread != NULL) thread->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
4113 }