fix race in jni initialization

This commit is contained in:
localvar 2019-09-21 15:35:54 +08:00
parent a890b21ffc
commit 83eea5b4ec
1 changed files with 10 additions and 2 deletions

12
src/client/src/TSDBJNIConnector.c Normal file → Executable file
View File

@ -62,8 +62,15 @@ jmethodID g_rowdataSetByteArrayFp;
void jniGetGlobalMethod(JNIEnv *env) {
// make sure init function executed once
if (__sync_val_compare_and_swap_32(&__init, 0, 1) == 1) {
return;
switch (__sync_val_compare_and_swap_32(&__init, 0, 1)) {
case 0:
break;
case 1:
do {
taosMsleep(0);
} while (__atomic_load_n(&__init, __ATOMIC_ACQUIRE) == 1);
case 2:
return;
}
if (g_vm == NULL) {
@ -101,6 +108,7 @@ void jniGetGlobalMethod(JNIEnv *env) {
g_rowdataSetByteArrayFp = (*env)->GetMethodID(env, g_rowdataClass, "setByteArray", "(I[B)V");
(*env)->DeleteLocalRef(env, rowdataClass);
__atomic_store_n(&__init, 2, __ATOMIC_RELEASE);
jniTrace("native method register finished");
}