1 /*
2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "classfile/symbolTable.hpp"
27 #include "classfile/vmSymbols.hpp"
28 #include "code/codeCache.hpp"
29 #include "compiler/compileBroker.hpp"
30 #include "gc/shared/isGCActiveMark.hpp"
31 #include "logging/log.hpp"
32 #include "logging/logStream.hpp"
33 #include "memory/heapInspection.hpp"
34 #include "memory/resourceArea.hpp"
35 #include "oops/symbol.hpp"
36 #include "runtime/arguments.hpp"
37 #include "runtime/deoptimization.hpp"
38 #include "runtime/interfaceSupport.hpp"
39 #include "runtime/sweeper.hpp"
40 #include "runtime/thread.inline.hpp"
41 #include "runtime/vm_operations.hpp"
42 #include "services/threadService.hpp"
43 #include "trace/tracing.hpp"
44
45 #define VM_OP_NAME_INITIALIZE(name) #name,
46
47 const char* VM_Operation::_names[VM_Operation::VMOp_Terminating] = \
48 { VM_OPS_DO(VM_OP_NAME_INITIALIZE) };
49
50 void VM_Operation::set_calling_thread(Thread* thread, ThreadPriority priority) {
51 _calling_thread = thread;
52 assert(MinPriority <= priority && priority <= MaxPriority, "sanity check");
53 _priority = priority;
54 }
55
56
57 void VM_Operation::evaluate() {
58 ResourceMark rm;
59 LogTarget(Debug, vmoperation) lt;
60 if (lt.is_enabled()) {
79 case _concurrent : return "concurrent";
80 case _async_safepoint: return "async safepoint";
81 default : return "unknown";
82 }
83 }
84 // Called by fatal error handler.
85 void VM_Operation::print_on_error(outputStream* st) const {
86 st->print("VM_Operation (" PTR_FORMAT "): ", p2i(this));
87 st->print("%s", name());
88
89 const char* mode = mode_to_string(evaluation_mode());
90 st->print(", mode: %s", mode);
91
92 if (calling_thread()) {
93 st->print(", requested by thread " PTR_FORMAT, p2i(calling_thread()));
94 }
95 }
96
97 void VM_ThreadStop::doit() {
98 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
99 JavaThread* target = java_lang_Thread::thread(target_thread());
100 // Note that this now allows multiple ThreadDeath exceptions to be
101 // thrown at a thread.
102 if (target != NULL) {
103 // the thread has run and is not already in the process of exiting
104 target->send_thread_stop(throwable());
105 }
106 }
107
108 void VM_ClearICs::doit() {
109 if (_preserve_static_stubs) {
110 CodeCache::cleanup_inline_caches();
111 } else {
112 CodeCache::clear_inline_caches();
113 }
114 }
115
116 void VM_Deoptimize::doit() {
117 // We do not want any GCs to happen while we are in the middle of this VM operation
118 ResourceMark rm;
119 DeoptimizationMarker dm;
120
121 // Deoptimize all activations depending on marked nmethods
122 Deoptimization::deoptimize_dependents();
123
129 NMethodSweeper::mark_active_nmethods();
130 }
131
132 VM_DeoptimizeFrame::VM_DeoptimizeFrame(JavaThread* thread, intptr_t* id, int reason) {
133 _thread = thread;
134 _id = id;
135 _reason = reason;
136 }
137
138
139 void VM_DeoptimizeFrame::doit() {
140 assert(_reason > Deoptimization::Reason_none && _reason < Deoptimization::Reason_LIMIT, "invalid deopt reason");
141 Deoptimization::deoptimize_frame_internal(_thread, _id, (Deoptimization::DeoptReason)_reason);
142 }
143
144
145 #ifndef PRODUCT
146
147 void VM_DeoptimizeAll::doit() {
148 DeoptimizationMarker dm;
149 // deoptimize all java threads in the system
150 if (DeoptimizeALot) {
151 for (JavaThread* thread = Threads::first(); thread != NULL; thread = thread->next()) {
152 if (thread->has_last_Java_frame()) {
153 thread->deoptimize();
154 }
155 }
156 } else if (DeoptimizeRandom) {
157
158 // Deoptimize some selected threads and frames
159 int tnum = os::random() & 0x3;
160 int fnum = os::random() & 0x3;
161 int tcount = 0;
162 for (JavaThread* thread = Threads::first(); thread != NULL; thread = thread->next()) {
163 if (thread->has_last_Java_frame()) {
164 if (tcount++ == tnum) {
165 tcount = 0;
166 int fcount = 0;
167 // Deoptimize some selected frames.
168 // Biased llocking wants a updated register map
169 for(StackFrameStream fst(thread, UseBiasedLocking); !fst.is_done(); fst.next()) {
170 if (fst.current()->can_be_deoptimized()) {
171 if (fcount++ == fnum) {
172 fcount = 0;
173 Deoptimization::deoptimize(thread, *fst.current(), fst.register_map());
174 }
175 }
176 }
177 }
178 }
179 }
180 }
181 }
182
238 cycle = cycle->next();
239 delete d;
240 }
241 }
242 }
243
244 bool VM_FindDeadlocks::doit_prologue() {
245 if (_concurrent_locks) {
246 // Make sure AbstractOwnableSynchronizer is loaded
247 JavaThread* jt = JavaThread::current();
248 java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(jt);
249 if (jt->has_pending_exception()) {
250 return false;
251 }
252 }
253
254 return true;
255 }
256
257 void VM_FindDeadlocks::doit() {
258 _deadlocks = ThreadService::find_deadlocks_at_safepoint(_concurrent_locks);
259 if (_out != NULL) {
260 int num_deadlocks = 0;
261 for (DeadlockCycle* cycle = _deadlocks; cycle != NULL; cycle = cycle->next()) {
262 num_deadlocks++;
263 cycle->print_on(_out);
264 }
265
266 if (num_deadlocks == 1) {
267 _out->print_cr("\nFound 1 deadlock.\n");
268 _out->flush();
269 } else if (num_deadlocks > 1) {
270 _out->print_cr("\nFound %d deadlocks.\n", num_deadlocks);
271 _out->flush();
272 }
273 }
274 }
275
276 VM_ThreadDump::VM_ThreadDump(ThreadDumpResult* result,
277 int max_depth,
278 bool with_locked_monitors,
279 bool with_locked_synchronizers) {
280 _result = result;
281 _num_threads = 0; // 0 indicates all threads
282 _threads = NULL;
283 _result = result;
310 }
311
312 if (_with_locked_synchronizers) {
313 // Acquire Heap_lock to dump concurrent locks
314 Heap_lock->lock();
315 }
316
317 return true;
318 }
319
320 void VM_ThreadDump::doit_epilogue() {
321 if (_with_locked_synchronizers) {
322 // Release Heap_lock
323 Heap_lock->unlock();
324 }
325 }
326
327 void VM_ThreadDump::doit() {
328 ResourceMark rm;
329
330 ConcurrentLocksDump concurrent_locks(true);
331 if (_with_locked_synchronizers) {
332 concurrent_locks.dump_at_safepoint();
333 }
334
335 if (_num_threads == 0) {
336 // Snapshot all live threads
337 for (JavaThread* jt = Threads::first(); jt != NULL; jt = jt->next()) {
338 if (jt->is_exiting() ||
339 jt->is_hidden_from_external_view()) {
340 // skip terminating threads and hidden threads
341 continue;
342 }
343 ThreadConcurrentLocks* tcl = NULL;
344 if (_with_locked_synchronizers) {
345 tcl = concurrent_locks.thread_concurrent_locks(jt);
346 }
347 ThreadSnapshot* ts = snapshot_thread(jt, tcl);
348 _result->add_thread_snapshot(ts);
349 }
350 } else {
351 // Snapshot threads in the given _threads array
352 // A dummy snapshot is created if a thread doesn't exist
353 for (int i = 0; i < _num_threads; i++) {
354 instanceHandle th = _threads->at(i);
355 if (th() == NULL) {
356 // skip if the thread doesn't exist
357 // Add a dummy snapshot
358 _result->add_thread_snapshot(new ThreadSnapshot());
359 continue;
360 }
361
362 // Dump thread stack only if the thread is alive and not exiting
363 // and not VM internal thread.
364 JavaThread* jt = java_lang_Thread::thread(th());
365 if (jt == NULL || /* thread not alive */
366 jt->is_exiting() ||
367 jt->is_hidden_from_external_view()) {
368 // add a NULL snapshot if skipped
369 _result->add_thread_snapshot(new ThreadSnapshot());
370 continue;
371 }
372 ThreadConcurrentLocks* tcl = NULL;
373 if (_with_locked_synchronizers) {
374 tcl = concurrent_locks.thread_concurrent_locks(jt);
375 }
376 ThreadSnapshot* ts = snapshot_thread(jt, tcl);
377 _result->add_thread_snapshot(ts);
378 }
379 }
380 }
381
382 ThreadSnapshot* VM_ThreadDump::snapshot_thread(JavaThread* java_thread, ThreadConcurrentLocks* tcl) {
383 ThreadSnapshot* snapshot = new ThreadSnapshot(java_thread);
384 snapshot->dump_stack_at_safepoint(_max_depth, _with_locked_monitors);
385 snapshot->set_concurrent_locks(tcl);
386 return snapshot;
387 }
388
389 volatile bool VM_Exit::_vm_exited = false;
390 Thread * VM_Exit::_shutdown_thread = NULL;
391
392 int VM_Exit::set_vm_exited() {
393
394 Thread * thr_cur = Thread::current();
395
396 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint already");
397
398 int num_active = 0;
399
400 _shutdown_thread = thr_cur;
401 _vm_exited = true; // global flag
402 for(JavaThread *thr = Threads::first(); thr != NULL; thr = thr->next())
403 if (thr!=thr_cur && thr->thread_state() == _thread_in_native) {
404 ++num_active;
405 thr->set_terminated(JavaThread::_vm_exited); // per-thread flag
406 }
407
408 return num_active;
409 }
410
411 int VM_Exit::wait_for_threads_in_native_to_block() {
412 // VM exits at safepoint. This function must be called at the final safepoint
413 // to wait for threads in _thread_in_native state to be quiescent.
414 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint already");
415
416 Thread * thr_cur = Thread::current();
417 Monitor timer(Mutex::leaf, "VM_Exit timer", true,
418 Monitor::_safepoint_check_never);
419
420 // Compiler threads need longer wait because they can access VM data directly
421 // while in native. If they are active and some structures being used are
422 // deleted by the shutdown sequence, they will crash. On the other hand, user
423 // threads must go through native=>Java/VM transitions first to access VM
424 // data, and they will be stopped during state transition. In theory, we
425 // don't have to wait for user threads to be quiescent, but it's always
426 // better to terminate VM when current thread is the only active thread, so
427 // wait for user threads too. Numbers are in 10 milliseconds.
428 int max_wait_user_thread = 30; // at least 300 milliseconds
429 int max_wait_compiler_thread = 1000; // at least 10 seconds
430
431 int max_wait = max_wait_compiler_thread;
432
433 int attempts = 0;
434 while (true) {
435 int num_active = 0;
436 int num_active_compiler_thread = 0;
437
438 for(JavaThread *thr = Threads::first(); thr != NULL; thr = thr->next()) {
439 if (thr!=thr_cur && thr->thread_state() == _thread_in_native) {
440 num_active++;
441 if (thr->is_Compiler_thread()) {
442 num_active_compiler_thread++;
443 }
444 }
445 }
446
447 if (num_active == 0) {
448 return 0;
449 } else if (attempts > max_wait) {
450 return num_active;
451 } else if (num_active_compiler_thread == 0 && attempts > max_wait_user_thread) {
452 return num_active;
453 }
454
455 attempts++;
456
457 MutexLockerEx ml(&timer, Mutex::_no_safepoint_check_flag);
458 timer.wait(Mutex::_no_safepoint_check_flag, 10);
|
1 /*
2 * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "classfile/symbolTable.hpp"
27 #include "classfile/vmSymbols.hpp"
28 #include "code/codeCache.hpp"
29 #include "compiler/compileBroker.hpp"
30 #include "gc/shared/isGCActiveMark.hpp"
31 #include "logging/log.hpp"
32 #include "logging/logStream.hpp"
33 #include "memory/heapInspection.hpp"
34 #include "memory/resourceArea.hpp"
35 #include "oops/symbol.hpp"
36 #include "runtime/arguments.hpp"
37 #include "runtime/deoptimization.hpp"
38 #include "runtime/interfaceSupport.hpp"
39 #include "runtime/sweeper.hpp"
40 #include "runtime/thread.inline.hpp"
41 #include "runtime/threadSMR.inline.hpp"
42 #include "runtime/vm_operations.hpp"
43 #include "services/threadService.hpp"
44 #include "trace/tracing.hpp"
45
46 #define VM_OP_NAME_INITIALIZE(name) #name,
47
48 const char* VM_Operation::_names[VM_Operation::VMOp_Terminating] = \
49 { VM_OPS_DO(VM_OP_NAME_INITIALIZE) };
50
51 void VM_Operation::set_calling_thread(Thread* thread, ThreadPriority priority) {
52 _calling_thread = thread;
53 assert(MinPriority <= priority && priority <= MaxPriority, "sanity check");
54 _priority = priority;
55 }
56
57
58 void VM_Operation::evaluate() {
59 ResourceMark rm;
60 LogTarget(Debug, vmoperation) lt;
61 if (lt.is_enabled()) {
80 case _concurrent : return "concurrent";
81 case _async_safepoint: return "async safepoint";
82 default : return "unknown";
83 }
84 }
85 // Called by fatal error handler.
86 void VM_Operation::print_on_error(outputStream* st) const {
87 st->print("VM_Operation (" PTR_FORMAT "): ", p2i(this));
88 st->print("%s", name());
89
90 const char* mode = mode_to_string(evaluation_mode());
91 st->print(", mode: %s", mode);
92
93 if (calling_thread()) {
94 st->print(", requested by thread " PTR_FORMAT, p2i(calling_thread()));
95 }
96 }
97
98 void VM_ThreadStop::doit() {
99 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
100 ThreadsListHandle tlh;
101 JavaThread* target = java_lang_Thread::thread(target_thread());
102 // Note that this now allows multiple ThreadDeath exceptions to be
103 // thrown at a thread.
104 if (target != NULL && (!EnableThreadSMRExtraValidityChecks || tlh.includes(target))) {
105 // The target thread has run and has not exited yet.
106 target->send_thread_stop(throwable());
107 }
108 }
109
110 void VM_ClearICs::doit() {
111 if (_preserve_static_stubs) {
112 CodeCache::cleanup_inline_caches();
113 } else {
114 CodeCache::clear_inline_caches();
115 }
116 }
117
118 void VM_Deoptimize::doit() {
119 // We do not want any GCs to happen while we are in the middle of this VM operation
120 ResourceMark rm;
121 DeoptimizationMarker dm;
122
123 // Deoptimize all activations depending on marked nmethods
124 Deoptimization::deoptimize_dependents();
125
131 NMethodSweeper::mark_active_nmethods();
132 }
133
134 VM_DeoptimizeFrame::VM_DeoptimizeFrame(JavaThread* thread, intptr_t* id, int reason) {
135 _thread = thread;
136 _id = id;
137 _reason = reason;
138 }
139
140
141 void VM_DeoptimizeFrame::doit() {
142 assert(_reason > Deoptimization::Reason_none && _reason < Deoptimization::Reason_LIMIT, "invalid deopt reason");
143 Deoptimization::deoptimize_frame_internal(_thread, _id, (Deoptimization::DeoptReason)_reason);
144 }
145
146
147 #ifndef PRODUCT
148
149 void VM_DeoptimizeAll::doit() {
150 DeoptimizationMarker dm;
151 JavaThreadIteratorWithHandle jtiwh;
152 // deoptimize all java threads in the system
153 if (DeoptimizeALot) {
154 for (; JavaThread *thread = jtiwh.next(); ) {
155 if (thread->has_last_Java_frame()) {
156 thread->deoptimize();
157 }
158 }
159 } else if (DeoptimizeRandom) {
160
161 // Deoptimize some selected threads and frames
162 int tnum = os::random() & 0x3;
163 int fnum = os::random() & 0x3;
164 int tcount = 0;
165 for (; JavaThread *thread = jtiwh.next(); ) {
166 if (thread->has_last_Java_frame()) {
167 if (tcount++ == tnum) {
168 tcount = 0;
169 int fcount = 0;
170 // Deoptimize some selected frames.
171 // Biased llocking wants a updated register map
172 for(StackFrameStream fst(thread, UseBiasedLocking); !fst.is_done(); fst.next()) {
173 if (fst.current()->can_be_deoptimized()) {
174 if (fcount++ == fnum) {
175 fcount = 0;
176 Deoptimization::deoptimize(thread, *fst.current(), fst.register_map());
177 }
178 }
179 }
180 }
181 }
182 }
183 }
184 }
185
241 cycle = cycle->next();
242 delete d;
243 }
244 }
245 }
246
247 bool VM_FindDeadlocks::doit_prologue() {
248 if (_concurrent_locks) {
249 // Make sure AbstractOwnableSynchronizer is loaded
250 JavaThread* jt = JavaThread::current();
251 java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(jt);
252 if (jt->has_pending_exception()) {
253 return false;
254 }
255 }
256
257 return true;
258 }
259
260 void VM_FindDeadlocks::doit() {
261 // Update the hazard ptr in the originating thread to the current
262 // list of threads. This VM operation needs the current list of
263 // threads for proper deadlock detection and those are the
264 // JavaThreads we need to be protected when we return info to the
265 // originating thread.
266 _setter.set();
267
268 _deadlocks = ThreadService::find_deadlocks_at_safepoint(_setter.list(), _concurrent_locks);
269 if (_out != NULL) {
270 int num_deadlocks = 0;
271 for (DeadlockCycle* cycle = _deadlocks; cycle != NULL; cycle = cycle->next()) {
272 num_deadlocks++;
273 cycle->print_on_with(_setter.list(), _out);
274 }
275
276 if (num_deadlocks == 1) {
277 _out->print_cr("\nFound 1 deadlock.\n");
278 _out->flush();
279 } else if (num_deadlocks > 1) {
280 _out->print_cr("\nFound %d deadlocks.\n", num_deadlocks);
281 _out->flush();
282 }
283 }
284 }
285
286 VM_ThreadDump::VM_ThreadDump(ThreadDumpResult* result,
287 int max_depth,
288 bool with_locked_monitors,
289 bool with_locked_synchronizers) {
290 _result = result;
291 _num_threads = 0; // 0 indicates all threads
292 _threads = NULL;
293 _result = result;
320 }
321
322 if (_with_locked_synchronizers) {
323 // Acquire Heap_lock to dump concurrent locks
324 Heap_lock->lock();
325 }
326
327 return true;
328 }
329
330 void VM_ThreadDump::doit_epilogue() {
331 if (_with_locked_synchronizers) {
332 // Release Heap_lock
333 Heap_lock->unlock();
334 }
335 }
336
337 void VM_ThreadDump::doit() {
338 ResourceMark rm;
339
340 // Set the hazard ptr in the originating thread to protect the
341 // current list of threads. This VM operation needs the current list
342 // of threads for a proper dump and those are the JavaThreads we need
343 // to be protected when we return info to the originating thread.
344 _result->set_t_list();
345
346 ConcurrentLocksDump concurrent_locks(true);
347 if (_with_locked_synchronizers) {
348 concurrent_locks.dump_at_safepoint();
349 }
350
351 if (_num_threads == 0) {
352 // Snapshot all live threads
353
354 for (uint i = 0; i < _result->t_list()->length(); i++) {
355 JavaThread* jt = _result->t_list()->thread_at(i);
356 if (jt->is_exiting() ||
357 jt->is_hidden_from_external_view()) {
358 // skip terminating threads and hidden threads
359 continue;
360 }
361 ThreadConcurrentLocks* tcl = NULL;
362 if (_with_locked_synchronizers) {
363 tcl = concurrent_locks.thread_concurrent_locks(jt);
364 }
365 ThreadSnapshot* ts = snapshot_thread(jt, tcl);
366 _result->add_thread_snapshot(ts);
367 }
368 } else {
369 // Snapshot threads in the given _threads array
370 // A dummy snapshot is created if a thread doesn't exist
371
372 for (int i = 0; i < _num_threads; i++) {
373 instanceHandle th = _threads->at(i);
374 if (th() == NULL) {
375 // skip if the thread doesn't exist
376 // Add a dummy snapshot
377 _result->add_thread_snapshot(new ThreadSnapshot());
378 continue;
379 }
380
381 // Dump thread stack only if the thread is alive and not exiting
382 // and not VM internal thread.
383 JavaThread* jt = java_lang_Thread::thread(th());
384 if (jt != NULL && !_result->t_list()->includes(jt)) {
385 // _threads[i] doesn't refer to a valid JavaThread; this check
386 // is primarily for JVM_DumpThreads() which doesn't have a good
387 // way to validate the _threads array.
388 jt = NULL;
389 }
390 if (jt == NULL || /* thread not alive */
391 jt->is_exiting() ||
392 jt->is_hidden_from_external_view()) {
393 // add a NULL snapshot if skipped
394 _result->add_thread_snapshot(new ThreadSnapshot());
395 continue;
396 }
397 ThreadConcurrentLocks* tcl = NULL;
398 if (_with_locked_synchronizers) {
399 tcl = concurrent_locks.thread_concurrent_locks(jt);
400 }
401 ThreadSnapshot* ts = snapshot_thread(jt, tcl);
402 _result->add_thread_snapshot(ts);
403 }
404 }
405 }
406
407 ThreadSnapshot* VM_ThreadDump::snapshot_thread(JavaThread* java_thread, ThreadConcurrentLocks* tcl) {
408 ThreadSnapshot* snapshot = new ThreadSnapshot(_result->t_list(), java_thread);
409 snapshot->dump_stack_at_safepoint(_max_depth, _with_locked_monitors);
410 snapshot->set_concurrent_locks(tcl);
411 return snapshot;
412 }
413
414 volatile bool VM_Exit::_vm_exited = false;
415 Thread * VM_Exit::_shutdown_thread = NULL;
416
417 int VM_Exit::set_vm_exited() {
418
419 Thread * thr_cur = Thread::current();
420
421 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint already");
422
423 int num_active = 0;
424
425 _shutdown_thread = thr_cur;
426 _vm_exited = true; // global flag
427 for (JavaThreadIteratorWithHandle jtiwh; JavaThread *thr = jtiwh.next(); ) {
428 if (thr!=thr_cur && thr->thread_state() == _thread_in_native) {
429 ++num_active;
430 thr->set_terminated(JavaThread::_vm_exited); // per-thread flag
431 }
432 }
433
434 return num_active;
435 }
436
437 int VM_Exit::wait_for_threads_in_native_to_block() {
438 // VM exits at safepoint. This function must be called at the final safepoint
439 // to wait for threads in _thread_in_native state to be quiescent.
440 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint already");
441
442 Thread * thr_cur = Thread::current();
443 Monitor timer(Mutex::leaf, "VM_Exit timer", true,
444 Monitor::_safepoint_check_never);
445
446 // Compiler threads need longer wait because they can access VM data directly
447 // while in native. If they are active and some structures being used are
448 // deleted by the shutdown sequence, they will crash. On the other hand, user
449 // threads must go through native=>Java/VM transitions first to access VM
450 // data, and they will be stopped during state transition. In theory, we
451 // don't have to wait for user threads to be quiescent, but it's always
452 // better to terminate VM when current thread is the only active thread, so
453 // wait for user threads too. Numbers are in 10 milliseconds.
454 int max_wait_user_thread = 30; // at least 300 milliseconds
455 int max_wait_compiler_thread = 1000; // at least 10 seconds
456
457 int max_wait = max_wait_compiler_thread;
458
459 int attempts = 0;
460 JavaThreadIteratorWithHandle jtiwh;
461 while (true) {
462 int num_active = 0;
463 int num_active_compiler_thread = 0;
464
465 jtiwh.rewind();
466 for (; JavaThread *thr = jtiwh.next(); ) {
467 if (thr!=thr_cur && thr->thread_state() == _thread_in_native) {
468 num_active++;
469 if (thr->is_Compiler_thread()) {
470 num_active_compiler_thread++;
471 }
472 }
473 }
474
475 if (num_active == 0) {
476 return 0;
477 } else if (attempts > max_wait) {
478 return num_active;
479 } else if (num_active_compiler_thread == 0 && attempts > max_wait_user_thread) {
480 return num_active;
481 }
482
483 attempts++;
484
485 MutexLockerEx ml(&timer, Mutex::_no_safepoint_check_flag);
486 timer.wait(Mutex::_no_safepoint_check_flag, 10);
|