src/hotspot/share/runtime/handshake.cpp
changeset 51432 90024ea291b4
parent 51334 cc2c79d22508
child 52013 92383597fa21
--- a/src/hotspot/share/runtime/handshake.cpp	Fri Aug 17 03:59:20 2018 -0700
+++ b/src/hotspot/share/runtime/handshake.cpp	Fri Aug 17 13:38:19 2018 +0200
@@ -338,7 +338,13 @@
 }
 
 bool HandshakeState::vmthread_can_process_handshake(JavaThread* target) {
-  return SafepointSynchronize::safepoint_safe(target, target->thread_state());
+  // SafepointSynchronize::safepoint_safe() does not consider an externally
+  // suspended thread to be safe. However, this function must be called with
+  // the Threads_lock held so an externally suspended thread cannot be
+  // resumed thus it is safe.
+  assert(Threads_lock->owned_by_self(), "Not holding Threads_lock.");
+  return SafepointSynchronize::safepoint_safe(target, target->thread_state()) ||
+         target->is_ext_suspended();
 }
 
 bool HandshakeState::claim_handshake_for_vmthread() {