8282200: ShouldNotReachHere() reached by AsyncGetCallTrace after JDK-8280422

Reviewed-by: dholmes, mdoerr, kevinw
This commit is contained in:
Johannes Bechberger 2022-02-24 14:32:22 +00:00 committed by Martin Doerr
parent f4486a190e
commit 231e48fa63
2 changed files with 6 additions and 6 deletions

View File

@ -562,12 +562,11 @@ static void forte_fill_call_trace_given_top(JavaThread* thd,
extern "C" {
JNIEXPORT
void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext) {
JavaThread* thread;
if (trace->env_id == NULL ||
(thread = JavaThread::thread_from_jni_environment(trace->env_id)) == NULL ||
thread->is_exiting()) {
(thread = JavaThread::thread_from_jni_environment(trace->env_id))->is_exiting()) {
// bad env_id, thread has exited or thread is exiting
trace->num_frames = ticks_thread_exit; // -8
return;

View File

@ -1323,14 +1323,15 @@ class JavaThread: public Thread {
// external JNI entry points where the JNIEnv is passed into the VM.
static JavaThread* thread_from_jni_environment(JNIEnv* env) {
JavaThread* current = (JavaThread*)((intptr_t)env - in_bytes(jni_environment_offset()));
// We can't get here in a thread that has completed its execution and so
// "is_terminated", but a thread is also considered terminated if the VM
// We can't normally get here in a thread that has completed its
// execution and so "is_terminated", except when the call is from
// AsyncGetCallTrace, which can be triggered by a signal at any point in
// a thread's lifecycle. A thread is also considered terminated if the VM
// has exited, so we have to check this and block in case this is a daemon
// thread returning to the VM (the JNI DirectBuffer entry points rely on
// this).
if (current->is_terminated()) {
current->block_if_vm_exited();
ShouldNotReachHere();
}
return current;
}