diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java index f2a28e11bc4..dc32a1f51af 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRestartCommand.java @@ -136,7 +136,7 @@ public class GdbRestartCommand implements IRestartHandler { } catch (CoreException e) {} procService.restart(containerDmc, attributes, - new RequestMonitor(fExecutor, null) { + new DataRequestMonitor(fExecutor, null) { @Override protected void handleCompleted() { fRequest.done(); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/DebugNewProcessSequence.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/DebugNewProcessSequence.java index 997afc91601..e7ed598dfda 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/DebugNewProcessSequence.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/DebugNewProcessSequence.java @@ -20,7 +20,6 @@ import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants; import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor; import org.eclipse.cdt.dsf.concurrent.ReflectionSequence; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; -import org.eclipse.cdt.dsf.concurrent.Sequence; import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext; @@ -39,9 +38,11 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; -/** +/** + * This sequence is used to start debugging a new process. + * * @since 4.0 - */ +*/ public class DebugNewProcessSequence extends ReflectionSequence { private final static String INVALID = "invalid"; //$NON-NLS-1$ @@ -267,23 +268,20 @@ public class DebugNewProcessSequence extends ReflectionSequence { @Execute public void stepStartExecution(final RequestMonitor rm) { if (fBackend.getSessionType() != SessionType.CORE) { - ImmediateExecutor.getInstance().execute( - getStartOrRestartProcessSequence( - getExecutor(), getContainerContext(), fAttributes, false, - new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { - @Override - protected void handleSuccess() { - assert getData() instanceof IMIContainerDMContext; - - // Set the container that we created - setContainerContext(DMContexts.getAncestorOfType(getData(), IMIContainerDMContext.class)); - fDataRequestMonitor.setData(getContainerContext()); + fProcService.start(getContainerContext(), fAttributes, new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { + @Override + protected void handleSuccess() { + assert getData() instanceof IMIContainerDMContext; - // Don't call fDataRequestMonitor.done(), the sequence will - // automatically do that when we call rm.done(); - rm.done(); - } - })); + // Set the container that we created + setContainerContext(DMContexts.getAncestorOfType(getData(), IMIContainerDMContext.class)); + fDataRequestMonitor.setData(getContainerContext()); + + // Don't call fDataRequestMonitor.done(), the sequence will + // automatically do that when it completes; + rm.done(); + } + }); } else { fDataRequestMonitor.setData(getContainerContext()); rm.done(); @@ -300,14 +298,4 @@ public class DebugNewProcessSequence extends ReflectionSequence { fTracker = null; rm.done(); } - - /** - * Return the sequence that is to be used to start or restart the specified process. - * Allows others to extend more easily. - */ - protected Sequence getStartOrRestartProcessSequence(DsfExecutor executor, IContainerDMContext containerDmc, - Map attributes, boolean restart, - DataRequestMonitor rm) { - return new StartOrRestartProcessSequence_7_0(executor, containerDmc, attributes, restart, rm); - } } \ No newline at end of file diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java index ba9b59e160e..f0c395da01e 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses.java @@ -389,20 +389,26 @@ public class GDBProcesses extends MIProcesses implements IGDBProcesses { } /** @since 4.0 */ - public void restart(IContainerDMContext containerDmc, Map attributes, RequestMonitor rm) { + public void restart(IContainerDMContext containerDmc, Map attributes, DataRequestMonitor rm) { startOrRestart(containerDmc, attributes, true, rm); } + /** @since 4.0 */ + public void start(IContainerDMContext containerDmc, Map attributes, DataRequestMonitor rm) { + startOrRestart(containerDmc, attributes, false, rm); + } + /** * Insert breakpoint at entry if set, and start or restart the program. * * @since 4.0 */ protected void startOrRestart(final IContainerDMContext containerDmc, Map attributes, - boolean restart, final RequestMonitor requestMonitor) { + boolean restart, final DataRequestMonitor requestMonitor) { if (fBackend.getIsAttachSession()) { // When attaching to a running process, we do not need to set a breakpoint or // start the program; it is left up to the user. + requestMonitor.setData(containerDmc); requestMonitor.done(); return; } @@ -416,7 +422,8 @@ public class GDBProcesses extends MIProcesses implements IGDBProcesses { // the ^connect getSession().dispatchEvent(new ContainerStartedDMEvent(containerDmc), getProperties()); } - super.handleSuccess(); + requestMonitor.setData(containerDmc); + requestMonitor.done(); } }; diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java index c8cc9aaaccb..3bcd0eacad7 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_0.java @@ -1125,13 +1125,23 @@ public class GDBProcesses_7_0 extends AbstractDsfService } /** @since 4.0 */ - public void restart(IContainerDMContext containerDmc, Map attributes, RequestMonitor rm) { - ImmediateExecutor.getInstance().execute( - getStartOrRestartProcessSequence( - getExecutor(), containerDmc, attributes, true, - new DataRequestMonitor(ImmediateExecutor.getInstance(), rm))); + public void restart(IContainerDMContext containerDmc, Map attributes, DataRequestMonitor rm) { + startOrRestart(containerDmc, attributes, true, rm); } + /** @since 4.0 */ + public void start(IContainerDMContext containerDmc, Map attributes, DataRequestMonitor rm) { + startOrRestart(containerDmc, attributes, false, rm); + } + + /** @since 4.0 */ + protected void startOrRestart(IContainerDMContext containerDmc, Map attributes, + boolean restart, DataRequestMonitor rm) { + ImmediateExecutor.getInstance().execute( + getStartOrRestartProcessSequence( + getExecutor(), containerDmc, attributes, restart, rm)); + } + /** * Return the sequence that is to be used to start or restart the specified process. * Allows others to extend more easily. diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/IGDBProcesses.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/IGDBProcesses.java index 4769ce37170..fa1bd0c3353 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/IGDBProcesses.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/IGDBProcesses.java @@ -14,7 +14,6 @@ package org.eclipse.cdt.dsf.gdb.service; import java.util.Map; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; -import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.cdt.dsf.mi.service.IMIContainerDMContext; import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext; @@ -72,9 +71,24 @@ public interface IGDBProcesses extends IMIProcesses { * @param containerDmc The process that should be restarted * @param attributes Different attributes that affect the restart operation. This is * usually the launch configuration attributes - * @param rm The requetMonitor that indicates that the restart request has been completed. + * @param rm The requetMonitor that indicates that the restart request has been completed. It will + * contain the IContainerDMContext fully filled with the data of the restarted process. * * @since 4.0 */ - void restart(IContainerDMContext containerDmc, Map attributes, RequestMonitor rm); + void restart(IContainerDMContext containerDmc, Map attributes, DataRequestMonitor rm); + + /** + * Request that the specified process be started. + * + * @param containerDmc The process that should be started. + * @param attributes Different attributes that affect the start operation. This is + * usually the launch configuration attributes + * @param rm The requestMonitor that indicates that the start request has been completed. It will + * contain the IContainerDMContext fully filled with the data of the newly started process. + * + * @since 4.0 + */ + void start(IContainerDMContext containerDmc, Map attributes, DataRequestMonitor rm); + } diff --git a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/framework/SyncUtil.java b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/framework/SyncUtil.java index f2ec7530a88..fc316d4fc1c 100644 --- a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/framework/SyncUtil.java +++ b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/framework/SyncUtil.java @@ -621,9 +621,9 @@ public class SyncUtil { MIStoppedEvent.class); // Perform the restart - Query query2 = new Query() { + Query query2 = new Query() { @Override - protected void execute(final DataRequestMonitor rm) { + protected void execute(final DataRequestMonitor rm) { fGdbControl.initInferiorInputOutput(new RequestMonitor(ImmediateExecutor.getInstance(), rm) { @SuppressWarnings("unchecked") @Override