RFR (XS) 8189766: whitebox failure with -Xcheck:jni
David Holmes
david.holmes at oracle.com
Tue May 29 21:17:30 UTC 2018
Thanks Lois!
David
On 30/05/2018 12:57 AM, Lois Foltan wrote:
> Looks good.
> Lois
>
> On 5/29/2018 3:06 AM, David Holmes wrote:
>> bug: https://bugs.openjdk.java.net/browse/JDK-8189766
>> webrev: http://cr.openjdk.java.net/~dholmes/8189766/webrev/
>>
>> A WB_ENTRY already handles the pending JNI exception check by
>> explicitly clearing it via a helper:
>>
>> #define WB_ENTRY(result_type, header) JNI_ENTRY(result_type, header) \
>> ClearPendingJniExcCheck _clearCheck(env);
>>
>> #define WB_END JNI_END
>>
>> But the whitebox function then does e.g:
>>
>> WB_ENTRY(jobject, WB_GetBooleanVMFlag(JNIEnv* env, jobject o, jstring
>> name))
>> bool result;
>> if (GetVMFlag <bool> (thread, env, name, &result, &JVMFlag::boolAt)) {
>> ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call
>> JNI
>> return booleanBox(thread, env, result);
>> }
>> return NULL;
>> WB_END
>>
>> where booleanBox is defined eventually as:
>>
>> template <typename T>
>> static jobject box(JavaThread* thread, JNIEnv* env, Symbol* name,
>> Symbol* sig, T value) {
>> ResourceMark rm(thread);
>> jclass clazz = env->FindClass(name->as_C_string());
>> CHECK_JNI_EXCEPTION_(env, NULL);
>> jmethodID methodID = env->GetStaticMethodID(clazz,
>> vmSymbols::valueOf_name()->as_C_string(),
>> sig->as_C_string());
>> CHECK_JNI_EXCEPTION_(env, NULL);
>> jobject result = env->CallStaticObjectMethod(clazz, methodID, value);
>> CHECK_JNI_EXCEPTION_(env, NULL);
>> return result;
>> }
>>
>> so we call JNI methods that will set the pending_jni_exception_check
>> flag, but CHECK_JNI_EXCEPTION is defined as:
>>
>> #define CHECK_JNI_EXCEPTION_(env, value) \
>> do { \
>> JavaThread* THREAD = JavaThread::thread_from_jni_environment(env); \
>> if (HAS_PENDING_EXCEPTION) { \
>> return(value); \
>> } \
>> } while (0)
>>
>> which means it is not clearing the pending_jni_exception_check flag
>> even though it is checking for exceptions!
>>
>> So we explicitly clear the flag. Trying to use the JNI
>> ExceptionOccurred function fails as not all the methods that call
>> CHECK_JNI_EXCEPTION are _thread_in_native.
>>
>> Testing (in progress):
>> hotspot tier1 and tier2 with -Xcheck:jni
>> regular CI testing
>>
>> Thanks,
>> David
>
More information about the hotspot-dev
mailing list