# HG changeset patch # User dcubed # Date 1403902850 25200 # Node ID da34f1690fecf172cc1b34d8d8b9d073efb14f11 # Parent d5d76787fbb3efafb7bf1589e936494bf1397663 8047720: Xprof hangs on Solaris Summary: Update use of PeriodicTask_lock in WatcherThread::stop() to avoid safepoint deadlock. Reviewed-by: mgronlun, coleenp diff -r d5d76787fbb3 -r da34f1690fec hotspot/src/share/vm/runtime/thread.cpp --- a/hotspot/src/share/vm/runtime/thread.cpp Fri Jun 27 08:11:49 2014 -0700 +++ b/hotspot/src/share/vm/runtime/thread.cpp Fri Jun 27 14:00:50 2014 -0700 @@ -1358,14 +1358,24 @@ } void WatcherThread::stop() { - { - MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag); - _should_terminate = true; - OrderAccess::fence(); // ensure WatcherThread sees update in main loop - + // Get the PeriodicTask_lock if we can. If we cannot, then the + // WatcherThread is using it and we don't want to block on that lock + // here because that might cause a safepoint deadlock depending on + // what the current WatcherThread tasks are doing. + bool have_lock = PeriodicTask_lock->try_lock(); + + _should_terminate = true; + OrderAccess::fence(); // ensure WatcherThread sees update in main loop + + if (have_lock) { WatcherThread* watcher = watcher_thread(); - if (watcher != NULL) + if (watcher != NULL) { + // If we managed to get the lock, then we should unpark the + // WatcherThread so that it can see we want it to stop. watcher->unpark(); + } + + PeriodicTask_lock->unlock(); } // it is ok to take late safepoints here, if needed