Skip to content

Commit eeee38d

Browse files
Optimize ByteCodeTranslator with parallel processing and explicit locking
Parallelize class parsing and code generation to improve performance. Replace unsafe synchronized blocks/collections with ReentrantReadWriteLock and ReentrantLock for robust thread safety. Update `BytecodeInstructionIntegrationTest` to dynamically locate anonymous classes.
1 parent ae972aa commit eeee38d

File tree

3 files changed

+179
-78
lines changed

3 files changed

+179
-78
lines changed

vm/ByteCodeTranslator/src/com/codename1/tools/translator/ByteCodeClass.java

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ public void setIsAnnotation(boolean isAnnotation) {
8282
private boolean isUnitTest;
8383

8484

85-
private static Set<String> arrayTypes = Collections.synchronizedSet(new TreeSet<String>());
85+
private static Set<String> arrayTypes = new TreeSet<String>();
86+
private static ReadWriteLock arrayTypesLock = new ReentrantReadWriteLock();
8687

8788
private ByteCodeClass baseClassObject;
8889
private List<ByteCodeClass> baseInterfacesObject;
@@ -94,9 +95,11 @@ public void setIsAnnotation(boolean isAnnotation) {
9495

9596
private boolean marked;
9697
private static volatile ByteCodeClass mainClass;
98+
private static ReentrantLock mainClassLock = new ReentrantLock();
9799
private boolean finalClass;
98100
private boolean isEnum;
99-
private static Set<String> writableFields = Collections.synchronizedSet(new HashSet<String>());
101+
private static Set<String> writableFields = new HashSet<String>();
102+
private static ReadWriteLock writableFieldsLock = new ReentrantReadWriteLock();
100103

101104
/**
102105
*
@@ -155,12 +158,15 @@ static void setSaveUnitTests(boolean save) {
155158

156159
public void addMethod(BytecodeMethod m) {
157160
if(m.isMain()) {
158-
synchronized(ByteCodeClass.class) {
161+
mainClassLock.lock();
162+
try {
159163
if (mainClass == null) {
160164
mainClass = this;
161165
} else {
162166
throw new RuntimeException("Multiple main classes: "+mainClass.clsName+" and "+this.clsName);
163167
}
168+
} finally {
169+
mainClassLock.unlock();
164170
}
165171
}
166172
m.setSourceFile(sourceFile);
@@ -1058,29 +1064,29 @@ public String generateCCode(List<ByteCodeClass> allClasses) {
10581064
b.append(clsName);
10591065
b.append(");\n return;\n }\n\n");
10601066

1061-
boolean c1 = false;
1062-
boolean c2 = false;
1063-
boolean c3 = false;
1067+
boolean arrayTypeC1 = false;
1068+
boolean arrayTypeC2 = false;
1069+
boolean arrayTypeC3 = false;
10641070
arrayTypesLock.readLock().lock();
10651071
try {
1066-
c1 = arrayTypes.contains("1_" + clsName) || arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
1067-
c2 = arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
1068-
c3 = arrayTypes.contains("3_" + clsName);
1072+
arrayTypeC1 = arrayTypes.contains("1_" + clsName) || arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
1073+
arrayTypeC2 = arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
1074+
arrayTypeC3 = arrayTypes.contains("3_" + clsName);
10691075
} finally {
10701076
arrayTypesLock.readLock().unlock();
10711077
}
1072-
if(c1) {
1078+
if(arrayTypeC1) {
10731079
b.append("class_array1__");
10741080
b.append(clsName);
10751081
b.append(".vtable = initVtableForInterface();\n ");
10761082
}
10771083

1078-
if(c2) {
1084+
if(arrayTypeC2) {
10791085
b.append("class_array2__");
10801086
b.append(clsName);
10811087
b.append(".vtable = initVtableForInterface();\n ");
10821088
}
1083-
if(c3) {
1089+
if(arrayTypeC3) {
10841090
b.append("class_array3__");
10851091
b.append(clsName);
10861092
b.append(".vtable = initVtableForInterface();\n ");
@@ -1294,30 +1300,30 @@ public String generateCHeader() {
12941300
b.append(clsName);
12951301
b.append(";\n");
12961302

1297-
boolean _c1 = false;
1298-
boolean _c2 = false;
1299-
boolean _c3 = false;
1303+
boolean arrayTypeC1 = false;
1304+
boolean arrayTypeC2 = false;
1305+
boolean arrayTypeC3 = false;
13001306
arrayTypesLock.readLock().lock();
13011307
try {
1302-
_c1 = arrayTypes.contains("1_" + clsName) || arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
1303-
_c2 = arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
1304-
_c3 = arrayTypes.contains("3_" + clsName);
1308+
arrayTypeC1 = arrayTypes.contains("1_" + clsName) || arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
1309+
arrayTypeC2 = arrayTypes.contains("2_" + clsName) || arrayTypes.contains("3_" + clsName);
1310+
arrayTypeC3 = arrayTypes.contains("3_" + clsName);
13051311
} finally {
13061312
arrayTypesLock.readLock().unlock();
13071313
}
1308-
if(_c1) {
1314+
if(arrayTypeC1) {
13091315
b.append("extern struct clazz class_array1__");
13101316
b.append(clsName);
13111317
b.append(";\n");
13121318
}
13131319

1314-
if(_c2) {
1320+
if(arrayTypeC2) {
13151321
b.append("extern struct clazz class_array2__");
13161322
b.append(clsName);
13171323
b.append(";\n");
13181324
}
13191325

1320-
if(_c3) {
1326+
if(arrayTypeC3) {
13211327
b.append("extern struct clazz class_array3__");
13221328
b.append(clsName);
13231329
b.append(";\n");
@@ -1357,14 +1363,14 @@ public String generateCHeader() {
13571363
b.append("extern JAVA_OBJECT __VALUE_OF_").append(clsName).append("(CODENAME_ONE_THREAD_STATE, JAVA_OBJECT value);\n");
13581364
}
13591365

1360-
boolean _c1_arr = false;
1366+
boolean arrayTypeC1_arr = false;
13611367
arrayTypesLock.readLock().lock();
13621368
try {
1363-
_c1_arr = arrayTypes.contains("1_" + clsName);
1369+
arrayTypeC1_arr = arrayTypes.contains("1_" + clsName);
13641370
} finally {
13651371
arrayTypesLock.readLock().unlock();
13661372
}
1367-
if(_c1_arr) {
1373+
if(arrayTypeC1_arr) {
13681374
b.append("extern JAVA_OBJECT __NEW_ARRAY_");
13691375
b.append(clsName);
13701376
b.append("(CODENAME_ONE_THREAD_STATE, JAVA_INT size);\n");

vm/ByteCodeTranslator/src/com/codename1/tools/translator/BytecodeMethod.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
import java.util.Map;
5656
import java.util.Set;
5757
import java.util.TreeSet;
58+
import java.util.concurrent.locks.ReadWriteLock;
59+
import java.util.concurrent.locks.ReentrantReadWriteLock;
5860
import org.objectweb.asm.Label;
5961
import org.objectweb.asm.Opcodes;
6062

0 commit comments

Comments
 (0)