< prev index next >
src/hotspot/share/runtime/handshake.cpp
Print this page
rev 51997 : [mq]: 8210303
*** 345,354 ****
--- 345,368 ----
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,374 ****
if (!has_operation()) {
// JT has already cleared its handshake
return;
}
! if (!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.
--- 378,388 ----
if (!has_operation()) {
// JT has already cleared its handshake
return;
}
! 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 >