diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/task/OpenProgramTask.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/task/OpenProgramTask.java index 7e232ab58e..0680e3f1e0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/task/OpenProgramTask.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/task/OpenProgramTask.java @@ -33,8 +33,7 @@ import ghidra.program.model.listing.Program; import ghidra.util.*; import ghidra.util.exception.CancelledException; import ghidra.util.exception.VersionException; -import ghidra.util.task.Task; -import ghidra.util.task.TaskMonitor; +import ghidra.util.task.*; public class OpenProgramTask extends Task { @@ -108,7 +107,7 @@ public class OpenProgramTask extends Task { @Override public void run(TaskMonitor taskMonitor) { - this.monitor = taskMonitor; + this.monitor = TaskMonitorService.getMonitor(); if (domainFileInfoList.size() > 1) { monitor.initialize(domainFileInfoList.size()); diff --git a/Ghidra/Features/Base/src/test/java/ghidra/util/task/TaskMonitorServiceTest.java b/Ghidra/Features/Base/src/test/java/ghidra/util/task/TaskMonitorServiceTest.java index af7de51eee..be520b76a5 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/util/task/TaskMonitorServiceTest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/util/task/TaskMonitorServiceTest.java @@ -313,11 +313,35 @@ public class TaskMonitorServiceTest extends AbstractGhidraHeadedIntegrationTest } /** - * Verifies that once a monitor has been reset, the next call to retrieve a monitor will - * return it as a primary + * Verifies that calling finish on a primary monitor will cause it to + * be set back to an uninitialized state. */ @Test - public void testMonitorReset() { + public void testMonitorFinishPrimary() { + + TaskLauncher.launch(new Task("task") { + @Override + public void run(TaskMonitor monitor) throws CancelledException { + + TaskMonitor monitor1 = TaskMonitorService.getMonitor(); + assertTrue(monitor1 instanceof TaskDialog); + + monitor1.finished(); + + monitor1 = TaskMonitorService.getMonitor(); + assertTrue(monitor1 instanceof TaskDialog); + } + }); + + waitForTasks(); + } + + /** + * Verifies that calling finish on a secondary monitor will NOT cause + * it to be uninitialized (only primary monitors can reset this state) + */ + @Test + public void testMonitorFinishSecondary() { TaskLauncher.launch(new Task("task") { @Override @@ -329,10 +353,10 @@ public class TaskMonitorServiceTest extends AbstractGhidraHeadedIntegrationTest monitor1 = TaskMonitorService.getMonitor(); assertTrue(monitor1 instanceof SecondaryTaskMonitor); - monitor1.release(); + monitor1.finished(); monitor1 = TaskMonitorService.getMonitor(); - assertTrue(monitor1 instanceof TaskDialog); + assertTrue(monitor1 instanceof SecondaryTaskMonitor); } }); diff --git a/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/SecondaryTaskMonitor.java b/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/SecondaryTaskMonitor.java index 304e95d96d..8d6923822c 100644 --- a/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/SecondaryTaskMonitor.java +++ b/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/SecondaryTaskMonitor.java @@ -65,6 +65,17 @@ public class SecondaryTaskMonitor implements TaskMonitor { parentMonitor.setInitialized(init); } + /** + * Secondary monitors should not be able to reset progress or revert back + * to an uninitialized state; hence the override. + */ + @Override + public void finished() { + synchronized (this) { + setMessage(""); + } + } + @Override public boolean isCancelEnabled() { return parentMonitor.isCancelEnabled(); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/DefaultLanguageService.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/DefaultLanguageService.java index dcbe1420d3..c5361cbce5 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/DefaultLanguageService.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/DefaultLanguageService.java @@ -86,10 +86,18 @@ public class DefaultLanguageService implements LanguageService, ChangeListener { } private void searchForProviders() { - Set languageProviders = - ClassSearcher.getInstances(LanguageProvider.class); - searchCompleted = true; - processProviders(languageProviders); + TaskMonitor monitor = TaskMonitorService.getMonitor(); + monitor.setMessage("Searching for language providers"); + try { + Set languageProviders = + ClassSearcher.getInstances(LanguageProvider.class); + + searchCompleted = true; + processProviders(languageProviders); + } + finally { + monitor.finished(); + } } /** @@ -100,7 +108,6 @@ public class DefaultLanguageService implements LanguageService, ChangeListener { TaskMonitor monitor = TaskMonitorService.getMonitor(); monitor.setMessage("Retrieving language: " + languageID); - try { LanguageInfo info = languageMap.get(languageID); @@ -112,7 +119,7 @@ public class DefaultLanguageService implements LanguageService, ChangeListener { return lang; } finally { - monitor.release(); + monitor.finished(); } } diff --git a/Ghidra/Framework/Utility/src/main/java/ghidra/util/task/TaskMonitor.java b/Ghidra/Framework/Utility/src/main/java/ghidra/util/task/TaskMonitor.java index bef71b57b2..cb52efa6f7 100644 --- a/Ghidra/Framework/Utility/src/main/java/ghidra/util/task/TaskMonitor.java +++ b/Ghidra/Framework/Utility/src/main/java/ghidra/util/task/TaskMonitor.java @@ -66,7 +66,7 @@ public interface TaskMonitor { * monitor being returned from the {@link TaskMonitorService} on the next * invocation. */ - public default void release() { + public default void finished() { synchronized (this) { setMessage(""); setProgress(0);