annotate src/share/vm/runtime/thread.cpp @ 1842:6e0aac35bfa9

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