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 378abc7e9d4..eb9bb96e130 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 @@ -556,8 +556,6 @@ public class GDBProcesses_7_0 extends AbstractDsfService new DataRequestMonitor(getExecutor(), rm) { @Override protected void handleSuccess() { - fCommandControl.setConnected(true); - IMIContainerDMContext containerDmc = createContainerContext(procCtx, ((IMIProcessDMContext)procCtx).getProcId()); rm.setData(containerDmc); @@ -584,14 +582,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService if (controlDmc != null && procDmc != null) { fCommandControl.queueCommand( new MITargetDetach(controlDmc, procDmc.getProcId()), - new DataRequestMonitor(getExecutor(), rm) { - @Override - protected void handleSuccess() { - // only if it is the last detach - fCommandControl.setConnected(false); - rm.done(); - } - }); + new DataRequestMonitor(getExecutor(), rm)); } else { rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INTERNAL_ERROR, "Invalid context.", null)); //$NON-NLS-1$ rm.done(); @@ -785,6 +776,9 @@ public class GDBProcesses_7_0 extends AbstractDsfService @DsfServiceEventHandler public void eventDispatched(IStartedDMEvent e) { if (e instanceof ContainerStartedDMEvent) { + // This will increment the connect count + fCommandControl.setConnected(true); + fContainerCommandCache.reset(); } else { fThreadCommandCache.reset(); @@ -795,6 +789,9 @@ public class GDBProcesses_7_0 extends AbstractDsfService @DsfServiceEventHandler public void eventDispatched(IExitedDMEvent e) { if (e instanceof ContainerExitedDMEvent) { + // This will decrement the connect count + fCommandControl.setConnected(false); + fContainerCommandCache.reset(); } else { fThreadCommandCache.reset(); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java index 53e651b07ea..3e6ca48fa12 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java @@ -97,7 +97,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl { private IGDBBackend fMIBackend; - private boolean fConnected = true; + private int fConnected = 0; private MIRunControlEventProcessor_7_0 fMIEventProcessor; private CLIEventProcessor_7_0 fCLICommandProcessor; @@ -347,12 +347,16 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl { } public boolean isConnected() { - return fInferiorProcess.getState() != MIInferiorProcess.State.TERMINATED && fConnected; + return fInferiorProcess.getState() != MIInferiorProcess.State.TERMINATED && fConnected > 0; } public void setConnected(boolean connected) { - fConnected = connected; - } + if (connected) { + fConnected++; + } else { + if (fConnected > 0) fConnected--; + } + } public AbstractCLIProcess getCLIProcess() { return fCLIProcess;