Skip to content

Commit 3add529

Browse files
committed
- don't repeatedly attach / detach worker pool threads
1 parent 1bf8b1a commit 3add529

3 files changed

Lines changed: 25 additions & 27 deletions

File tree

src/methodCallBaton.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,9 @@ v8::Handle<v8::Value> MethodCallBaton::runSync() {
4343

4444
/*static*/ void MethodCallBaton::EIO_MethodCall(uv_work_t* req) {
4545
MethodCallBaton* self = static_cast<MethodCallBaton*>(req->data);
46-
JNIEnv *env = javaAttachCurrentThread(self->m_java->getJvm(), self->m_java->getClassLoader());
47-
// scope the java scope to after/before attaching to thread.
48-
{
49-
JavaScope javaScope(env);
50-
self->execute(env);
51-
}
52-
javaDetachCurrentThread(self->m_java->getJvm());
46+
JNIEnv *env = javaGetEnv(self->m_java->getJvm(), self->m_java->getClassLoader());
47+
JavaScope javaScope(env);
48+
self->execute(env);
5349
}
5450

5551
#if NODE_MINOR_VERSION >= 10

src/utils.cpp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -120,19 +120,26 @@ std::string javaMethodCallToString(JNIEnv *env, jobject obj, jmethodID methodId,
120120
return result.str();
121121
}
122122

123-
JNIEnv* javaAttachCurrentThread(JavaVM* jvm, jobject classLoader) {
124-
JNIEnv* env;
125-
JavaVMAttachArgs attachArgs;
126-
attachArgs.version = JNI_VERSION_1_4;
127-
attachArgs.name = NULL;
128-
attachArgs.group = NULL;
129-
jvm->AttachCurrentThread((void**)&env, &attachArgs);
130-
131-
jclass threadClazz = env->FindClass("java/lang/Thread");
132-
jmethodID thread_currentThread = env->GetStaticMethodID(threadClazz, "currentThread", "()Ljava/lang/Thread;");
133-
jmethodID thread_setContextClassLoader = env->GetMethodID(threadClazz, "setContextClassLoader", "(Ljava/lang/ClassLoader;)V");
134-
jobject currentThread = env->CallStaticObjectMethod(threadClazz, thread_currentThread);
135-
env->CallObjectMethod(currentThread, thread_setContextClassLoader, classLoader);
123+
JNIEnv* javaGetEnv(JavaVM* jvm, jobject classLoader) {
124+
JNIEnv *env = NULL;
125+
int ret = jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
126+
127+
if (ret == JNI_EDETACHED) {
128+
JavaVMAttachArgs attachArgs;
129+
attachArgs.version = JNI_VERSION_1_6;
130+
attachArgs.name = NULL;
131+
attachArgs.group = NULL;
132+
jvm->AttachCurrentThread((void**)&env, &attachArgs);
133+
134+
jclass threadClazz = env->FindClass("java/lang/Thread");
135+
jmethodID thread_currentThread = env->GetStaticMethodID(threadClazz, "currentThread", "()Ljava/lang/Thread;");
136+
jmethodID thread_setContextClassLoader = env->GetMethodID(threadClazz, "setContextClassLoader", "(Ljava/lang/ClassLoader;)V");
137+
jobject currentThread = env->CallStaticObjectMethod(threadClazz, thread_currentThread);
138+
env->CallObjectMethod(currentThread, thread_setContextClassLoader, classLoader);
139+
140+
env->DeleteLocalRef(threadClazz);
141+
env->DeleteLocalRef(currentThread);
142+
}
136143

137144
return env;
138145
}
@@ -145,10 +152,6 @@ jobject getSystemClassLoader(JNIEnv *env) {
145152
return env->CallObjectMethod(currentThread, thread_getContextClassLoader);
146153
}
147154

148-
void javaDetachCurrentThread(JavaVM* jvm) {
149-
jvm->DetachCurrentThread();
150-
}
151-
152155
jvalueType javaGetType(JNIEnv *env, jclass type) {
153156
jclass clazzClazz = env->FindClass("java/lang/Class");
154157
jmethodID class_isArray = env->GetMethodID(clazzClazz, "isArray", "()Z");
@@ -704,4 +707,4 @@ std::string methodNotFoundToString(JNIEnv *env, jclass clazz, std::string method
704707
}
705708

706709
return msg.str();
707-
}
710+
}

src/utils.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ std::string javaToString(JNIEnv *env, jstring str);
5555
std::string javaObjectToString(JNIEnv *env, jobject obj);
5656
std::string javaArrayToString(JNIEnv *env, jobjectArray arr);
5757
std::string javaMethodCallToString(JNIEnv *env, jobject obj, jmethodID methodId, jarray args);
58-
JNIEnv* javaAttachCurrentThread(JavaVM* jvm, jobject classLoader);
59-
void javaDetachCurrentThread(JavaVM* jvm);
58+
JNIEnv* javaGetEnv(JavaVM* jvm, jobject classLoader);
6059
jobject getSystemClassLoader(JNIEnv *env);
6160
jvalueType javaGetArrayComponentType(JNIEnv *env, jobjectArray array);
6261
jvalueType javaGetType(JNIEnv *env, jclass type);

0 commit comments

Comments
 (0)