Commit 9e0cd2e1 authored by Jan S's avatar Jan S Committed by skylot

fix(gui): add synchronizations to search index creation (#433)

* fix: unsynchronized search index creation (code usage) results in ArrayIndexOutOfBoundsException and stuck at 99%

* fix: use computeIfAbsent instead of synchronized block
parent d1af7512
...@@ -35,7 +35,7 @@ public class HeapUsageBar extends JProgressBar implements ActionListener { ...@@ -35,7 +35,7 @@ public class HeapUsageBar extends JProgressBar implements ActionListener {
setMaximum(maxKB); setMaximum(maxKB);
maxGB = maxKB / TWO_TO_20; maxGB = maxKB / TWO_TO_20;
update(); update();
timer = new Timer(1000, this); timer = new Timer(2000, this);
} }
public void update() { public void update() {
...@@ -44,7 +44,7 @@ public class HeapUsageBar extends JProgressBar implements ActionListener { ...@@ -44,7 +44,7 @@ public class HeapUsageBar extends JProgressBar implements ActionListener {
setValue(usedKB); setValue(usedKB);
setString(String.format(textFormat, (usedKB / TWO_TO_20), maxGB)); setString(String.format(textFormat, (usedKB / TWO_TO_20), maxGB));
if (used > r.totalMemory() * 0.8) { if (used > r.maxMemory() * 0.8) {
setForeground(RED); setForeground(RED);
} else { } else {
setForeground(GREEN); setForeground(GREEN);
......
...@@ -5,6 +5,7 @@ import java.util.Collections; ...@@ -5,6 +5,7 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import jadx.api.CodePosition; import jadx.api.CodePosition;
import jadx.api.JavaClass; import jadx.api.JavaClass;
...@@ -21,6 +22,10 @@ public class CodeUsageInfo { ...@@ -21,6 +22,10 @@ public class CodeUsageInfo {
public List<CodeNode> getUsageList() { public List<CodeNode> getUsageList() {
return usageList; return usageList;
} }
public synchronized void addUsage(CodeNode codeNode) {
usageList.add(codeNode);
}
} }
private final JNodeCache nodeCache; private final JNodeCache nodeCache;
...@@ -29,7 +34,7 @@ public class CodeUsageInfo { ...@@ -29,7 +34,7 @@ public class CodeUsageInfo {
this.nodeCache = nodeCache; this.nodeCache = nodeCache;
} }
private final Map<JNode, UsageInfo> usageMap = new HashMap<>(); private final Map<JNode, UsageInfo> usageMap = new ConcurrentHashMap<>();
public void processClass(JavaClass javaClass, CodeLinesInfo linesInfo, List<StringRef> lines) { public void processClass(JavaClass javaClass, CodeLinesInfo linesInfo, List<StringRef> lines) {
Map<CodePosition, JavaNode> usage = javaClass.getUsageMap(); Map<CodePosition, JavaNode> usage = javaClass.getUsageMap();
...@@ -42,17 +47,13 @@ public class CodeUsageInfo { ...@@ -42,17 +47,13 @@ public class CodeUsageInfo {
private void addUsage(JNode jNode, JavaClass javaClass, private void addUsage(JNode jNode, JavaClass javaClass,
CodeLinesInfo linesInfo, CodePosition codePosition, List<StringRef> lines) { CodeLinesInfo linesInfo, CodePosition codePosition, List<StringRef> lines) {
UsageInfo usageInfo = usageMap.get(jNode); UsageInfo usageInfo = usageMap.computeIfAbsent(jNode, key -> new UsageInfo());
if (usageInfo == null) { int line = codePosition.getLine();
usageInfo = new UsageInfo(); JavaNode javaNodeByLine = linesInfo.getJavaNodeByLine(line);
usageMap.put(jNode, usageInfo); StringRef codeLine = lines.get(line - 1);
} JNode node = nodeCache.makeFrom(javaNodeByLine == null ? javaClass : javaNodeByLine);
int line = codePosition.getLine();
JavaNode javaNodeByLine = linesInfo.getJavaNodeByLine(line);
StringRef codeLine = lines.get(line - 1);
JNode node = nodeCache.makeFrom(javaNodeByLine == null ? javaClass : javaNodeByLine);
CodeNode codeNode = new CodeNode(node, line, codeLine); CodeNode codeNode = new CodeNode(node, line, codeLine);
usageInfo.getUsageList().add(codeNode); usageInfo.addUsage(codeNode);
} }
public List<CodeNode> getUsageList(JNode node) { public List<CodeNode> getUsageList(JNode node) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment