summaryrefslogtreecommitdiffstats
path: root/dx
diff options
context:
space:
mode:
authorYohann Roussel <yroussel@google.com>2013-11-18 17:38:03 +0100
committerSteve Kondik <shade@chemlab.org>2013-12-20 15:32:48 -0800
commitddfbe106bb9c2b6c51ec1d9bc4070710cba65582 (patch)
tree55dfad60a9facc0aa3abd1442330cc4d798ef5fc /dx
parent5d5dba430192d3e56077eb3788deaf7e2e420998 (diff)
downloadandroid_dalvik-ddfbe106bb9c2b6c51ec1d9bc4070710cba65582.tar.gz
android_dalvik-ddfbe106bb9c2b6c51ec1d9bc4070710cba65582.tar.bz2
android_dalvik-ddfbe106bb9c2b6c51ec1d9bc4070710cba65582.zip
Fix synchronization when preparing ids.
Synchronized blocks were using different locks. Replaced by a safer version: marking intern method synchronized. This means synchronizing more than necessary but it had no mesurable perfomance impact. Bug 11744785 Change-Id: I35e691232cd6971d13735be9b72969739ef71e09
Diffstat (limited to 'dx')
-rw-r--r--dx/src/com/android/dx/dex/cf/CfTranslator.java34
-rw-r--r--dx/src/com/android/dx/dex/file/FieldIdsSection.java3
-rw-r--r--dx/src/com/android/dx/dex/file/MethodIdsSection.java3
-rw-r--r--dx/src/com/android/dx/dex/file/TypeIdsSection.java2
4 files changed, 19 insertions, 23 deletions
diff --git a/dx/src/com/android/dx/dex/cf/CfTranslator.java b/dx/src/com/android/dx/dex/cf/CfTranslator.java
index 8ab1c8426..92ea0f7a0 100644
--- a/dx/src/com/android/dx/dex/cf/CfTranslator.java
+++ b/dx/src/com/android/dx/dex/cf/CfTranslator.java
@@ -142,20 +142,18 @@ public class CfTranslator {
ConstantPool constantPool = cf.getConstantPool();
int constantPoolSize = constantPool.size();
- synchronized (dexFile) {
- for (int i = 0; i < constantPoolSize; i++) {
- Constant constant = constantPool.getOrNull(i);
- if (constant instanceof CstMethodRef) {
- methodIdsSection.intern((CstBaseMethodRef) constant);
- } else if (constant instanceof CstInterfaceMethodRef) {
- methodIdsSection.intern(((CstInterfaceMethodRef) constant).toMethodRef());
- } else if (constant instanceof CstFieldRef) {
- fieldIdsSection.intern((CstFieldRef) constant);
- } else if (constant instanceof CstEnumRef) {
- fieldIdsSection.intern(((CstEnumRef) constant).getFieldRef());
- } else if (constant instanceof CstType) {
- typeIdsSection.intern((CstType) constant);
- }
+ for (int i = 0; i < constantPoolSize; i++) {
+ Constant constant = constantPool.getOrNull(i);
+ if (constant instanceof CstMethodRef) {
+ methodIdsSection.intern((CstBaseMethodRef) constant);
+ } else if (constant instanceof CstInterfaceMethodRef) {
+ methodIdsSection.intern(((CstInterfaceMethodRef) constant).toMethodRef());
+ } else if (constant instanceof CstFieldRef) {
+ fieldIdsSection.intern((CstFieldRef) constant);
+ } else if (constant instanceof CstEnumRef) {
+ fieldIdsSection.intern(((CstEnumRef) constant).getFieldRef());
+ } else if (constant instanceof CstType) {
+ typeIdsSection.intern((CstType) constant);
}
}
@@ -197,9 +195,7 @@ public class CfTranslator {
if (annotations.size() != 0) {
out.addFieldAnnotations(field, annotations);
}
- synchronized (fieldIdsSection) {
- fieldIdsSection.intern(field);
- }
+ fieldIdsSection.intern(field);
} catch (RuntimeException ex) {
String msg = "...while processing " + one.getName().toHuman() +
" " + one.getDescriptor().toHuman();
@@ -368,9 +364,7 @@ public class CfTranslator {
if (list.size() != 0) {
out.addParameterAnnotations(meth, list);
}
- synchronized (methodIds) {
- methodIds.intern(meth);
- }
+ methodIds.intern(meth);
} catch (RuntimeException ex) {
String msg = "...while processing " + one.getName().toHuman() +
" " + one.getDescriptor().toHuman();
diff --git a/dx/src/com/android/dx/dex/file/FieldIdsSection.java b/dx/src/com/android/dx/dex/file/FieldIdsSection.java
index 27d946d64..f422bab04 100644
--- a/dx/src/com/android/dx/dex/file/FieldIdsSection.java
+++ b/dx/src/com/android/dx/dex/file/FieldIdsSection.java
@@ -20,6 +20,7 @@ import com.android.dx.rop.cst.Constant;
import com.android.dx.rop.cst.CstFieldRef;
import com.android.dx.util.AnnotatedOutput;
import com.android.dx.util.Hex;
+
import java.util.Collection;
import java.util.TreeMap;
@@ -94,7 +95,7 @@ public final class FieldIdsSection extends MemberIdsSection {
* @param field {@code non-null;} the reference to intern
* @return {@code non-null;} the interned reference
*/
- public FieldIdItem intern(CstFieldRef field) {
+ public synchronized FieldIdItem intern(CstFieldRef field) {
if (field == null) {
throw new NullPointerException("field == null");
}
diff --git a/dx/src/com/android/dx/dex/file/MethodIdsSection.java b/dx/src/com/android/dx/dex/file/MethodIdsSection.java
index d99198b24..254d7fe43 100644
--- a/dx/src/com/android/dx/dex/file/MethodIdsSection.java
+++ b/dx/src/com/android/dx/dex/file/MethodIdsSection.java
@@ -20,6 +20,7 @@ import com.android.dx.rop.cst.Constant;
import com.android.dx.rop.cst.CstBaseMethodRef;
import com.android.dx.util.AnnotatedOutput;
import com.android.dx.util.Hex;
+
import java.util.Collection;
import java.util.TreeMap;
@@ -94,7 +95,7 @@ public final class MethodIdsSection extends MemberIdsSection {
* @param method {@code non-null;} the reference to intern
* @return {@code non-null;} the interned reference
*/
- public MethodIdItem intern(CstBaseMethodRef method) {
+ public synchronized MethodIdItem intern(CstBaseMethodRef method) {
if (method == null) {
throw new NullPointerException("method == null");
}
diff --git a/dx/src/com/android/dx/dex/file/TypeIdsSection.java b/dx/src/com/android/dx/dex/file/TypeIdsSection.java
index ef47262a5..d9ab274d8 100644
--- a/dx/src/com/android/dx/dex/file/TypeIdsSection.java
+++ b/dx/src/com/android/dx/dex/file/TypeIdsSection.java
@@ -128,7 +128,7 @@ public final class TypeIdsSection extends UniformItemSection {
* @param type {@code non-null;} the type to intern
* @return {@code non-null;} the interned reference
*/
- public TypeIdItem intern(CstType type) {
+ public synchronized TypeIdItem intern(CstType type) {
if (type == null) {
throw new NullPointerException("type == null");
}