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();