From 9e0cd2e14e858ee5b86dd2489000a5e3be2d6d26 Mon Sep 17 00:00:00 2001 From: Jan S Date: Fri, 18 Jan 2019 14:47:44 +0100 Subject: [PATCH] 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 --- .../main/java/jadx/gui/ui/HeapUsageBar.java | 4 ++-- .../java/jadx/gui/utils/CodeUsageInfo.java | 23 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/jadx-gui/src/main/java/jadx/gui/ui/HeapUsageBar.java b/jadx-gui/src/main/java/jadx/gui/ui/HeapUsageBar.java index 29abbdb45..260333ab8 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/HeapUsageBar.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/HeapUsageBar.java @@ -35,7 +35,7 @@ public class HeapUsageBar extends JProgressBar implements ActionListener { setMaximum(maxKB); maxGB = maxKB / TWO_TO_20; update(); - timer = new Timer(1000, this); + timer = new Timer(2000, this); } public void update() { @@ -44,7 +44,7 @@ public class HeapUsageBar extends JProgressBar implements ActionListener { setValue(usedKB); setString(String.format(textFormat, (usedKB / TWO_TO_20), maxGB)); - if (used > r.totalMemory() * 0.8) { + if (used > r.maxMemory() * 0.8) { setForeground(RED); } else { setForeground(GREEN); diff --git a/jadx-gui/src/main/java/jadx/gui/utils/CodeUsageInfo.java b/jadx-gui/src/main/java/jadx/gui/utils/CodeUsageInfo.java index 299caedab..581e5c3c2 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/CodeUsageInfo.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/CodeUsageInfo.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import jadx.api.CodePosition; import jadx.api.JavaClass; @@ -21,6 +22,10 @@ public class CodeUsageInfo { public List getUsageList() { return usageList; } + + public synchronized void addUsage(CodeNode codeNode) { + usageList.add(codeNode); + } } private final JNodeCache nodeCache; @@ -29,7 +34,7 @@ public class CodeUsageInfo { this.nodeCache = nodeCache; } - private final Map usageMap = new HashMap<>(); + private final Map usageMap = new ConcurrentHashMap<>(); public void processClass(JavaClass javaClass, CodeLinesInfo linesInfo, List lines) { Map usage = javaClass.getUsageMap(); @@ -42,17 +47,13 @@ public class CodeUsageInfo { private void addUsage(JNode jNode, JavaClass javaClass, CodeLinesInfo linesInfo, CodePosition codePosition, List lines) { - UsageInfo usageInfo = usageMap.get(jNode); - if (usageInfo == null) { - usageInfo = new UsageInfo(); - usageMap.put(jNode, usageInfo); - } - int line = codePosition.getLine(); - JavaNode javaNodeByLine = linesInfo.getJavaNodeByLine(line); - StringRef codeLine = lines.get(line - 1); - JNode node = nodeCache.makeFrom(javaNodeByLine == null ? javaClass : javaNodeByLine); + UsageInfo usageInfo = usageMap.computeIfAbsent(jNode, key -> new UsageInfo()); + 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); - usageInfo.getUsageList().add(codeNode); + usageInfo.addUsage(codeNode); } public List getUsageList(JNode node) {