< prev index next >
src/hotspot/share/runtime/handshake.cpp
Print this page
rev 51997 : [mq]: 8210303
@@ -345,10 +345,24 @@
assert(Threads_lock->owned_by_self(), "Not holding Threads_lock.");
return SafepointSynchronize::safepoint_safe(target, target->thread_state()) ||
target->is_ext_suspended();
}
+static bool possibly_vmthread_can_process_handshake(JavaThread* target) {
+ switch(target->thread_state()) {
+ case _thread_in_native:
+ // native threads are safe if they have no java stack or have walkable stack
+ return !target->has_last_Java_frame() || target->frame_anchor()->walkable();
+
+ case _thread_blocked:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
bool HandshakeState::claim_handshake_for_vmthread() {
if (!_semaphore.trywait()) {
return false;
}
if (has_operation()) {
@@ -364,11 +378,11 @@
if (!has_operation()) {
// JT has already cleared its handshake
return;
}
- if (!vmthread_can_process_handshake(target)) {
+ if (!possibly_vmthread_can_process_handshake(target)) {
// JT is observed in an unsafe state, it must notice the handshake itself
return;
}
// Claim the semaphore if there still an operation to be executed.
< prev index next >