HDFS-15270. Account for *env == NULL in hdfsThreadDestructor (#1951)
OpenJ9 JVM properly terminates the thread before hdfsThreadDestructor is invoked. JNIEnv is a mirror of J9VMThread in OpenJ9. After proper thread termination, accessing JNIEnv in hdfsThreadDestructor (*env)->GetJavaVM, yields a SIGSEGV since *env is NULL after thread cleanup is performed. The main purpose of hdfsThreadDestructor is to invoke DetachCurrentThread, which performs thread cleanup in OpenJ9. Since OpenJ9 performs thread cleanup before hdfsThreadDestructor is invoked, hdfsThreadDestructor should account for *env == NULL and skip DetachCurrentThread. Signed-off-by: Babneet Singh <sbabneet@ca.ibm.com> (cherry picked from commit 1996351b0b7be6866eda73223ab6ef1ec78d30cd) (cherry picked from commit d1e5e393c30ef25212be365651404c1034532338)
This commit is contained in:
parent
06f43fc628
commit
44fdee351d
@ -43,7 +43,7 @@ void hdfsThreadDestructor(void *v)
|
||||
jint ret;
|
||||
|
||||
/* Detach the current thread from the JVM */
|
||||
if (env) {
|
||||
if ((env != NULL) && (*env != NULL)) {
|
||||
ret = (*env)->GetJavaVM(env, &vm);
|
||||
if (ret) {
|
||||
fprintf(stderr, "hdfsThreadDestructor: GetJavaVM failed with error %d\n",
|
||||
|
@ -39,10 +39,10 @@ static void detachCurrentThreadFromJvm()
|
||||
if (threadLocalStorageGet(&state) || !state) {
|
||||
return;
|
||||
}
|
||||
if (!state->env) {
|
||||
env = state->env;
|
||||
if ((env == NULL) || (*env == NULL)) {
|
||||
return;
|
||||
}
|
||||
env = state->env;
|
||||
ret = (*env)->GetJavaVM(env, &vm);
|
||||
if (ret) {
|
||||
fprintf(stderr,
|
||||
|
Loading…
x
Reference in New Issue
Block a user