1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

[265181] Proper cleanup if a gdb command fails in the RunControl for non-stop

This commit is contained in:
Marc Khouzam 2009-05-27 16:02:40 +00:00
parent 1080a1c9bf
commit 6f00d065b3

View file

@ -39,6 +39,7 @@ import org.eclipse.cdt.dsf.mi.service.MIRunControl;
import org.eclipse.cdt.dsf.mi.service.MIStack; import org.eclipse.cdt.dsf.mi.service.MIStack;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakDelete; import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakDelete;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakInsert; import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakInsert;
import org.eclipse.cdt.dsf.mi.service.command.commands.MICommand;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecContinue; import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecContinue;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecFinish; import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecFinish;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecInterrupt; import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecInterrupt;
@ -446,17 +447,23 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
return; return;
} }
MIThreadRunState threadState = fThreadRunStates.get(context); final MIThreadRunState threadState = fThreadRunStates.get(context);
if (threadState == null) { if (threadState == null) {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE, rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE,
"Given context: " + context + " is not an MI execution context.", null)); //$NON-NLS-1$ //$NON-NLS-2$ "Given context: " + context + " is not an MI execution context.", null)); //$NON-NLS-1$ //$NON-NLS-2$
rm.done(); rm.done();
return; return;
} }
threadState.fResumePending = true;
threadState.fResumePending = true;
MIExecContinue cmd = new MIExecContinue(context); MIExecContinue cmd = new MIExecContinue(context);
fConnection.queueCommand(cmd, new DataRequestMonitor<MIInfo>(getExecutor(), rm)); fConnection.queueCommand(cmd, new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleFailure() {
threadState.fResumePending = false;
super.handleFailure();
}
});
} }
private void doResumeContainer(IContainerDMContext context, final RequestMonitor rm) { private void doResumeContainer(IContainerDMContext context, final RequestMonitor rm) {
@ -512,7 +519,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
return; return;
} }
MIThreadRunState threadState = fThreadRunStates.get(context); final MIThreadRunState threadState = fThreadRunStates.get(context);
if (threadState == null) { if (threadState == null) {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE, rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE,
"Given context: " + context + " can't be found.", null)); //$NON-NLS-1$ //$NON-NLS-2$ "Given context: " + context + " can't be found.", null)); //$NON-NLS-1$ //$NON-NLS-2$
@ -520,17 +527,13 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
return; return;
} }
threadState.fResumePending = true; MICommand<MIInfo> cmd = null;
threadState.fStepping = true;
switch (stepType) { switch (stepType) {
case STEP_INTO: case STEP_INTO:
fConnection.queueCommand(new MIExecStep(dmc), cmd = new MIExecStep(dmc);
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
break; break;
case STEP_OVER: case STEP_OVER:
fConnection.queueCommand(new MIExecNext(dmc), cmd = new MIExecNext(dmc);
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
break; break;
case STEP_RETURN: case STEP_RETURN:
// The -exec-finish command operates on the selected stack frame, but here we always // The -exec-finish command operates on the selected stack frame, but here we always
@ -542,27 +545,38 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
MIStack stackService = getServicesTracker().getService(MIStack.class); MIStack stackService = getServicesTracker().getService(MIStack.class);
if (stackService != null) { if (stackService != null) {
IFrameDMContext topFrameDmc = stackService.createFrameDMContext(dmc, 0); IFrameDMContext topFrameDmc = stackService.createFrameDMContext(dmc, 0);
fConnection.queueCommand(new MIExecFinish(topFrameDmc), cmd = new MIExecFinish(topFrameDmc);
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
} else { } else {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED, rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED,
"Cannot create context for command, stack service not available.", null)); //$NON-NLS-1$ "Cannot create context for command, stack service not available.", null)); //$NON-NLS-1$
rm.done(); rm.done();
return;
} }
break; break;
case INSTRUCTION_STEP_INTO: case INSTRUCTION_STEP_INTO:
fConnection.queueCommand(new MIExecStepInstruction(dmc), cmd = new MIExecStepInstruction(dmc);
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
break; break;
case INSTRUCTION_STEP_OVER: case INSTRUCTION_STEP_OVER:
fConnection.queueCommand(new MIExecNextInstruction(dmc), cmd = new MIExecNextInstruction(dmc);
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
break; break;
default: default:
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID,
INTERNAL_ERROR, "Given step type not supported", null)); //$NON-NLS-1$ INTERNAL_ERROR, "Given step type not supported", null)); //$NON-NLS-1$
rm.done(); rm.done();
return;
} }
threadState.fResumePending = true;
threadState.fStepping = true;
fConnection.queueCommand(cmd, new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
public void handleFailure() {
threadState.fResumePending = false;
threadState.fStepping = false;
super.handleFailure();
}
});
} }
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------