< 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 >