@@ -53,18 +53,6 @@ SWIGINTERN int Swig::GetThreadName(char *name, size_t len) {
53
53
54
54
#if defined(SWIG_JAVA_DETACH_ON_THREAD_END)
55
55
#include <pthread.h>
56
- namespace {
57
-
58
- void detach(void* jvm) {
59
- static_cast<JavaVM*>(jvm)->DetachCurrentThread();
60
- }
61
-
62
- pthread_key_t detachKey;
63
- void makeDetachKey() {
64
- pthread_key_create(&detachKey, detach);
65
- }
66
-
67
- }
68
56
#endif
69
57
70
58
namespace Swig {
@@ -149,13 +137,30 @@ namespace Swig {
149
137
}
150
138
}
151
139
140
+ #if defined(SWIG_JAVA_DETACH_ON_THREAD_END)
141
+ static void detach(void* jvm) {
142
+ static_cast<JavaVM*>(jvm)->DetachCurrentThread();
143
+ }
144
+
145
+ static void makeDetachKey() {
146
+ pthread_key_create(&detach_key_, detach);
147
+ }
148
+
149
+ /* thread-local key to register a destructor */
150
+ static pthread_key_t detach_key_;
151
+ #endif
152
+
152
153
private:
153
154
/* pointer to Java object */
154
155
jobject jthis_;
155
156
/* Local or global reference flag */
156
157
bool weak_global_;
157
158
};
158
159
160
+ #if defined(SWIG_JAVA_DETACH_ON_THREAD_END)
161
+ pthread_key_t JObjectWrapper::detach_key_;
162
+ #endif
163
+
159
164
/* Local JNI reference deleter */
160
165
class LocalRefGuard {
161
166
JNIEnv *jenv_;
@@ -224,8 +229,8 @@ namespace Swig {
224
229
// See https://developer.android.com/training/articles/perf-jni#threads
225
230
static pthread_once_t once = PTHREAD_ONCE_INIT;
226
231
227
- pthread_once(&once, makeDetachKey);
228
- pthread_setspecific(detachKey , director->swig_jvm_);
232
+ pthread_once(&once, JObjectWrapper:: makeDetachKey);
233
+ pthread_setspecific(JObjectWrapper::detach_key_ , director->swig_jvm_);
229
234
#endif
230
235
}
231
236
~JNIEnvWrapper() {
0 commit comments