< prev index next >
src/hotspot/share/runtime/thread.cpp
Print this page
*** 2342,2359 ****
(!check_unsafe_error && condition == _async_unsafe_access_error),
"must have handled the async condition, if no exception");
}
void JavaThread::handle_special_runtime_exit_condition(bool check_asyncs) {
! //
// Check for pending external suspend.
! // If JNIEnv proxies are allowed, don't self-suspend if the target
! // thread is not the current thread. In older versions of jdbx, jdbx
! // threads could call into the VM with another thread's JNIEnv so we
! // can be here operating on behalf of a suspended thread (4432884).
! bool do_self_suspend = is_external_suspend_with_lock();
! if (do_self_suspend && (!AllowJNIEnvProxy || this == JavaThread::current())) {
frame_anchor()->make_walkable(this);
java_suspend_self_with_safepoint_check();
}
// We might be here for reasons in addition to the self-suspend request
--- 2342,2354 ----
(!check_unsafe_error && condition == _async_unsafe_access_error),
"must have handled the async condition, if no exception");
}
void JavaThread::handle_special_runtime_exit_condition(bool check_asyncs) {
!
// Check for pending external suspend.
! if (is_external_suspend_with_lock()) {
frame_anchor()->make_walkable(this);
java_suspend_self_with_safepoint_check();
}
// We might be here for reasons in addition to the self-suspend request
*** 2574,2596 ****
// Note only the ThreadInVMfromNative transition can call this function
// directly and when thread state is _thread_in_native_trans
void JavaThread::check_safepoint_and_suspend_for_native_trans(JavaThread *thread) {
assert(thread->thread_state() == _thread_in_native_trans, "wrong state");
! JavaThread *curJT = JavaThread::current();
! bool do_self_suspend = thread->is_external_suspend();
!
! assert(!curJT->has_last_Java_frame() || curJT->frame_anchor()->walkable(), "Unwalkable stack in native->vm transition");
! // If JNIEnv proxies are allowed, don't self-suspend if the target
! // thread is not the current thread. In older versions of jdbx, jdbx
! // threads could call into the VM with another thread's JNIEnv so we
! // can be here operating on behalf of a suspended thread (4432884).
! if (do_self_suspend && (!AllowJNIEnvProxy || curJT == thread)) {
thread->java_suspend_self_with_safepoint_check();
} else {
! SafepointMechanism::block_if_requested(curJT);
}
JFR_ONLY(SUSPEND_THREAD_CONDITIONAL(thread);)
}
--- 2569,2584 ----
// Note only the ThreadInVMfromNative transition can call this function
// directly and when thread state is _thread_in_native_trans
void JavaThread::check_safepoint_and_suspend_for_native_trans(JavaThread *thread) {
assert(thread->thread_state() == _thread_in_native_trans, "wrong state");
! assert(!thread->has_last_Java_frame() || thread->frame_anchor()->walkable(), "Unwalkable stack in native->vm transition");
! if (thread->is_external_suspend()) {
thread->java_suspend_self_with_safepoint_check();
} else {
! SafepointMechanism::block_if_requested(thread);
}
JFR_ONLY(SUSPEND_THREAD_CONDITIONAL(thread);)
}
< prev index next >