aboutsummaryrefslogtreecommitdiff
path: root/vm/native/java_lang_Class.cpp
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2013-09-23 18:07:59 -0700
committerIan Rogers <irogers@google.com>2013-09-23 18:13:12 -0700
commit66ca8e7c59e0b366a24603aa06ae36be57db36ec (patch)
treea615356694758c5a1c8ca7f5639e22a9b1f5691d /vm/native/java_lang_Class.cpp
parent0e216ea3225b896bc6b6bf02a2f80d2c89c6216e (diff)
Narrow the scope of a lock on dex to avoid deadlock.
Bug: 10899202. Change-Id: I6247f895a11b41a70d7f43562d868dd91e8b1a91
Diffstat (limited to 'vm/native/java_lang_Class.cpp')
-rw-r--r--vm/native/java_lang_Class.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/vm/native/java_lang_Class.cpp b/vm/native/java_lang_Class.cpp
index e68be7bf0..c3073537f 100644
--- a/vm/native/java_lang_Class.cpp
+++ b/vm/native/java_lang_Class.cpp
@@ -765,14 +765,10 @@ JNIEXPORT jobject JNICALL Java_java_lang_Class_getDex(JNIEnv* env, jclass javaCl
if (dvm_dex == NULL) {
return NULL;
}
-
- ScopedPthreadMutexLock lock(&dvm_dex->modLock);
-
// Already cached?
if (dvm_dex->dex_object != NULL) {
return dvm_dex->dex_object;
}
-
jobject byte_buffer = env->NewDirectByteBuffer(dvm_dex->memMap.addr, dvm_dex->memMap.length);
if (byte_buffer == NULL) {
return NULL;
@@ -799,7 +795,12 @@ JNIEXPORT jobject JNICALL Java_java_lang_Class_getDex(JNIEnv* env, jclass javaCl
return NULL;
}
- dvm_dex->dex_object = env->NewGlobalRef(local_ref);
+ // Check another thread didn't cache an object, if we've won install the object.
+ ScopedPthreadMutexLock lock(&dvm_dex->modLock);
+
+ if (dvm_dex->dex_object != NULL) {
+ dvm_dex->dex_object = env->NewGlobalRef(local_ref);
+ }
return dvm_dex->dex_object;
}