diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/tree/TraceRmiServiceNode.java b/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/tree/TraceRmiServiceNode.java index 8092a4c40d..db3539667e 100644 --- a/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/tree/TraceRmiServiceNode.java +++ b/Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/tree/TraceRmiServiceNode.java @@ -26,6 +26,7 @@ import ghidra.debug.api.target.TargetPublicationListener; import ghidra.debug.api.tracemgr.DebuggerCoordinates; import ghidra.debug.api.tracermi.*; import ghidra.util.Msg; +import ghidra.util.Swing; public class TraceRmiServiceNode extends AbstractTraceRmiManagerNode implements TraceRmiServiceListener, TargetPublicationListener { @@ -107,46 +108,60 @@ public class TraceRmiServiceNode extends AbstractTraceRmiManagerNode @Override public void serverStarted(SocketAddress address) { - serverNode.fireNodeChanged(); - provider.contextChanged(); + Swing.runIfSwingOrRunLater(() -> { + serverNode.fireNodeChanged(); + provider.contextChanged(); + }); } @Override public void serverStopped() { - serverNode.fireNodeChanged(); - provider.contextChanged(); + Swing.runIfSwingOrRunLater(() -> { + serverNode.fireNodeChanged(); + provider.contextChanged(); + }); } @Override public void connected(TraceRmiConnection connection, ConnectMode mode, TraceRmiAcceptor acceptor) { - addConnectionNode(connection); - removeAcceptorNode(acceptor); - provider.contextChanged(); + Swing.runIfSwingOrRunLater(() -> { + addConnectionNode(connection); + removeAcceptorNode(acceptor); + provider.contextChanged(); + }); } @Override public void disconnected(TraceRmiConnection connection) { - removeConnectionNode(connection); - provider.contextChanged(); + Swing.runIfSwingOrRunLater(() -> { + removeConnectionNode(connection); + provider.contextChanged(); + }); } @Override public void waitingAccept(TraceRmiAcceptor acceptor) { - addAcceptorNode(acceptor); - provider.contextChanged(); + Swing.runIfSwingOrRunLater(() -> { + addAcceptorNode(acceptor); + provider.contextChanged(); + }); } @Override public void acceptCancelled(TraceRmiAcceptor acceptor) { - removeAcceptorNode(acceptor); - provider.contextChanged(); + Swing.runIfSwingOrRunLater(() -> { + removeAcceptorNode(acceptor); + provider.contextChanged(); + }); } @Override public void acceptFailed(TraceRmiAcceptor acceptor, Exception e) { - removeAcceptorNode(acceptor); - provider.contextChanged(); + Swing.runIfSwingOrRunLater(() -> { + removeAcceptorNode(acceptor); + provider.contextChanged(); + }); } @Override @@ -167,7 +182,7 @@ public class TraceRmiServiceNode extends AbstractTraceRmiManagerNode synchronized (targetNodes) { targetNodes.put(target, tNode); } - provider.contextChanged(); + Swing.runIfSwingOrRunLater(() -> provider.contextChanged()); } protected static void fireNodeChanged(Map map, @@ -207,8 +222,10 @@ public class TraceRmiServiceNode extends AbstractTraceRmiManagerNode if (node == null) { return; } - node.getConnectionNode().targetWithdrawn(target); - provider.contextChanged(); + Swing.runIfSwingOrRunLater(() -> { + node.getConnectionNode().targetWithdrawn(target); + provider.contextChanged(); + }); } public void coordinates(DebuggerCoordinates coordinates) { diff --git a/Ghidra/Debug/Debugger-rmi-trace/src/test/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerProviderTest.java b/Ghidra/Debug/Debugger-rmi-trace/src/test/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerProviderTest.java index 26c7c4e9c2..34b9dfc376 100644 --- a/Ghidra/Debug/Debugger-rmi-trace/src/test/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerProviderTest.java +++ b/Ghidra/Debug/Debugger-rmi-trace/src/test/java/ghidra/app/plugin/core/debug/gui/tracermi/connection/TraceRmiConnectionManagerProviderTest.java @@ -45,6 +45,7 @@ import ghidra.debug.api.tracermi.TraceRmiConnection; import ghidra.trace.model.target.schema.SchemaContext; import ghidra.trace.model.target.schema.TraceObjectSchema.SchemaName; import ghidra.trace.model.target.schema.XmlSchemaContext; +import ghidra.util.Swing; import ghidra.util.exception.CancelledException; public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedDebuggerTest { @@ -76,7 +77,9 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD helper.dismissWithArguments(Map.ofEntries( helper.entry("address", "localhost"), helper.entry("port", 0))); - waitForPass(() -> Unique.assertOne(traceRmiService.getAllAcceptors())); + TraceRmiAcceptor acceptor = + waitForPass(() -> Unique.assertOne(traceRmiService.getAllAcceptors())); + acceptor.cancel(); } @Test @@ -129,6 +132,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD public void testActionCloseOnAcceptor() throws Exception { TraceRmiAcceptor acceptor = traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); + waitForSwing(); TraceRmiAcceptorNode node = TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor); assertNotNull(node); @@ -149,6 +153,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD @Test public void testActionCloseOnConnection() throws Exception { try (Cx cx = Cx.connect(traceRmiService, "Test client")) { + waitForSwing(); TraceRmiConnectionNode node = TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) .get(cx.connection); @@ -169,6 +174,8 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD TraceRmiAcceptor acceptor = traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); try (Cx cx = Cx.connect(traceRmiService, "Test client")) { + waitForSwing(); + performEnabledAction(provider, provider.actionCloseAll, true); waitForPass(() -> assertFalse(traceRmiService.isServerStarted())); @@ -209,6 +216,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD public void testAcceptHasNode() throws Exception { TraceRmiAcceptor acceptor = traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); + waitForSwing(); TraceRmiAcceptorNode node = TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor); assertNotNull(node); @@ -219,11 +227,13 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD public void testAcceptThenCancelNoNode() throws Exception { TraceRmiAcceptor acceptor = traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); + waitForSwing(); assertNotNull( TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor)); acceptor.cancel(); waitForPass(() -> traceRmiService.getAllAcceptors().isEmpty()); + waitForSwing(); assertNull( TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor)); } @@ -310,6 +320,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD public void testAcceptThenSuccessNodes() throws Exception { TraceRmiAcceptor acceptor = traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); + waitForSwing(); assertNotNull( TraceRmiConnectionTreeHelper.getAcceptorNodeMap(provider.rootNode).get(acceptor)); @@ -320,6 +331,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD .get(acceptor))); waitForPass(() -> assertEquals(cx.connection, Unique.assertOne(traceRmiService.getAllConnections()))); + waitForSwing(); TraceRmiConnectionNode node = TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) @@ -335,6 +347,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD traceRmiService.startServer(); try (Cx cx = Cx.toServer(traceRmiService, "Test client")) { waitForPass(() -> traceRmiService.getAllAcceptors().isEmpty()); + waitForSwing(); TraceRmiConnectionNode node = waitForValue( () -> TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) @@ -349,6 +362,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD try (Cx cx = Cx.connect(traceRmiService, "Test client")) { waitForPass(() -> assertEquals(cx.connection, Unique.assertOne(traceRmiService.getAllConnections()))); + waitForSwing(); TraceRmiConnectionNode node = TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) @@ -364,6 +378,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD TraceRmiAcceptor acceptor = traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); try (Cx cx = Cx.complete(acceptor, "Test client")) { + waitForSwing(); assertNotNull(TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) .get(cx.connection)); @@ -380,6 +395,7 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD TraceRmiAcceptor acceptor = traceRmiService.acceptOne(new InetSocketAddress("localhost", 0)); try (Cx cx = Cx.complete(acceptor, "Test client")) { + waitForSwing(); assertNotNull(TraceRmiConnectionTreeHelper.getConnectionNodeMap(provider.rootNode) .get(cx.connection)); @@ -403,12 +419,13 @@ public class TraceRmiConnectionManagerProviderTest extends AbstractGhidraHeadedD } cx.client.activate(1, ""); Target target = waitForValue(() -> traceManager.getCurrent().getTarget()); + waitForSwing(); TraceRmiTargetNode node = TraceRmiConnectionTreeHelper.getTargetNodeMap(provider.rootNode).get(target); assertEquals("bash (snap=1)", node.getDisplayText()); - provider.tree.setSelectedNode(node); + Swing.runNow(() -> provider.tree.setSelectedNode(node)); // Tree uses a task queue for selection requests waitForPass( () -> assertEquals(node, Unique.assertOne(provider.tree.getSelectedNodes()))); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/target/DebuggerTargetServicePlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/target/DebuggerTargetServicePlugin.java index d2a620cb0a..6f30091756 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/target/DebuggerTargetServicePlugin.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/target/DebuggerTargetServicePlugin.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -27,8 +27,15 @@ import ghidra.framework.plugintool.util.PluginStatus; import ghidra.trace.model.Trace; import ghidra.util.datastruct.ListenerSet; -@PluginInfo(shortDescription = "Debugger targets manager service", description = "Maintains a collection of published targets and notifies listeners of changes.", category = PluginCategoryNames.DEBUGGER, packageName = DebuggerPluginPackage.NAME, status = PluginStatus.RELEASED, servicesProvided = { - DebuggerTargetService.class, }) +@PluginInfo( + shortDescription = "Debugger targets manager service", + description = "Maintains a collection of published targets and notifies listeners of changes.", + category = PluginCategoryNames.DEBUGGER, + packageName = DebuggerPluginPackage.NAME, + status = PluginStatus.RELEASED, + servicesProvided = { + DebuggerTargetService.class, + }) public class DebuggerTargetServicePlugin extends Plugin implements DebuggerTargetService { public DebuggerTargetServicePlugin(PluginTool tool) { diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/InvocationDialogHelper.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/InvocationDialogHelper.java index ce9b22b57f..82b8c66bf7 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/InvocationDialogHelper.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/InvocationDialogHelper.java @@ -44,7 +44,7 @@ public class InvocationDialogHelper> args) { - dialog.setMemorizedArguments(args); + runSwing(() -> dialog.setMemorizedArguments(args)); invoke(); }