diff options
| author | Ian Rogers <irogers@google.com> | 2013-09-23 18:07:59 -0700 |
|---|---|---|
| committer | Ian Rogers <irogers@google.com> | 2013-09-23 18:13:12 -0700 |
| commit | 66ca8e7c59e0b366a24603aa06ae36be57db36ec (patch) | |
| tree | a615356694758c5a1c8ca7f5639e22a9b1f5691d /vm/native/java_lang_Class.cpp | |
| parent | 0e216ea3225b896bc6b6bf02a2f80d2c89c6216e (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.cpp | 11 |
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; } |
