Skip to content

Commit 97e7aa6

Browse files
committed
Note on properly threading the deobfuscation window
1 parent 7ad1bec commit 97e7aa6

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

recaf-ui/src/main/java/software/coley/recaf/ui/window/DeobfuscationWindow.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@
5252
import software.coley.recaf.services.deobfuscation.transform.generic.IllegalSignatureRemovingTransformer;
5353
import software.coley.recaf.services.deobfuscation.transform.generic.IllegalVarargsRemovingTransformer;
5454
import software.coley.recaf.services.deobfuscation.transform.generic.KotlinNameRestorationTransformer;
55-
import software.coley.recaf.services.deobfuscation.transform.generic.OpaqueConstantFoldingTransformer;
5655
import software.coley.recaf.services.deobfuscation.transform.generic.LongAnnotationRemovingTransformer;
5756
import software.coley.recaf.services.deobfuscation.transform.generic.LongExceptionRemovingTransformer;
57+
import software.coley.recaf.services.deobfuscation.transform.generic.OpaqueConstantFoldingTransformer;
5858
import software.coley.recaf.services.deobfuscation.transform.generic.OpaquePredicateFoldingTransformer;
5959
import software.coley.recaf.services.deobfuscation.transform.generic.RedundantTryCatchRemovingTransformer;
6060
import software.coley.recaf.services.deobfuscation.transform.generic.SourceNameRestorationTransformer;
@@ -84,6 +84,9 @@
8484
import software.coley.recaf.util.FxThreadUtil;
8585
import software.coley.recaf.util.Lang;
8686
import software.coley.recaf.util.StringUtil;
87+
import software.coley.recaf.util.threading.Batch;
88+
import software.coley.recaf.util.threading.ThreadPoolFactory;
89+
import software.coley.recaf.util.threading.ThreadUtil;
8790
import software.coley.recaf.workspace.model.Workspace;
8891

8992
import java.util.ArrayList;
@@ -99,6 +102,7 @@
99102
@Dependent
100103
public class DeobfuscationWindow extends RecafStage {
101104
private static final int MAX_PASSES = 5; // TODO: Make this an input
105+
private static final Batch deobfuscationBatch = ThreadUtil.batch(ThreadPoolFactory.newSingleThreadExecutor("deobfuscation-preview"));
102106
private static final DebuggingLogger logger = Logging.get(DeobfuscationWindow.class);
103107
private final TransformationManager transformationManager;
104108
private final TransformationApplierService transformationApplierService;
@@ -483,10 +487,19 @@ public boolean isDecompilePreview() {
483487
}
484488

485489
private void updatePreview() {
486-
if (isDecompilePreview())
487-
decompile();
488-
else
489-
disassemble();
490+
// TODO: We can't really stop expensive decompilations, they don't check for interrupts on the current thread
491+
// and we have no good way of force killing them (rip Thread.stop) so the best we can really do is only
492+
// allow one of these tasks to run at a time, with one next 'pending' task.
493+
// While a task is executing we update what is the next 'pending' task when we call this method.
494+
// Once the current task is done, or there is nothing running we make the 'pending' the current task and run it.
495+
deobfuscationBatch.add(() -> {
496+
deobfuscationBatch.clear();
497+
if (isDecompilePreview())
498+
decompile();
499+
else
500+
disassemble();
501+
});
502+
deobfuscationBatch.executeNewest();
490503
}
491504

492505
private void disassemble() {

0 commit comments

Comments
 (0)