OSDN Git Service

Narrow the scope of a lock on dex to avoid deadlock.
authorIan Rogers <irogers@google.com>
Tue, 24 Sep 2013 01:07:59 +0000 (18:07 -0700)
committerIan Rogers <irogers@google.com>
Tue, 24 Sep 2013 01:13:12 +0000 (18:13 -0700)
Bug: 10899202.
Change-Id: I6247f895a11b41a70d7f43562d868dd91e8b1a91

vm/native/java_lang_Class.cpp

index e68be7b..c307353 100644 (file)
@@ -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;
 }