From 73966fda891dab7a24f93adb1e953e82abdeacef Mon Sep 17 00:00:00 2001 From: Skylot <118523+skylot@users.noreply.github.com> Date: Sat, 21 Dec 2024 19:44:15 +0000 Subject: [PATCH] fix(gui): add missing sync in clean task at search dialog close (#2363) --- .../main/java/jadx/core/dex/nodes/ClassNode.java | 16 +++++++++------- .../java/jadx/gui/jobs/BackgroundExecutor.java | 10 ++++++++++ .../java/jadx/gui/ui/dialog/SearchDialog.java | 1 + 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index e42d64eb6..79b1ed9e4 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -456,13 +456,15 @@ public class ClassNode extends NotificationAttrNode if (state == NOT_LOADED) { return; } - methods.forEach(MethodNode::unload); - innerClasses.forEach(ClassNode::unload); - fields.forEach(FieldNode::unload); - unloadAttributes(); - setState(NOT_LOADED); - this.loadStage = LoadStage.NONE; - this.smali = null; + synchronized (clsInfo) { // decompilation sync + methods.forEach(MethodNode::unload); + innerClasses.forEach(ClassNode::unload); + fields.forEach(FieldNode::unload); + unloadAttributes(); + setState(NOT_LOADED); + this.loadStage = LoadStage.NONE; + this.smali = null; + } } private void buildCache() { diff --git a/jadx-gui/src/main/java/jadx/gui/jobs/BackgroundExecutor.java b/jadx-gui/src/main/java/jadx/gui/jobs/BackgroundExecutor.java index 0d6fbea85..2f0714646 100644 --- a/jadx-gui/src/main/java/jadx/gui/jobs/BackgroundExecutor.java +++ b/jadx-gui/src/main/java/jadx/gui/jobs/BackgroundExecutor.java @@ -22,6 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import jadx.api.utils.tasks.ITaskExecutor; +import jadx.core.utils.exceptions.JadxRuntimeException; import jadx.gui.settings.JadxSettings; import jadx.gui.ui.MainWindow; import jadx.gui.ui.panel.ProgressPanel; @@ -81,6 +82,15 @@ public class BackgroundExecutor { } } + public synchronized void waitForComplete() { + try { + // add empty task and wait its completion + taskQueueExecutor.submit(UiUtils.EMPTY_RUNNABLE).get(); + } catch (Exception e) { + throw new JadxRuntimeException("Failed to wait tasks completion", e); + } + } + public void execute(String title, List backgroundJobs, Consumer onFinishUiRunnable) { execute(new SimpleTask(title, backgroundJobs, onFinishUiRunnable)); } diff --git a/jadx-gui/src/main/java/jadx/gui/ui/dialog/SearchDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/dialog/SearchDialog.java index bad2629cf..b3f04498a 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/dialog/SearchDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/dialog/SearchDialog.java @@ -182,6 +182,7 @@ public class SearchDialog extends CommonSearchDialog { removeActiveTabListener(); searchBackgroundExecutor.execute(() -> { stopSearchTask(); + mainWindow.getBackgroundExecutor().waitForComplete(); unloadTempData(); }); super.dispose();