1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-25 09:55:29 +02:00

[304146] Added a CommandFactory for MI/CLI commands, and change every service to use it.

This commit is contained in:
Marc Khouzam 2010-03-03 14:35:50 +00:00
parent 5472627bcc
commit 47804a071a
37 changed files with 1191 additions and 564 deletions

View file

@ -34,17 +34,7 @@ import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
import org.eclipse.cdt.dsf.mi.service.CSourceLookup;
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLISource;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIEnvironmentCD;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIFileExecAndSymbols;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetArgs;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetAutoSolib;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetNonStop;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetPagination;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetSolibSearchPath;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetTargetAsync;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetSelect;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetSelectCore;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.core.runtime.CoreException;
@ -93,6 +83,8 @@ public class FinalLaunchSequence extends Sequence {
requestMonitor.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, -1, "Cannot obtain control service", null)); //$NON-NLS-1$
}
fCommandFactory = fCommandControl.getCommandFactory();
requestMonitor.done();
}},
/*
@ -117,7 +109,7 @@ public class FinalLaunchSequence extends Sequence {
if (gdbinitFile != null && gdbinitFile.length() > 0) {
fCommandControl.queueCommand(
new CLISource(fCommandControl.getContext(), gdbinitFile),
fCommandFactory.createCLISource(fCommandControl.getContext(), gdbinitFile),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
@Override
protected void handleCompleted() {
@ -157,7 +149,7 @@ public class FinalLaunchSequence extends Sequence {
final IPath execPath = fGDBBackend.getProgramPath();
if (!noFileCommand && execPath != null && !execPath.isEmpty()) {
fCommandControl.queueCommand(
new MIFileExecAndSymbols(fCommandControl.getContext(),
fCommandFactory.createMIFileExecAndSymbols(fCommandControl.getContext(),
execPath.toPortableString()),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
} else {
@ -174,7 +166,7 @@ public class FinalLaunchSequence extends Sequence {
if (args != null) {
fCommandControl.queueCommand(
new MIGDBSetArgs(fCommandControl.getContext(), args),
fCommandFactory.createMIGDBSetArgs(fCommandControl.getContext(), args),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
} else {
requestMonitor.done();
@ -200,7 +192,7 @@ public class FinalLaunchSequence extends Sequence {
if (dir != null) {
fCommandControl.queueCommand(
new MIEnvironmentCD(fCommandControl.getContext(), dir.toPortableString()),
fCommandFactory.createMIEnvironmentCD(fCommandControl.getContext(), dir.toPortableString()),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
} else {
requestMonitor.done();
@ -246,17 +238,17 @@ public class FinalLaunchSequence extends Sequence {
if (isNonStop) {
// The raw commands should not be necessary in the official GDB release
fCommandControl.queueCommand(
new MIGDBSetTargetAsync(fCommandControl.getContext(), true),
fCommandFactory.createMIGDBSetTargetAsync(fCommandControl.getContext(), true),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
@Override
protected void handleSuccess() {
fCommandControl.queueCommand(
new MIGDBSetPagination(fCommandControl.getContext(), false),
fCommandFactory.createMIGDBSetPagination(fCommandControl.getContext(), false),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
@Override
protected void handleSuccess() {
fCommandControl.queueCommand(
new MIGDBSetNonStop(fCommandControl.getContext(), true),
fCommandFactory.createMIGDBSetNonStop(fCommandControl.getContext(), true),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
}
});
@ -275,7 +267,7 @@ public class FinalLaunchSequence extends Sequence {
boolean autolib = fLaunch.getLaunchConfiguration().getAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_AUTO_SOLIB,
IGDBLaunchConfigurationConstants.DEBUGGER_AUTO_SOLIB_DEFAULT);
fCommandControl.queueCommand(
new MIGDBSetAutoSolib(fCommandControl.getContext(), autolib),
fCommandFactory.createMIGDBSetAutoSolib(fCommandControl.getContext(), autolib),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
} catch (CoreException e) {
requestMonitor.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, -1, "Cannot set shared library option", e)); //$NON-NLS-1$
@ -293,7 +285,7 @@ public class FinalLaunchSequence extends Sequence {
if (p.size() > 0) {
String[] paths = p.toArray(new String[p.size()]);
fCommandControl.queueCommand(
new MIGDBSetSolibSearchPath(fCommandControl.getContext(), paths),
fCommandFactory.createMIGDBSetSolibSearchPath(fCommandControl.getContext(), paths),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
@Override
protected void handleSuccess() {
@ -391,14 +383,14 @@ public class FinalLaunchSequence extends Sequence {
requestMonitor.done();
} else {
fCommandControl.queueCommand(
new MITargetSelectCore(fCommandControl.getContext(), newCoreFile),
fCommandFactory.createMITargetSelectCore(fCommandControl.getContext(), newCoreFile),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
}
}
}).schedule();
} else {
fCommandControl.queueCommand(
new MITargetSelectCore(fCommandControl.getContext(), coreFile),
fCommandFactory.createMITargetSelectCore(fCommandControl.getContext(), coreFile),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
}
} catch (CoreException e) {
@ -478,14 +470,14 @@ public class FinalLaunchSequence extends Sequence {
if (!getTcpPort(requestMonitor)) return;
fCommandControl.queueCommand(
new MITargetSelect(fCommandControl.getContext(),
fCommandFactory.createMITargetSelect(fCommandControl.getContext(),
fRemoteTcpHost, fRemoteTcpPort, fAttach),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
} else {
if (!getSerialDevice(requestMonitor)) return;
fCommandControl.queueCommand(
new MITargetSelect(fCommandControl.getContext(),
fCommandFactory.createMITargetSelect(fCommandControl.getContext(),
fSerialDevice, fAttach),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
}
@ -594,6 +586,7 @@ public class FinalLaunchSequence extends Sequence {
private IGDBControl fCommandControl;
private IGDBBackend fGDBBackend;
private IMIProcesses fProcService;
private CommandFactory fCommandFactory;
DsfServicesTracker fTracker;

View file

@ -23,13 +23,11 @@ import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IBreakpoints;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIRunControl;
import org.eclipse.cdt.dsf.mi.service.MIBreakpointDMData;
import org.eclipse.cdt.dsf.mi.service.MIBreakpoints;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIPasscount;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLITrace;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakInsert;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakList;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.CLITraceInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakListInfo;
@ -49,6 +47,7 @@ public class GDBBreakpoints_7_0 extends MIBreakpoints
{
private ICommandControl fConnection;
private IMIRunControl fRunControl;
private CommandFactory fCommandFactory;
public GDBBreakpoints_7_0(DsfSession session) {
super(session);
@ -71,6 +70,7 @@ public class GDBBreakpoints_7_0 extends MIBreakpoints
// Get the services references
fConnection = getServicesTracker().getService(ICommandControl.class);
fRunControl = getServicesTracker().getService(IMIRunControl.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
// Register this service
register(new String[] { IBreakpoints.class.getName(),
@ -130,7 +130,7 @@ public class GDBBreakpoints_7_0 extends MIBreakpoints
public void execute(final RequestMonitor rm) {
// Execute the command
fConnection.queueCommand(
new MIBreakInsert(context, isTemporary, isHardware, condition, ignoreCount, location, tid, !enabled, false),
fCommandFactory.createMIBreakInsert(context, isTemporary, isHardware, condition, ignoreCount, location, tid, !enabled, false),
new DataRequestMonitor<MIBreakInsertInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -203,7 +203,7 @@ public class GDBBreakpoints_7_0 extends MIBreakpoints
final String condition = (String) getProperty(attributes, MIBreakpoints.CONDITION, NULL_STRING);
fConnection.queueCommand(
new CLITrace(context, location, condition),
fCommandFactory.createCLITrace(context, location, condition),
new DataRequestMonitor<CLITraceInfo>(getExecutor(), drm) {
@Override
protected void handleSuccess() {
@ -217,7 +217,7 @@ public class GDBBreakpoints_7_0 extends MIBreakpoints
// The simplest way to convert from the CLITraceInfo to a MIBreakInsertInfo
// is to list the breakpoints and take the proper output
fConnection.queueCommand(
new MIBreakList(context),
fCommandFactory.createMIBreakList(context),
new DataRequestMonitor<MIBreakListInfo>(getExecutor(), drm) {
@Override
protected void handleSuccess() {
@ -420,7 +420,7 @@ public class GDBBreakpoints_7_0 extends MIBreakpoints
// Queue the command
fConnection.queueCommand(
new CLIPasscount(context, reference, ignoreCount),
fCommandFactory.createCLIPasscount(context, reference, ignoreCount),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {

View file

@ -42,15 +42,13 @@ import org.eclipse.cdt.dsf.debug.service.command.IEventListener;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIContainerDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIProcessDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIListThreadGroups;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetAttach;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetDetach;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIThreadInfo;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadGroupCreatedEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadGroupExitedEvent;
import org.eclipse.cdt.dsf.mi.service.command.output.MIConst;
@ -374,7 +372,8 @@ public class GDBProcesses_7_0 extends AbstractDsfService
private IGDBControl fCommandControl;
private IGDBBackend fBackend;
private CommandFactory fCommandFactory;
// A cache for commands about the threadGroups
private CommandCache fContainerCommandCache;
@ -434,6 +433,8 @@ public class GDBProcesses_7_0 extends AbstractDsfService
fBackend = getServicesTracker().getService(IGDBBackend.class);
BufferedCommandControl bufferedCommandControl = new BufferedCommandControl(fCommandControl, getExecutor(), 2);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
// These caches store the result of a command when received; also, these caches
// are manipulated when receiving events. Currently, events are received after
// three scheduling of the executor, while command results after only one. This
@ -581,7 +582,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService
final MIThreadDMC threadDmc = (MIThreadDMC)dmc;
ICommandControlDMContext controlDmc = DMContexts.getAncestorOfType(dmc, ICommandControlDMContext.class);
fThreadCommandCache.execute(new MIThreadInfo(controlDmc, threadDmc.getId()),
fThreadCommandCache.execute(fCommandFactory.createMIThreadInfo(controlDmc, threadDmc.getId()),
new DataRequestMonitor<MIThreadInfoInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -646,7 +647,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService
ICommandControlDMContext controlDmc = DMContexts.getAncestorOfType(procCtx, ICommandControlDMContext.class);
fCommandControl.queueCommand(
new MITargetAttach(controlDmc, ((IMIProcessDMContext)procCtx).getProcId()),
fCommandFactory.createMITargetAttach(controlDmc, ((IMIProcessDMContext)procCtx).getProcId()),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -689,7 +690,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService
}
fCommandControl.queueCommand(
new MITargetDetach(controlDmc, procDmc.getProcId()),
fCommandFactory.createMITargetDetach(controlDmc, procDmc.getProcId()),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
} else {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INTERNAL_ERROR, "Invalid context.", null)); //$NON-NLS-1$
@ -719,7 +720,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService
final IMIContainerDMContext containerDmc = DMContexts.getAncestorOfType(dmc, IMIContainerDMContext.class);
if (containerDmc != null) {
fThreadCommandCache.execute(
new MIListThreadGroups(controlDmc, containerDmc.getGroupId()),
fCommandFactory.createMIListThreadGroups(controlDmc, containerDmc.getGroupId()),
new DataRequestMonitor<MIListThreadGroupsInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -767,7 +768,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService
if (controlDmc != null) {
fListThreadGroupsAvailableCache.execute(
new MIListThreadGroups(controlDmc, true),
fCommandFactory.createMIListThreadGroups(controlDmc, true),
new DataRequestMonitor<MIListThreadGroupsInfo>(getExecutor(), rm) {
@Override
protected void handleCompleted() {
@ -937,7 +938,7 @@ public class GDBProcesses_7_0 extends AbstractDsfService
// GDB is debugging a new process. Let's fetch its name and remember it.
final String finalGroupId = groupId;
fListThreadGroupsAvailableCache.execute(
new MIListThreadGroups(fCommandControl.getContext(), true),
fCommandFactory.createMIListThreadGroups(fCommandControl.getContext(), true),
new DataRequestMonitor<MIListThreadGroupsInfo>(getExecutor(), null) {
@Override
protected void handleCompleted() {

View file

@ -29,14 +29,13 @@ import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContex
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
import org.eclipse.cdt.dsf.mi.service.IMIRunControl;
import org.eclipse.cdt.dsf.mi.service.MIRunControl;
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.MIBreakInsert;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecContinue;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.events.MIBreakpointHitEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIInferiorExitEvent;
@ -76,7 +75,8 @@ public class GDBRunControl extends MIRunControl {
private IGDBBackend fGdb;
private IMIProcesses fProcService;
private CommandFactory fCommandFactory;
// Record list of execution contexts
private IExecutionDMContext[] fOldExecutionCtxts;
@ -101,6 +101,7 @@ public class GDBRunControl extends MIRunControl {
fGdb = getServicesTracker().getService(IGDBBackend.class);
fProcService = getServicesTracker().getService(IMIProcesses.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
register(new String[]{IRunControl.class.getName(),
IRunControl2.class.getName(),
@ -274,7 +275,7 @@ public class GDBRunControl extends MIRunControl {
if (doCanResume(dmc)) {
IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(context, IBreakpointsTargetDMContext.class);
getConnection().queueCommand(
new MIBreakInsert(bpDmc, true, false, null, 0,
fCommandFactory.createMIBreakInsert(bpDmc, true, false, null, 0,
location, dmc.getThreadId()),
new DataRequestMonitor<MIBreakInsertInfo>(getExecutor(), rm) {
@Override
@ -292,7 +293,7 @@ public class GDBRunControl extends MIRunControl {
IBreakpointsTargetDMContext.class);
int bpId = fRunToLineActiveOperation.getBreakointId();
getConnection().queueCommand(new MIBreakDelete(bpDmc, new int[] {bpId}),
getConnection().queueCommand(fCommandFactory.createMIBreakDelete(bpDmc, new int[] {bpId}),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
fRunToLineActiveOperation = null;
@ -321,7 +322,7 @@ public class GDBRunControl extends MIRunControl {
IBreakpointsTargetDMContext.class);
int bpId = fRunToLineActiveOperation.getBreakointId();
getConnection().queueCommand(new MIBreakDelete(bpDmc, new int[] {bpId}),
getConnection().queueCommand(fCommandFactory.createMIBreakDelete(bpDmc, new int[] {bpId}),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
fRunToLineActiveOperation = null;
}
@ -358,7 +359,7 @@ public class GDBRunControl extends MIRunControl {
// Didn't stop at the right place yet
if (fRunToLineActiveOperation.shouldSkipBreakpoints() && e instanceof MIBreakpointHitEvent) {
getConnection().queueCommand(
new MIExecContinue(fRunToLineActiveOperation.getThreadContext()),
fCommandFactory.createMIExecContinue(fRunToLineActiveOperation.getThreadContext()),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
// Don't send the stop event since we are resuming again.
@ -375,7 +376,7 @@ public class GDBRunControl extends MIRunControl {
IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(fRunToLineActiveOperation.getThreadContext(),
IBreakpointsTargetDMContext.class);
getConnection().queueCommand(new MIBreakDelete(bpDmc, new int[] {fRunToLineActiveOperation.getBreakointId()}),
getConnection().queueCommand(fCommandFactory.createMIBreakDelete(bpDmc, new int[] {fRunToLineActiveOperation.getBreakointId()}),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
fRunToLineActiveOperation = null;
}

View file

@ -27,25 +27,16 @@ import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContex
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext;
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
import org.eclipse.cdt.dsf.mi.service.IMIRunControl;
import org.eclipse.cdt.dsf.mi.service.MIRunControl;
import org.eclipse.cdt.dsf.mi.service.MIStack;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIRecord;
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.MICommand;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecContinue;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecJump;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReverseContinue;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReverseNext;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReverseNextInstruction;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReverseStep;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReverseStepInstruction;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecUncall;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.events.MIBreakpointHitEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIInferiorExitEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIStoppedEvent;
@ -83,6 +74,8 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
private IGDBBackend fGdb;
private IMIProcesses fProcService;
private CommandFactory fCommandFactory;
private boolean fReverseSupported = true;
private boolean fReverseStepping = false;
private boolean fReverseModeEnabled = false;
@ -107,6 +100,7 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
fGdb = getServicesTracker().getService(IGDBBackend.class);
fProcService = getServicesTracker().getService(IMIProcesses.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
if (fGdb.getSessionType() == SessionType.CORE) {
// No execution for core files, so no support for reverse
@ -299,9 +293,9 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
/** @since 2.0 */
public void reverseResume(final IExecutionDMContext context, final RequestMonitor rm) {
if (fReverseModeEnabled && doCanResume(context)) {
MIExecReverseContinue cmd = null;
ICommand<MIInfo> cmd = null;
if (context instanceof IContainerDMContext) {
cmd = new MIExecReverseContinue(context);
cmd = fCommandFactory.createMIExecReverseContinue(context);
} else {
IMIExecutionDMContext dmc = DMContexts.getAncestorOfType(context, IMIExecutionDMContext.class);
if (dmc == null){
@ -309,7 +303,7 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
rm.done();
return;
}
cmd = new MIExecReverseContinue(dmc);
cmd = fCommandFactory.createMIExecReverseContinue(dmc);
}
setResumePending(true);
@ -349,13 +343,13 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
return;
}
MICommand<MIInfo> cmd = null;
ICommand<MIInfo> cmd = null;
switch(stepType) {
case STEP_INTO:
cmd = new MIExecReverseStep(dmc, 1);
cmd = fCommandFactory.createMIExecReverseStep(dmc, 1);
break;
case STEP_OVER:
cmd = new MIExecReverseNext(dmc, 1);
cmd = fCommandFactory.createMIExecReverseNext(dmc, 1);
break;
case STEP_RETURN:
// The -exec-finish command operates on the selected stack frame, but here we always
@ -367,7 +361,7 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
MIStack stackService = getServicesTracker().getService(MIStack.class);
if (stackService != null) {
IFrameDMContext topFrameDmc = stackService.createFrameDMContext(dmc, 0);
cmd = new MIExecUncall(topFrameDmc);
cmd = fCommandFactory.createMIExecUncall(topFrameDmc);
} else {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED, "Cannot create context for command, stack service not available.", null)); //$NON-NLS-1$
rm.done();
@ -375,10 +369,10 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
}
break;
case INSTRUCTION_STEP_INTO:
cmd = new MIExecReverseStepInstruction(dmc, 1);
cmd = fCommandFactory.createMIExecReverseStepInstruction(dmc, 1);
break;
case INSTRUCTION_STEP_OVER:
cmd = new MIExecReverseNextInstruction(dmc, 1);
cmd = fCommandFactory.createMIExecReverseNextInstruction(dmc, 1);
break;
default:
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INTERNAL_ERROR, "Given step type not supported", null)); //$NON-NLS-1$
@ -426,7 +420,7 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
}
getConnection().queueCommand(
new CLIRecord(context, enable),
fCommandFactory.createCLIRecord(context, enable),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
public void handleSuccess() {
@ -452,7 +446,7 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
if (doCanResume(dmc)) {
IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(context, IBreakpointsTargetDMContext.class);
getConnection().queueCommand(
new MIBreakInsert(bpDmc, true, false, null, 0,
fCommandFactory.createMIBreakInsert(bpDmc, true, false, null, 0,
location, dmc.getThreadId()),
new DataRequestMonitor<MIBreakInsertInfo>(getExecutor(), rm) {
@Override
@ -470,7 +464,7 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
IBreakpointsTargetDMContext.class);
int bpId = fRunToLineActiveOperation.getBreakointId();
getConnection().queueCommand(new MIBreakDelete(bpDmc, new int[] {bpId}),
getConnection().queueCommand(fCommandFactory.createMIBreakDelete(bpDmc, new int[] {bpId}),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
fRunToLineActiveOperation = null;
@ -502,7 +496,7 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
setResumePending(true);
getCache().setContextAvailable(dmc, false);
getConnection().queueCommand(
new MIExecJump(dmc, location),
fCommandFactory.createMIExecJump(dmc, location),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleFailure() {
@ -532,7 +526,7 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
IBreakpointsTargetDMContext.class);
int bpId = fRunToLineActiveOperation.getBreakointId();
getConnection().queueCommand(new MIBreakDelete(bpDmc, new int[] {bpId}),
getConnection().queueCommand(fCommandFactory.createMIBreakDelete(bpDmc, new int[] {bpId}),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
fRunToLineActiveOperation = null;
}
@ -569,7 +563,7 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
// Didn't stop at the right place yet
if (fRunToLineActiveOperation.shouldSkipBreakpoints() && e instanceof MIBreakpointHitEvent) {
getConnection().queueCommand(
new MIExecContinue(fRunToLineActiveOperation.getThreadContext()),
fCommandFactory.createMIExecContinue(fRunToLineActiveOperation.getThreadContext()),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
// Don't send the stop event since we are resuming again.
@ -586,7 +580,7 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro
IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(fRunToLineActiveOperation.getThreadContext(),
IBreakpointsTargetDMContext.class);
getConnection().queueCommand(new MIBreakDelete(bpDmc, new int[] {fRunToLineActiveOperation.getBreakointId()}),
getConnection().queueCommand(fCommandFactory.createMIBreakDelete(bpDmc, new int[] {fRunToLineActiveOperation.getBreakointId()}),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
fRunToLineActiveOperation = null;
}

View file

@ -37,9 +37,11 @@ import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContex
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext;
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlShutdownDMEvent;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIContainerDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
@ -48,17 +50,7 @@ import org.eclipse.cdt.dsf.mi.service.MIBreakpointDMData;
import org.eclipse.cdt.dsf.mi.service.MIBreakpoints;
import org.eclipse.cdt.dsf.mi.service.MIRunControl;
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.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.MIExecFinish;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecInterrupt;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecJump;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecNext;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecNextInstruction;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecStep;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecStepInstruction;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.events.IMIDMEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIBreakpointHitEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIErrorEvent;
@ -239,7 +231,8 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
///////////////////////////////////////////////////////////////////////////
private ICommandControlService fConnection;
private CommandFactory fCommandFactory;
private boolean fTerminated = false;
// ThreadStates indexed by the execution context
@ -277,6 +270,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
private void doInitialize(final RequestMonitor rm) {
register(new String[]{IRunControl.class.getName(), IMIRunControl.class.getName()}, new Hashtable<String,String>());
fConnection = getServicesTracker().getService(ICommandControlService.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
getSession().addServiceEventListener(this, null);
rm.done();
}
@ -391,14 +385,12 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
return;
}
MIExecInterrupt cmd = new MIExecInterrupt(context);
fConnection.queueCommand(cmd, new DataRequestMonitor<MIInfo>(getExecutor(), rm));
fConnection.queueCommand(fCommandFactory.createMIExecInterrupt(context), new DataRequestMonitor<MIInfo>(getExecutor(), rm));
}
private void doSuspendContainer(IMIContainerDMContext context, final RequestMonitor rm) {
String groupId = context.getGroupId();
MIExecInterrupt cmd = new MIExecInterrupt(context, groupId);
fConnection.queueCommand(cmd, new DataRequestMonitor<MIInfo>(getExecutor(), rm));
fConnection.queueCommand(fCommandFactory.createMIExecInterrupt(context, groupId), new DataRequestMonitor<MIInfo>(getExecutor(), rm));
}
// ------------------------------------------------------------------------
@ -478,8 +470,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
}
threadState.fResumePending = true;
MIExecContinue cmd = new MIExecContinue(context);
fConnection.queueCommand(cmd, new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
fConnection.queueCommand(fCommandFactory.createMIExecContinue(context), new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleFailure() {
threadState.fResumePending = false;
@ -490,8 +481,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
private void doResumeContainer(IMIContainerDMContext context, final RequestMonitor rm) {
String groupId = context.getGroupId();
MIExecContinue cmd = new MIExecContinue(context, groupId);
fConnection.queueCommand(cmd, new DataRequestMonitor<MIInfo>(getExecutor(), rm));
fConnection.queueCommand(fCommandFactory.createMIExecContinue(context, groupId), new DataRequestMonitor<MIInfo>(getExecutor(), rm));
}
// ------------------------------------------------------------------------
@ -572,13 +562,13 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
return;
}
MICommand<MIInfo> cmd = null;
ICommand<MIInfo> cmd = null;
switch (stepType) {
case STEP_INTO:
cmd = new MIExecStep(dmc);
cmd = fCommandFactory.createMIExecStep(dmc);
break;
case STEP_OVER:
cmd = new MIExecNext(dmc);
cmd = fCommandFactory.createMIExecNext(dmc);
break;
case STEP_RETURN:
// The -exec-finish command operates on the selected stack frame, but here we always
@ -590,7 +580,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
MIStack stackService = getServicesTracker().getService(MIStack.class);
if (stackService != null) {
IFrameDMContext topFrameDmc = stackService.createFrameDMContext(dmc, 0);
cmd = new MIExecFinish(topFrameDmc);
cmd = fCommandFactory.createMIExecFinish(topFrameDmc);
} else {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED,
"Cannot create context for command, stack service not available.", null)); //$NON-NLS-1$
@ -599,10 +589,10 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
}
break;
case INSTRUCTION_STEP_INTO:
cmd = new MIExecStepInstruction(dmc);
cmd = fCommandFactory.createMIExecStepInstruction(dmc);
break;
case INSTRUCTION_STEP_OVER:
cmd = new MIExecNextInstruction(dmc);
cmd = fCommandFactory.createMIExecNextInstruction(dmc);
break;
default:
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID,
@ -658,7 +648,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(context, IBreakpointsTargetDMContext.class);
fConnection.queueCommand(
new MIBreakInsert(bpDmc, true, false, null, 0,
fCommandFactory.createMIBreakInsert(bpDmc, true, false, null, 0,
location, dmc.getThreadId()),
new DataRequestMonitor<MIBreakInsertInfo>(getExecutor(), rm) {
@Override
@ -676,7 +666,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
IBreakpointsTargetDMContext.class);
int bpId = fRunToLineActiveOperation.getBreakointId();
fConnection.queueCommand(new MIBreakDelete(bpDmc, new int[] {bpId}),
fConnection.queueCommand(fCommandFactory.createMIBreakDelete(bpDmc, new int[] {bpId}),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
fRunToLineActiveOperation = null;
@ -721,7 +711,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
threadState.fResumePending = true;
fConnection.queueCommand(
new MIExecJump(dmc, location),
fCommandFactory.createMIExecJump(dmc, location),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleFailure() {
@ -938,7 +928,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
// Can't use the resume() call because we 'silently' stopped
// so resume() will not know we are actually stopped
fConnection.queueCommand(
new MIExecContinue(fExecutionDmcToSuspend),
fCommandFactory.createMIExecContinue(fExecutionDmcToSuspend),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
} else {
// We didn't suspend the thread, so we don't need to resume it
@ -1004,7 +994,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
// The right thread stopped but not at the right place yet
if (fRunToLineActiveOperation.shouldSkipBreakpoints() && e instanceof MIBreakpointHitEvent) {
fConnection.queueCommand(
new MIExecContinue(fRunToLineActiveOperation.getThreadContext()),
fCommandFactory.createMIExecContinue(fRunToLineActiveOperation.getThreadContext()),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
// Don't send the stop event since we are resuming again.
@ -1019,7 +1009,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(fRunToLineActiveOperation.getThreadContext(),
IBreakpointsTargetDMContext.class);
fConnection.queueCommand(new MIBreakDelete(bpDmc, new int[] {fRunToLineActiveOperation.getBreakointId()}),
fConnection.queueCommand(fCommandFactory.createMIBreakDelete(bpDmc, new int[] {fRunToLineActiveOperation.getBreakointId()}),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
fRunToLineActiveOperation = null;
}
@ -1136,7 +1126,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
IBreakpointsTargetDMContext.class);
int bpId = fRunToLineActiveOperation.getBreakointId();
fConnection.queueCommand(new MIBreakDelete(bpDmc, new int[] {bpId}),
fConnection.queueCommand(fCommandFactory.createMIBreakDelete(bpDmc, new int[] {bpId}),
new DataRequestMonitor<MIInfo>(getExecutor(), null));
fRunToLineActiveOperation = null;
}

View file

@ -20,13 +20,8 @@ import org.eclipse.cdt.dsf.debug.service.ICachingService;
import org.eclipse.cdt.dsf.debug.service.command.CommandCache;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetSelectTFile;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceDefineVariable;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceListVariables;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceSave;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceStart;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceStatus;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceStop;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MITraceListVariablesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MITraceStatusInfo;
@ -318,6 +313,8 @@ public class GDBTraceControl_7_1 extends AbstractDsfService implements IGDBTrace
private CommandCache fTraceCache;
private ICommandControlService fConnection;
private CommandFactory fCommandFactory;
// private ITraceRecordDMContext fCurrentRecordDmc = null;
private boolean fIsTracingActive = false;
@ -367,6 +364,8 @@ public class GDBTraceControl_7_1 extends AbstractDsfService implements IGDBTrace
fTraceCache = new CommandCache(getSession(), fConnection);
fTraceCache.setContextAvailable(fConnection.getContext(), true);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
requestMonitor.done();
}
@ -420,7 +419,7 @@ public class GDBTraceControl_7_1 extends AbstractDsfService implements IGDBTrace
}
fConnection.queueCommand(
new MITraceStart(context),
fCommandFactory.createMITraceStart(context),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -460,7 +459,7 @@ public class GDBTraceControl_7_1 extends AbstractDsfService implements IGDBTrace
}
fConnection.queueCommand(
new MITraceStop(context),
fCommandFactory.createMITraceStop(context),
new DataRequestMonitor<MITraceStopInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -517,7 +516,7 @@ public class GDBTraceControl_7_1 extends AbstractDsfService implements IGDBTrace
}
fConnection.queueCommand(
new MITraceSave(context, file, remoteSave),
fCommandFactory.createMITraceSave(context, file, remoteSave),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
}
@ -540,7 +539,7 @@ public class GDBTraceControl_7_1 extends AbstractDsfService implements IGDBTrace
}
fConnection.queueCommand(
new MITargetSelectTFile(context, file),
fCommandFactory.createMITargetSelectTFile(context, file),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
}
@ -552,7 +551,7 @@ public class GDBTraceControl_7_1 extends AbstractDsfService implements IGDBTrace
}
fConnection.queueCommand(
new MITraceStatus(context),
fCommandFactory.createMITraceStatus(context),
new DataRequestMonitor<MITraceStatusInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -612,11 +611,11 @@ public class GDBTraceControl_7_1 extends AbstractDsfService implements IGDBTrace
if (varValue == null) {
fConnection.queueCommand(
new MITraceDefineVariable(context, varName),
fCommandFactory.createMITraceDefineVariable(context, varName),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
} else {
fConnection.queueCommand(
new MITraceDefineVariable(context, varName, varValue),
fCommandFactory.createMITraceDefineVariable(context, varName, varValue),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
}
}
@ -632,7 +631,7 @@ public class GDBTraceControl_7_1 extends AbstractDsfService implements IGDBTrace
// It may be possible to cache this call, if we can figure out that all the cases
// where to data can change, to clear the cache in those cases
fConnection.queueCommand(
new MITraceListVariables(context),
fCommandFactory.createMITraceListVariables(context),
new DataRequestMonitor<MITraceListVariablesInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {

View file

@ -36,6 +36,7 @@ import org.eclipse.cdt.dsf.mi.service.MIMemory;
import org.eclipse.cdt.dsf.mi.service.MIModules;
import org.eclipse.cdt.dsf.mi.service.MIRegisters;
import org.eclipse.cdt.dsf.mi.service.MIStack;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.debug.core.ILaunchConfiguration;
@ -96,9 +97,9 @@ public class GdbDebugServicesFactory extends AbstractDsfDebugServicesFactory {
protected ICommandControl createCommandControl(DsfSession session, ILaunchConfiguration config) {
if (GDB_7_0_VERSION.compareTo(fVersion) <= 0) {
return new GDBControl_7_0(session, config);
return new GDBControl_7_0(session, config, new CommandFactory());
}
return new GDBControl(session, config);
return new GDBControl(session, config, new CommandFactory());
}
protected IMIBackend createBackendGDBService(DsfSession session, ILaunchConfiguration lc) {

View file

@ -31,6 +31,7 @@ import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.datamodel.AbstractDMEvent;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.IGdbDebugPreferenceConstants;
@ -39,6 +40,7 @@ import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
import org.eclipse.cdt.dsf.gdb.service.SessionType;
import org.eclipse.cdt.dsf.mi.service.IMIBackend;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
import org.eclipse.cdt.dsf.mi.service.IMIBackend.BackendStateChangedEvent;
@ -47,18 +49,11 @@ import org.eclipse.cdt.dsf.mi.service.MIProcesses.ContainerStartedDMEvent;
import org.eclipse.cdt.dsf.mi.service.command.AbstractCLIProcess;
import org.eclipse.cdt.dsf.mi.service.command.AbstractMIControl;
import org.eclipse.cdt.dsf.mi.service.command.CLIEventProcessor;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.MIControlDMContext;
import org.eclipse.cdt.dsf.mi.service.command.MIInferiorProcess;
import org.eclipse.cdt.dsf.mi.service.command.MIRunControlEventProcessor;
import org.eclipse.cdt.dsf.mi.service.command.MIInferiorProcess.State;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIUnsetEnv;
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.MIExecRun;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBExit;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetEnv;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIInferiorTTYSet;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
@ -117,8 +112,11 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
private PTY fPty;
public GDBControl(DsfSession session, ILaunchConfiguration config) {
super(session, false);
/**
* @since 3.0
*/
public GDBControl(DsfSession session, ILaunchConfiguration config, CommandFactory factory) {
super(session, false, factory);
}
@Override
@ -219,7 +217,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
2, TimeUnit.SECONDS);
queueCommand(
new MIGDBExit(fControlDmc),
getCommandFactory().createMIGDBExit(fControlDmc),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
public void handleCompleted() {
@ -254,7 +252,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
// Tell GDB to use this PTY
queueCommand(
new MIInferiorTTYSet(fControlDmc, fPty.getSlaveName()),
getCommandFactory().createMIInferiorTTYSet(fControlDmc, fPty.getSlaveName()),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
@Override
protected void handleFailure() {
@ -320,12 +318,12 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
IProcessDMContext procDmc = procService.createProcessContext(fControlDmc, MIProcesses.UNIQUE_GROUP_ID);
final IContainerDMContext containerDmc = procService.createContainerContext(procDmc, MIProcesses.UNIQUE_GROUP_ID);
final MICommand<MIInfo> execCommand;
final ICommand<MIInfo> execCommand;
if (fMIBackend.getSessionType() == SessionType.REMOTE) {
// When doing remote debugging, we use -exec-continue instead of -exec-run
execCommand = new MIExecContinue(containerDmc);
execCommand = getCommandFactory().createMIExecContinue(containerDmc);
} else {
execCommand = new MIExecRun(containerDmc, new String[0]);
execCommand = getCommandFactory().createMIExecRun(containerDmc, new String[0]);
}
boolean stopInMain = false;
@ -365,7 +363,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
// Insert a breakpoint at the requested stop symbol.
queueCommand(
new MIBreakInsert(fControlDmc, true, false, null, 0, stopSymbol, 0),
getCommandFactory().createMIBreakInsert(fControlDmc, true, false, null, 0, stopSymbol, 0),
new DataRequestMonitor<MIBreakInsertInfo>(getExecutor(), requestMonitor) {
@Override
protected void handleSuccess() {
@ -420,7 +418,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
if (clear) {
count++;
queueCommand(
new CLIUnsetEnv(getContext()),
getCommandFactory().createCLIUnsetEnv(getContext()),
new DataRequestMonitor<MIInfo>(getExecutor(), countingRm));
}
@ -430,7 +428,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
String name = (String)property.getKey();
String value = (String)property.getValue();
queueCommand(
new MIGDBSetEnv(getContext(), name, value),
getCommandFactory().createMIGDBSetEnv(getContext(), name, value),
new DataRequestMonitor<MIInfo>(getExecutor(), countingRm));
}
countingRm.setDoneCount(count);
@ -564,6 +562,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
register(
new String[]{ ICommandControl.class.getName(),
ICommandControlService.class.getName(),
IMICommandControl.class.getName(),
AbstractMIControl.class.getName(),
IGDBControl.class.getName() },
new Hashtable<String,String>());

View file

@ -31,6 +31,7 @@ import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.datamodel.AbstractDMEvent;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
@ -44,24 +45,18 @@ import org.eclipse.cdt.dsf.gdb.service.SessionType;
import org.eclipse.cdt.dsf.gdb.service.GDBProcesses_7_0.ContainerExitedDMEvent;
import org.eclipse.cdt.dsf.gdb.service.GDBProcesses_7_0.ContainerStartedDMEvent;
import org.eclipse.cdt.dsf.mi.service.IMIBackend;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
import org.eclipse.cdt.dsf.mi.service.IMIBackend.BackendStateChangedEvent;
import org.eclipse.cdt.dsf.mi.service.command.AbstractCLIProcess;
import org.eclipse.cdt.dsf.mi.service.command.AbstractMIControl;
import org.eclipse.cdt.dsf.mi.service.command.CLIEventProcessor_7_0;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.MIControlDMContext;
import org.eclipse.cdt.dsf.mi.service.command.MIInferiorProcess;
import org.eclipse.cdt.dsf.mi.service.command.MIRunControlEventProcessor_7_0;
import org.eclipse.cdt.dsf.mi.service.command.MIInferiorProcess.State;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIUnsetEnv;
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.MIExecRun;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBExit;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetEnv;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIInferiorTTYSet;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakpoint;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
@ -120,8 +115,11 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
private PTY fPty;
public GDBControl_7_0(DsfSession session, ILaunchConfiguration config) {
super(session, true);
/**
* @since 3.0
*/
public GDBControl_7_0(DsfSession session, ILaunchConfiguration config, CommandFactory factory) {
super(session, true, factory);
}
@Override
@ -221,7 +219,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
2, TimeUnit.SECONDS);
queueCommand(
new MIGDBExit(fControlDmc),
getCommandFactory().createMIGDBExit(fControlDmc),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
public void handleCompleted() {
@ -256,7 +254,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
// Tell GDB to use this PTY
queueCommand(
new MIInferiorTTYSet(fControlDmc, fPty.getSlaveName()),
getCommandFactory().createMIInferiorTTYSet(fControlDmc, fPty.getSlaveName()),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor) {
@Override
protected void handleFailure() {
@ -343,7 +341,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
// so let's use a sequence.
getExecutor().execute(new Sequence(getExecutor(), requestMonitor) {
IContainerDMContext fContainerDmc;
MICommand<MIInfo> fExecCommand;
ICommand<MIInfo> fExecCommand;
String fUserStopSymbol = null;
MIBreakpoint fUserBreakpoint = null;
@ -364,9 +362,9 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
// Restart does not apply to remote sessions
//
// When doing remote debugging, we use -exec-continue instead of -exec-run
fExecCommand = new MIExecContinue(fContainerDmc);
fExecCommand = getCommandFactory().createMIExecContinue(fContainerDmc);
} else {
fExecCommand = new MIExecRun(fContainerDmc, new String[0]);
fExecCommand = getCommandFactory().createMIExecRun(fContainerDmc, new String[0]);
}
rm.done();
}},
@ -399,7 +397,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
return;
}
queueCommand(new MIBreakInsert(fControlDmc, true, false, null, 0, fUserStopSymbol, 0),
queueCommand(getCommandFactory().createMIBreakInsert(fControlDmc, true, false, null, 0, fUserStopSymbol, 0),
new DataRequestMonitor<MIBreakInsertInfo>(getExecutor(), rm) {
@Override
public void handleSuccess() {
@ -426,7 +424,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
@Override
public void execute(final RequestMonitor rm) {
if (reverseEnabled) {
queueCommand(new MIBreakInsert(fControlDmc, true, false, null, 0,
queueCommand(getCommandFactory().createMIBreakInsert(fControlDmc, true, false, null, 0,
ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT, 0),
new DataRequestMonitor<MIBreakInsertInfo>(getExecutor(), rm) {
@Override
@ -491,7 +489,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
@Override
public void execute(RequestMonitor rm) {
if (reverseEnabled && !fUserBreakpointIsOnMain) {
queueCommand(new MIExecContinue(fContainerDmc),
queueCommand(getCommandFactory().createMIExecContinue(fContainerDmc),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
} else {
rm.done();
@ -554,7 +552,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
if (clear) {
count++;
queueCommand(
new CLIUnsetEnv(getContext()),
getCommandFactory().createCLIUnsetEnv(getContext()),
new DataRequestMonitor<MIInfo>(getExecutor(), countingRm));
}
@ -564,7 +562,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
String name = (String)property.getKey();
String value = (String)property.getValue();
queueCommand(
new MIGDBSetEnv(getContext(), name, value),
getCommandFactory().createMIGDBSetEnv(getContext(), name, value),
new DataRequestMonitor<MIInfo>(getExecutor(), countingRm));
}
countingRm.setDoneCount(count);
@ -711,7 +709,8 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
getSession().addServiceEventListener(GDBControl_7_0.this, null);
register(
new String[]{ ICommandControl.class.getName(),
ICommandControlService.class.getName(),
ICommandControlService.class.getName(),
IMICommandControl.class.getName(),
AbstractMIControl.class.getName(),
IGDBControl.class.getName() },
new Hashtable<String,String>());

View file

@ -14,12 +14,12 @@ import java.io.OutputStream;
import java.util.Properties;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.command.AbstractCLIProcess;
import org.eclipse.cdt.dsf.mi.service.command.MIInferiorProcess;
public interface IGDBControl extends ICommandControlService {
public interface IGDBControl extends IMICommandControl {
void terminate(final RequestMonitor rm);
void initInferiorInputOutput(final RequestMonitor requestMonitor);

View file

@ -0,0 +1,33 @@
/*******************************************************************************
* Copyright (c) 2010 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Ericsson - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.service.macos;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.commands.macos.MacOSMIEnvironmentCD;
import org.eclipse.cdt.dsf.mi.service.command.commands.macos.MacOSMIVarUpdate;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarUpdateInfo;
/** @since 3.0 */
public class MacOSCommandFactory extends CommandFactory {
@Override
public ICommand<MIInfo> createMIEnvironmentCD(ICommandControlDMContext ctx, String path) {
return new MacOSMIEnvironmentCD(ctx, path);
}
@Override
public ICommand<MIVarUpdateInfo> createMIVarUpdate(ICommandControlDMContext dmc, String name) {
return new MacOSMIVarUpdate(dmc, name);
}
}

View file

@ -1,32 +0,0 @@
/*******************************************************************************
* Copyright (c) 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.service.macos;
import org.eclipse.cdt.dsf.mi.service.MIExpressions;
import org.eclipse.cdt.dsf.mi.service.MIVariableManager;
import org.eclipse.cdt.dsf.service.DsfSession;
/**
* Specific ExpressionService for MacOS
*
* @since 3.0
*/
public class MacOSGDBExpressions extends MIExpressions {
public MacOSGDBExpressions(DsfSession session) {
super(session);
}
@Override
protected MIVariableManager createMIVariableManager() {
return new MacOSGDBVariableManager(getSession(), getServicesTracker());
}
}

View file

@ -11,13 +11,20 @@
package org.eclipse.cdt.dsf.gdb.service.macos;
import java.util.Hashtable;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.debug.service.IRunControl;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.gdb.service.GDBRunControl;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecInterrupt;
import org.eclipse.cdt.dsf.mi.service.IMIRunControl;
import org.eclipse.cdt.dsf.mi.service.MIRunControl;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.core.runtime.IStatus;
@ -26,9 +33,40 @@ import org.eclipse.core.runtime.Status;
/** @since 3.0 */
public class MacOSGDBRunControl extends GDBRunControl {
private CommandFactory fCommandFactory;
public MacOSGDBRunControl(DsfSession session) {
super(session);
}
@Override
public void initialize(final RequestMonitor requestMonitor) {
super.initialize(new RequestMonitor(getExecutor(), requestMonitor) {
@Override
protected void handleSuccess() {
doInitialize(requestMonitor);
}
});
}
private void doInitialize(RequestMonitor requestMonitor) {
// Register this service.
register(new String[]{ IRunControl.class.getName(),
IMIRunControl.class.getName(),
MIRunControl.class.getName(),
GDBRunControl.class.getName(),
MacOSGDBRunControl.class.getName() },
new Hashtable<String,String>());
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
requestMonitor.done();
}
@Override
public void shutdown(RequestMonitor requestMonitor) {
super.shutdown(requestMonitor);
}
// We use the MIControl code since -exec-interrupt works with Apple gdb
// but SIGINT does not; it seems it runs in async mode by default
@ -42,9 +80,9 @@ public class MacOSGDBRunControl extends GDBRunControl {
@Override
protected void handleSuccess() {
if (getData()) {
MIExecInterrupt cmd = null;
ICommand<MIInfo> cmd = null;
if (context instanceof IContainerDMContext) {
cmd = new MIExecInterrupt(context);
cmd = fCommandFactory.createMIExecInterrupt(context);
} else {
IMIExecutionDMContext dmc = DMContexts.getAncestorOfType(context, IMIExecutionDMContext.class);
if (dmc == null) {
@ -52,7 +90,7 @@ public class MacOSGDBRunControl extends GDBRunControl {
rm.done();
return;
}
cmd = new MIExecInterrupt(dmc);
cmd = fCommandFactory.createMIExecInterrupt(dmc);
}
getConnection().queueCommand(cmd, new DataRequestMonitor<MIInfo>(getExecutor(), rm));
} else {

View file

@ -1,135 +0,0 @@
/*******************************************************************************
* Copyright (c) 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.service.macos;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.mi.service.MIVariableManager;
import org.eclipse.cdt.dsf.mi.service.command.commands.macos.MacOSMIVarUpdate;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarChange;
import org.eclipse.cdt.dsf.mi.service.command.output.macos.MacOSMIVarUpdateInfo;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
/**
* Specific VariableManager for MacOS
*
* @since 3.0
*/
public class MacOSGDBVariableManager extends MIVariableManager {
public MacOSGDBVariableManager(DsfSession session, DsfServicesTracker tracker) {
super(session, tracker);
}
@Override
protected MIRootVariableObject createRootVariableObject(VariableObjectId id) {
return new MacOSGDBRootVariableObject(id);
}
private class MacOSGDBRootVariableObject extends MIRootVariableObject {
public MacOSGDBRootVariableObject(VariableObjectId id) {
super(id);
}
@Override
public void update(final DataRequestMonitor<Boolean> rm) {
if (isOutOfScope()) {
rm.setData(false);
rm.done();
} else if (currentState != STATE_READY) {
// Object is not fully created or is being updated
// so add RequestMonitor to pending queue
updatesPending.add(rm);
} else if (getOutOfDate() == false) {
rm.setData(false);
rm.done();
} else {
// Object needs to be updated in the back-end
currentState = STATE_UPDATING;
// In GDB, var-update will only report a change if -var-evaluate-expression has
// changed -- in the current format--. This means that situations like
// double z = 1.2;
// z = 1.4;
// Will not report a change if the format is anything else than natural.
// This is because 1.2 and 1.4 are both printed as 1, 0x1, etc
// Since we cache the values of every format, we must know if -any- format has
// changed, not just the current one.
// To solve this, we always do an update in the natural format; I am not aware
// of any case where the natural format would stay the same, but another format
// would change. However, since a var-update update all children as well,
// we must make sure these children are also in the natural format
// The simplest way to do this is that whenever we change the format
// of a variable object, we immediately set it back to natural with a second
// var-set-format command. This is done in the getValue() method
getCommandControl().queueCommand(
new MacOSMIVarUpdate(getRootToUpdate().getControlDMContext(), getGdbName()),
new DataRequestMonitor<MacOSMIVarUpdateInfo>(getSession().getExecutor(), rm) {
@Override
protected void handleCompleted() {
currentState = STATE_READY;
if (isSuccess()) {
setOutOfDate(false);
MIVarChange[] changes = getData().getMIVarChanges();
if (changes.length > 0 && changes[0].isInScope() == false) {
// Object is out-of-scope
outOfScope = true;
// We can delete this root in GDB right away. This is safe, even
// if the root has children, because they are also out-of-scope.
// We -must- also remove this entry from our LRU. If we don't
// we can end-up with a race condition that create this object
// twice, or have an infinite loop while never re-creating the object.
// The can happen if we update a child first then we request
// the root later,
getLRUCache().remove(getInternalId());
rm.setData(true);
rm.done();
} else {
// The root object is now up-to-date, we must parse the changes, if any.
processChanges(changes);
// We only mark this root as updated in our list if it is in-scope.
// For out-of-scope object, we don't ever need to re-update them so
// we don't need to add them to this list.
rootVariableUpdated(MacOSGDBRootVariableObject.this);
rm.setData(false);
rm.done();
}
while (updatesPending.size() > 0) {
DataRequestMonitor<Boolean> pendingRm = updatesPending.poll();
pendingRm.setData(false);
pendingRm.done();
}
} else {
// We were not able to update for some reason
rm.setData(false);
rm.done();
while (updatesPending.size() > 0) {
DataRequestMonitor<Boolean> pendingRm = updatesPending.poll();
pendingRm.setStatus(getStatus());
pendingRm.done();
}
}
}
});
}
}
}
}

View file

@ -12,11 +12,13 @@
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.service.macos;
import org.eclipse.cdt.dsf.debug.service.IExpressions;
import org.eclipse.cdt.dsf.debug.service.IProcesses;
import org.eclipse.cdt.dsf.debug.service.IRunControl;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
import org.eclipse.cdt.dsf.gdb.service.GdbDebugServicesFactory;
import org.eclipse.cdt.dsf.gdb.service.command.GDBControl;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.debug.core.ILaunchConfiguration;
/** @since 3.0 */
public class MacOSGdbDebugServicesFactory extends GdbDebugServicesFactory {
@ -25,6 +27,7 @@ public class MacOSGdbDebugServicesFactory extends GdbDebugServicesFactory {
// We have to be careful not to compare that specific version number scheme with the
// FSF GDB version scheme.
// Use this variable when needing to differentiate between different Mac OS GDBs
@SuppressWarnings("unused")
private final String fAppleVersion;
public MacOSGdbDebugServicesFactory(String gdbVersion, String appleVersion) {
@ -33,8 +36,8 @@ public class MacOSGdbDebugServicesFactory extends GdbDebugServicesFactory {
}
@Override
protected IExpressions createExpressionService(DsfSession session) {
return new MacOSGDBExpressions(session);
protected ICommandControl createCommandControl(DsfSession session, ILaunchConfiguration config) {
return new GDBControl(session, config, new MacOSCommandFactory());
}
@Override

View file

@ -24,7 +24,7 @@ import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.debug.service.ISourceLookup;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIEnvironmentDirectory;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.service.AbstractDsfService;
import org.eclipse.cdt.dsf.service.DsfSession;
@ -51,6 +51,7 @@ public class CSourceLookup extends AbstractDsfService implements ISourceLookup {
private Map<ISourceLookupDMContext,CSourceLookupDirector> fDirectors = new HashMap<ISourceLookupDMContext,CSourceLookupDirector>();
ICommandControl fConnection;
private CommandFactory fCommandFactory;
public CSourceLookup(DsfSession session) {
super(session);
@ -71,7 +72,7 @@ public class CSourceLookup extends AbstractDsfService implements ISourceLookup {
String[] paths = pathList.toArray(new String[pathList.size()]);
fConnection.queueCommand(
new MIEnvironmentDirectory(ctx, paths, false),
fCommandFactory.createMIEnvironmentDirectory(ctx, paths, false),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
}
@ -121,6 +122,8 @@ public class CSourceLookup extends AbstractDsfService implements ISourceLookup {
private void doInitialize(final RequestMonitor requestMonitor) {
fConnection = getServicesTracker().getService(ICommandControl.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
// Register this service
register(new String[] { CSourceLookup.class.getName(), ISourceLookup.class.getName() }, new Hashtable<String, String>());

View file

@ -0,0 +1,29 @@
/*******************************************************************************
* Copyright (c) 2010 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Ericsson - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.mi.service;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
/**
* This interface provides a method for accessing the command factory.
* @since 3.0
*/
public interface IMICommandControl extends ICommandControlService
{
/**
* Returns a command factory that creates different<code>ICommand</code>
* to be sent to the backend. This factory can easily be overridden
* to specialize certain commands.
*/
public CommandFactory getCommandFactory();
}

View file

@ -33,14 +33,7 @@ import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlShutdownDMEvent;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakAfter;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakCondition;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakDelete;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakDisable;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakEnable;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakInsert;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakList;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakWatch;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.events.MIWatchpointScopeEvent;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakListInfo;
@ -96,6 +89,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
// Services
private ICommandControl fConnection;
private IMIRunControl fRunControl;
private CommandFactory fCommandFactory;
// Service breakpoints tracking
// The breakpoints are stored per context and keyed on the back-end breakpoint reference
@ -269,6 +263,8 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
fConnection = getServicesTracker().getService(ICommandControl.class);
fRunControl = getServicesTracker().getService(IMIRunControl.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
// Register for the useful events
getSession().addServiceEventListener(this, null);
@ -360,7 +356,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
}
// Execute the command
fConnection.queueCommand(new MIBreakList(context),
fConnection.queueCommand(fCommandFactory.createMIBreakList(context),
new DataRequestMonitor<MIBreakListInfo>(getExecutor(), drm) {
@Override
protected void handleSuccess() {
@ -563,7 +559,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
@Override
public void execute(final RequestMonitor rm) {
fConnection.queueCommand(
new MIBreakInsert(context, isTemporary, isHardware, condition, ignoreCount, location, tid),
fCommandFactory.createMIBreakInsert(context, isTemporary, isHardware, condition, ignoreCount, location, tid),
new DataRequestMonitor<MIBreakInsertInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -697,7 +693,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
};
// Execute the command
fConnection.queueCommand(new MIBreakWatch(context, isRead, isWrite, expression), addWatchpointDRM);
fConnection.queueCommand(fCommandFactory.createMIBreakWatch(context, isRead, isWrite, expression), addWatchpointDRM);
}
//-------------------------------------------------------------------------
@ -757,7 +753,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
public void execute(final RequestMonitor rm) {
// Queue the command
fConnection.queueCommand(
new MIBreakDelete(context, new int[] { reference }),
fCommandFactory.createMIBreakDelete(context, new int[] { reference }),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleCompleted() {
@ -933,7 +929,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
public void execute(final RequestMonitor rm) {
// Queue the command
fConnection.queueCommand(
new MIBreakCondition(context, reference, condition),
fCommandFactory.createMIBreakCondition(context, reference, condition),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -963,7 +959,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
// Remove invalid condition from the back-end breakpoint
breakpoint.setCondition(NULL_STRING);
fConnection.queueCommand(
new MIBreakCondition(context, reference, NULL_STRING),
fCommandFactory.createMIBreakCondition(context, reference, NULL_STRING),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
// The report the initial problem
@ -1007,7 +1003,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
public void execute(final RequestMonitor rm) {
// Queue the command
fConnection.queueCommand(
new MIBreakAfter(context, reference, ignoreCount),
fCommandFactory.createMIBreakAfter(context, reference, ignoreCount),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -1052,7 +1048,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
public void execute(final RequestMonitor rm) {
// Queue the command
fConnection.queueCommand(
new MIBreakEnable(context, new int[] { reference }),
fCommandFactory.createMIBreakEnable(context, new int[] { reference }),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -1097,7 +1093,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints
public void execute(final RequestMonitor rm) {
// Queue the command
fConnection.queueCommand(
new MIBreakDisable(context, new int[] { reference }),
fCommandFactory.createMIBreakDisable(context, new int[] { reference }),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {

View file

@ -21,7 +21,7 @@ import org.eclipse.cdt.dsf.debug.service.IInstruction;
import org.eclipse.cdt.dsf.debug.service.IMixedInstruction;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataDisassemble;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataDisassembleInfo;
import org.eclipse.cdt.dsf.service.AbstractDsfService;
import org.eclipse.cdt.dsf.service.DsfSession;
@ -33,6 +33,7 @@ public class MIDisassembly extends AbstractDsfService implements IDisassembly {
// Services
ICommandControl fConnection;
private CommandFactory fCommandFactory;
///////////////////////////////////////////////////////////////////////////
// AbstractDsfService
@ -62,6 +63,8 @@ public class MIDisassembly extends AbstractDsfService implements IDisassembly {
private void doInitialize(final RequestMonitor rm) {
fConnection = getServicesTracker().getService(ICommandControl.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
// getSession().addServiceEventListener(this, null);
register(new String[] { IDisassembly.class.getName(), MIDisassembly.class.getName() },
new Hashtable<String, String>());
@ -107,7 +110,7 @@ public class MIDisassembly extends AbstractDsfService implements IDisassembly {
// Go for it
String start = (startAddress != null) ? startAddress.toString() : "$pc"; //$NON-NLS-1$
String end = (endAddress != null) ? endAddress.toString() : "$pc + 100"; //$NON-NLS-1$
fConnection.queueCommand(new MIDataDisassemble(context, start, end, false),
fConnection.queueCommand(fCommandFactory.createMIDataDisassemble(context, start, end, false),
new DataRequestMonitor<MIDataDisassembleInfo>(getExecutor(), drm) {
@Override
protected void handleSuccess() {
@ -132,7 +135,7 @@ public class MIDisassembly extends AbstractDsfService implements IDisassembly {
}
// Go for it
fConnection.queueCommand(new MIDataDisassemble(context, filename, linenum, lines, false),
fConnection.queueCommand(fCommandFactory.createMIDataDisassemble(context, filename, linenum, lines, false),
new DataRequestMonitor<MIDataDisassembleInfo>(getExecutor(), drm) {
@Override
protected void handleSuccess() {
@ -160,7 +163,7 @@ public class MIDisassembly extends AbstractDsfService implements IDisassembly {
// Go for it
String start = (startAddress != null) ? startAddress.toString() : "$pc"; //$NON-NLS-1$
String end = (endAddress != null) ? endAddress.toString() : "$pc + 100"; //$NON-NLS-1$
fConnection.queueCommand(new MIDataDisassemble(context, start, end, true),
fConnection.queueCommand(fCommandFactory.createMIDataDisassemble(context, start, end, true),
new DataRequestMonitor<MIDataDisassembleInfo>(getExecutor(), drm) {
@Override
protected void handleSuccess() {
@ -186,7 +189,7 @@ public class MIDisassembly extends AbstractDsfService implements IDisassembly {
}
// Go for it
fConnection.queueCommand(new MIDataDisassemble(context, filename, linenum, lines, true),
fConnection.queueCommand(fCommandFactory.createMIDataDisassemble(context, filename, linenum, lines, true),
new DataRequestMonitor<MIDataDisassembleInfo>(getExecutor(), drm) {
@Override
protected void handleSuccess() {

View file

@ -34,12 +34,12 @@ import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.debug.service.command.CommandCache;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.commands.ExprMetaGetAttributes;
import org.eclipse.cdt.dsf.mi.service.command.commands.ExprMetaGetChildCount;
import org.eclipse.cdt.dsf.mi.service.command.commands.ExprMetaGetChildren;
import org.eclipse.cdt.dsf.mi.service.command.commands.ExprMetaGetValue;
import org.eclipse.cdt.dsf.mi.service.command.commands.ExprMetaGetVar;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataEvaluateExpression;
import org.eclipse.cdt.dsf.mi.service.command.output.ExprMetaGetAttributesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.ExprMetaGetChildCountInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.ExprMetaGetChildrenInfo;
@ -423,7 +423,7 @@ public class MIExpressions extends AbstractDsfService implements IExpressions, I
private CommandCache fExpressionCache;
private MIVariableManager varManager;
private CommandFactory fCommandFactory;
public MIExpressions(DsfSession session) {
super(session);
@ -477,6 +477,8 @@ public class MIExpressions extends AbstractDsfService implements IExpressions, I
ICommandControlService commandControl = getServicesTracker().getService(ICommandControlService.class);
fExpressionCache.setContextAvailable(commandControl.getContext(), true);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
requestMonitor.done();
}
@ -644,7 +646,7 @@ public class MIExpressions extends AbstractDsfService implements IExpressions, I
rm.done();
} else {
fExpressionCache.execute(
new MIDataEvaluateExpression<MIDataEvaluateExpressionInfo>(addressDmc),
fCommandFactory.createMIDataEvaluateExpression(addressDmc),
new DataRequestMonitor<MIDataEvaluateExpressionInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -657,7 +659,7 @@ public class MIExpressions extends AbstractDsfService implements IExpressions, I
final String addrStr = tmpAddrStr;
fExpressionCache.execute(
new MIDataEvaluateExpression<MIDataEvaluateExpressionInfo>(sizeDmc),
fCommandFactory.createMIDataEvaluateExpression(sizeDmc),
new DataRequestMonitor<MIDataEvaluateExpressionInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -706,7 +708,7 @@ public class MIExpressions extends AbstractDsfService implements IExpressions, I
// Starting with GDB 7.0, this format automatically supports pretty-printing, as long as
// GDB has been configured to support it.
fExpressionCache.execute(
new MIDataEvaluateExpression<MIDataEvaluateExpressionInfo>(exprDmc),
fCommandFactory.createMIDataEvaluateExpression(exprDmc),
new DataRequestMonitor<MIDataEvaluateExpressionInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {

View file

@ -42,8 +42,7 @@ import org.eclipse.cdt.dsf.debug.service.command.CommandCache;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.MIExpressions.ExpressionChangedEvent;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataReadMemory;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataWriteMemory;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataReadMemoryInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataWriteMemoryInfo;
import org.eclipse.cdt.dsf.service.AbstractDsfService;
@ -78,6 +77,8 @@ public class MIMemory extends AbstractDsfService implements IMemory, ICachingSer
// Back-end commands cache
private CommandCache fCommandCache;
private CommandFactory fCommandFactory;
// Map of memory caches
private Map<IMemoryDMContext, MIMemoryCache> fMemoryCaches;
@ -130,6 +131,8 @@ public class MIMemory extends AbstractDsfService implements IMemory, ICachingSer
ICommandControlService commandControl = getServicesTracker().getService(ICommandControlService.class);
BufferedCommandControl bufferedCommandControl = new BufferedCommandControl(commandControl, getExecutor(), 2);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
// This cache stores the result of a command when received; also, this cache
// is manipulated when receiving events. Currently, events are received after
// three scheduling of the executor, while command results after only one. This
@ -325,7 +328,7 @@ public class MIMemory extends AbstractDsfService implements IMemory, ICachingSer
Character asChar = null;
fCommandCache.execute(
new MIDataReadMemory(dmc, offset, address.toString(), mode, word_size, nb_rows, nb_cols, asChar),
fCommandFactory.createMIDataReadMemory(dmc, offset, address.toString(), mode, word_size, nb_rows, nb_cols, asChar),
new DataRequestMonitor<MIDataReadMemoryInfo>(getExecutor(), drm) {
@Override
protected void handleSuccess() {
@ -373,7 +376,7 @@ public class MIMemory extends AbstractDsfService implements IMemory, ICachingSer
for (int i = 0; i < count; i++) {
String value = new Byte(buffer[i]).toString();
fCommandCache.execute(
new MIDataWriteMemory(dmc, offset + i, baseAddress, format, word_size, value),
fCommandFactory.createMIDataWriteMemory(dmc, offset + i, baseAddress, format, word_size, value),
new DataRequestMonitor<MIDataWriteMemoryInfo>(getExecutor(), countingRM)
);
}

View file

@ -25,7 +25,7 @@ import org.eclipse.cdt.dsf.debug.service.IModules;
import org.eclipse.cdt.dsf.debug.service.command.CommandCache;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIInfoSharedLibrary;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.CLIInfoSharedLibraryInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.CLIInfoSharedLibraryInfo.DsfMISharedInfo;
import org.eclipse.cdt.dsf.service.AbstractDsfService;
@ -39,7 +39,8 @@ import org.osgi.framework.BundleContext;
*/
public class MIModules extends AbstractDsfService implements IModules, ICachingService {
private CommandCache fModulesCache;
private CommandFactory fCommandFactory;
public MIModules(DsfSession session) {
super(session);
}
@ -64,6 +65,9 @@ public class MIModules extends AbstractDsfService implements IModules, ICachingS
ICommandControlService commandControl = getServicesTracker().getService(ICommandControlService.class);
fModulesCache = new CommandCache(getSession(), commandControl);
fModulesCache.setContextAvailable(commandControl.getContext(), true);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
/*
* Make ourselves known so clients can use us.
*/
@ -155,7 +159,7 @@ public class MIModules extends AbstractDsfService implements IModules, ICachingS
public void getModules(final ISymbolDMContext symCtx, final DataRequestMonitor<IModuleDMContext[]> rm) {
if(symCtx != null){
fModulesCache.execute(new CLIInfoSharedLibrary(symCtx),
fModulesCache.execute(fCommandFactory.createCLIInfoSharedLibrary(symCtx),
new DataRequestMonitor<CLIInfoSharedLibraryInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -184,7 +188,7 @@ public class MIModules extends AbstractDsfService implements IModules, ICachingS
public void getModuleData(final IModuleDMContext dmc, final DataRequestMonitor<IModuleDMData> rm) {
assert dmc != null;
if (dmc instanceof ModuleDMContext) {
fModulesCache.execute(new CLIInfoSharedLibrary(dmc),
fModulesCache.execute(fCommandFactory.createCLIInfoSharedLibrary(dmc),
new DataRequestMonitor<CLIInfoSharedLibraryInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {

View file

@ -33,10 +33,7 @@ import org.eclipse.cdt.dsf.debug.service.command.CommandCache;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIAttach;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIDetach;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIInfoThreads;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIThreadListIds;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.CLIInfoThreadsInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIThreadListIdsInfo;
@ -307,6 +304,7 @@ public class MIProcesses extends AbstractDsfService implements IMIProcesses, ICa
private ICommandControlService fCommandControl;
private CommandCache fContainerCommandCache;
private CommandFactory fCommandFactory;
private static final String FAKE_THREAD_ID = "0"; //$NON-NLS-1$
// The unique id should be an empty string so that the views know not to display the fake id
@ -350,6 +348,8 @@ public class MIProcesses extends AbstractDsfService implements IMIProcesses, ICa
fCommandControl = getServicesTracker().getService(ICommandControlService.class);
BufferedCommandControl bufferedCommandControl = new BufferedCommandControl(fCommandControl, getExecutor(), 2);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
// This cache stores the result of a command when received; also, this cache
// is manipulated when receiving events. Currently, events are received after
// three scheduling of the executor, while command results after only one. This
@ -426,7 +426,7 @@ public class MIProcesses extends AbstractDsfService implements IMIProcesses, ICa
protected void handleSuccess() {
if (getData() instanceof IMIContainerDMContext) {
IMIContainerDMContext contDmc = (IMIContainerDMContext)getData();
fContainerCommandCache.execute(new CLIInfoThreads(contDmc),
fContainerCommandCache.execute(fCommandFactory.createCLIInfoThreads(contDmc),
new DataRequestMonitor<CLIInfoThreadsInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -480,7 +480,7 @@ public class MIProcesses extends AbstractDsfService implements IMIProcesses, ICa
ICommandControlDMContext controlDmc = DMContexts.getAncestorOfType(procCtx, ICommandControlDMContext.class);
fCommandControl.queueCommand(
new CLIAttach(controlDmc, ((IMIProcessDMContext)procCtx).getProcId()),
fCommandFactory.createCLIAttach(controlDmc, ((IMIProcessDMContext)procCtx).getProcId()),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -511,7 +511,7 @@ public class MIProcesses extends AbstractDsfService implements IMIProcesses, ICa
// This service version cannot use -target-detach because it didn't exist
// in versions of GDB up to and including GDB 6.8
fCommandControl.queueCommand(
new CLIDetach(controlDmc),
fCommandFactory.createCLIDetach(controlDmc),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -550,7 +550,7 @@ public class MIProcesses extends AbstractDsfService implements IMIProcesses, ICa
final IMIContainerDMContext containerDmc = DMContexts.getAncestorOfType(dmc, IMIContainerDMContext.class);
if (containerDmc != null) {
fContainerCommandCache.execute(
new MIThreadListIds(containerDmc),
fCommandFactory.createMIThreadListIds(containerDmc),
new DataRequestMonitor<MIThreadListIdsInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {

View file

@ -29,8 +29,7 @@ import org.eclipse.cdt.dsf.debug.service.command.BufferedCommandControl;
import org.eclipse.cdt.dsf.debug.service.command.CommandCache;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataListRegisterNames;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataListRegisterValues;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataListRegisterNamesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataListRegisterValuesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
@ -143,6 +142,8 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
* Internal control variables.
*/
private CommandFactory fCommandFactory;
private MIRegisterGroupDMC fGeneralRegistersGroupDMC;
private CommandCache fRegisterNameCache; // Cache for holding the Register Names in the single Group
private CommandCache fRegisterValueCache; // Cache for holding the Register Values
@ -175,6 +176,8 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
ICommandControlService commandControl = getServicesTracker().getService(ICommandControlService.class);
BufferedCommandControl bufferedCommandControl = new BufferedCommandControl(commandControl, getExecutor(), 2);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
// This cache stores the result of a command when received; also, this cache
// is manipulated when receiving events. Currently, events are received after
// three scheduling of the executor, while command results after only one. This
@ -261,7 +264,7 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
int[] regnos = {miRegDmc.getRegNo()};
fRegisterValueCache.execute(
new MIDataListRegisterValues(execDmc, MIFormat.HEXADECIMAL, regnos),
fCommandFactory.createMIDataListRegisterValues(execDmc, MIFormat.HEXADECIMAL, regnos),
new DataRequestMonitor<MIDataListRegisterValuesInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -319,7 +322,7 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
int[] regnos = {regDmc.getRegNo()};
fRegisterValueCache.execute(
new MIDataListRegisterValues(miExecDmc, NumberFormat, regnos),
fCommandFactory.createMIDataListRegisterValues(miExecDmc, NumberFormat, regnos),
new DataRequestMonitor<MIDataListRegisterValuesInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -476,7 +479,7 @@ public class MIRegisters extends AbstractDsfService implements IRegisters, ICach
if ( groupDmc.getGroupNo() == 0 ) {
final IMIExecutionDMContext executionDmc = DMContexts.getAncestorOfType(dmc, IMIExecutionDMContext.class);
fRegisterNameCache.execute(
new MIDataListRegisterNames(containerDmc),
fCommandFactory.createMIDataListRegisterNames(containerDmc),
new DataRequestMonitor<MIDataListRegisterNamesInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {

View file

@ -35,21 +35,11 @@ import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContex
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.debug.service.command.BufferedCommandControl;
import org.eclipse.cdt.dsf.debug.service.command.CommandCache;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlShutdownDMEvent;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIJump;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIThread;
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.MIExecFinish;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecInterrupt;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecNext;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecNextInstruction;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecStep;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecStepInstruction;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecUntil;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIThreadListIds;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.events.IMIDMEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIBreakpointHitEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIErrorEvent;
@ -278,6 +268,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
private ICommandControlService fConnection;
private CommandCache fMICommandCache;
private CommandFactory fCommandFactory;
// State flags
private boolean fSuspended = true;
@ -313,6 +304,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
fConnection = getServicesTracker().getService(ICommandControlService.class);
BufferedCommandControl bufferedCommandControl = new BufferedCommandControl(fConnection, getExecutor(), 2);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
// This cache stores the result of a command when received; also, this cache
// is manipulated when receiving events. Currently, events are received after
// three scheduling of the executor, while command results after only one. This
@ -401,7 +393,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
// We need a proper thread id for the debug view to select the right thread
// Bug 300096 comment #15 and Bug 302597
getConnection().queueCommand(
new CLIThread(containerDmc),
fCommandFactory.createCLIThread(containerDmc),
new DataRequestMonitor<CLIThreadInfo>(getExecutor(), null) {
@Override
protected void handleCompleted() {
@ -552,9 +544,9 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
assert context != null;
if (doCanResume(context)) {
MIExecContinue cmd = null;
ICommand<MIInfo> cmd = null;
if(context instanceof IContainerDMContext) {
cmd = new MIExecContinue(context);
cmd = fCommandFactory.createMIExecContinue(context);
} else {
IMIExecutionDMContext dmc = DMContexts.getAncestorOfType(context, IMIExecutionDMContext.class);
if (dmc == null) {
@ -562,7 +554,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
rm.done();
return;
}
cmd = new MIExecContinue(dmc);//, new String[0]);
cmd = fCommandFactory.createMIExecContinue(dmc);//, new String[0]);
}
fResumePending = true;
@ -593,9 +585,9 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
assert context != null;
if (doCanSuspend(context)) {
MIExecInterrupt cmd = null;
ICommand<MIInfo> cmd = null;
if(context instanceof IContainerDMContext){
cmd = new MIExecInterrupt(context);
cmd = fCommandFactory.createMIExecInterrupt(context);
}
else {
IMIExecutionDMContext dmc = DMContexts.getAncestorOfType(context, IMIExecutionDMContext.class);
@ -604,7 +596,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
rm.done();
return;
}
cmd = new MIExecInterrupt(dmc);
cmd = fCommandFactory.createMIExecInterrupt(dmc);
}
fConnection.queueCommand(cmd, new DataRequestMonitor<MIInfo>(getExecutor(), rm));
} else {
@ -638,13 +630,13 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
return;
}
MICommand<MIInfo> cmd = null;
ICommand<MIInfo> cmd = null;
switch(stepType) {
case STEP_INTO:
cmd = new MIExecStep(dmc, 1);
cmd = fCommandFactory.createMIExecStep(dmc, 1);
break;
case STEP_OVER:
cmd = new MIExecNext(dmc);
cmd = fCommandFactory.createMIExecNext(dmc);
break;
case STEP_RETURN:
// The -exec-finish command operates on the selected stack frame, but here we always
@ -656,7 +648,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
MIStack stackService = getServicesTracker().getService(MIStack.class);
if (stackService != null) {
IFrameDMContext topFrameDmc = stackService.createFrameDMContext(dmc, 0);
cmd = new MIExecFinish(topFrameDmc);
cmd = fCommandFactory.createMIExecFinish(topFrameDmc);
} else {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED, "Cannot create context for command, stack service not available.", null)); //$NON-NLS-1$
rm.done();
@ -664,10 +656,10 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
}
break;
case INSTRUCTION_STEP_INTO:
cmd = new MIExecStepInstruction(dmc, 1);
cmd = fCommandFactory.createMIExecStepInstruction(dmc, 1);
break;
case INSTRUCTION_STEP_OVER:
cmd = new MIExecNextInstruction(dmc, 1);
cmd = fCommandFactory.createMIExecNextInstruction(dmc, 1);
break;
default:
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INTERNAL_ERROR, "Given step type not supported", null)); //$NON-NLS-1$
@ -694,7 +686,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
public void getExecutionContexts(final IContainerDMContext containerDmc, final DataRequestMonitor<IExecutionDMContext[]> rm) {
fMICommandCache.execute(
new MIThreadListIds(containerDmc),
fCommandFactory.createMIThreadListIds(containerDmc),
new DataRequestMonitor<MIThreadListIdsInfo>(
getExecutor(), rm) {
@Override
@ -750,7 +742,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
if (doCanResume(dmc)) {
fResumePending = true;
fMICommandCache.setContextAvailable(dmc, false);
fConnection.queueCommand(new MIExecUntil(dmc, location),
fConnection.queueCommand(fCommandFactory.createMIExecUntil(dmc, location),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
} else {
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED,
@ -774,7 +766,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
fResumePending = true;
fMICommandCache.setContextAvailable(dmc, false);
fConnection.queueCommand(
new CLIJump(dmc, location),
fCommandFactory.createCLIJump(dmc, location),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleFailure() {
@ -903,7 +895,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
// Can't use the resume() call because we 'silently' stopped
// so resume() will not know we are actually stopped
fConnection.queueCommand(
new MIExecContinue(getContextToSuspend()),
fCommandFactory.createMIExecContinue(getContextToSuspend()),
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
} else {
// We didn't suspend the container, so we don't need to resume it

View file

@ -33,12 +33,10 @@ import org.eclipse.cdt.dsf.debug.service.IRunControl.ISuspendedDMEvent;
import org.eclipse.cdt.dsf.debug.service.IRunControl.StateChangeReason;
import org.eclipse.cdt.dsf.debug.service.command.BufferedCommandControl;
import org.eclipse.cdt.dsf.debug.service.command.CommandCache;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIStackInfoDepth;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIStackListArguments;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIStackListFrames;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIStackListLocals;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.events.IMIDMEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIStoppedEvent;
import org.eclipse.cdt.dsf.mi.service.command.output.MIArg;
@ -155,7 +153,8 @@ public class MIStack extends AbstractDsfService
}
private CommandCache fMICommandCache;
private CommandFactory fCommandFactory;
// Two commands such as
// -stack-info-depth 11
// -stack-info-depth 2
@ -205,6 +204,8 @@ public class MIStack extends AbstractDsfService
fMICommandCache.setContextAvailable(commandControl.getContext(), true);
fRunControl = getServicesTracker().getService(IRunControl.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
getSession().addServiceEventListener(this, null);
register(new String[]{IStack.class.getName(), MIStack.class.getName()}, new Hashtable<String,String>());
rm.done();
@ -274,14 +275,14 @@ public class MIStack extends AbstractDsfService
}
}
final MIStackListFrames miStackListCmd;
final ICommand<MIStackListFramesInfo> miStackListCmd;
// firstIndex is the first index retrieved
final int firstIndex;
if (endIndex >= 0) {
miStackListCmd = new MIStackListFrames(execDmc, startIndex, endIndex);
miStackListCmd = fCommandFactory.createMIStackListFrames(execDmc, startIndex, endIndex);
firstIndex = startIndex;
} else {
miStackListCmd = new MIStackListFrames(execDmc);
miStackListCmd = fCommandFactory.createMIStackListFrames(execDmc);
firstIndex = 0;
}
fMICommandCache.execute(
@ -432,7 +433,7 @@ public class MIStack extends AbstractDsfService
}
fMICommandCache.execute(
new MIStackListFrames(execDmc),
fCommandFactory.createMIStackListFrames(execDmc),
new DataRequestMonitor<MIStackListFramesInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -476,7 +477,7 @@ public class MIStack extends AbstractDsfService
// If not, retrieve the full list of frame data.
fMICommandCache.execute(
new MIStackListArguments(execDmc, true),
fCommandFactory.createMIStackListArguments(execDmc, true),
new DataRequestMonitor<MIStackListArgumentsInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -556,7 +557,7 @@ public class MIStack extends AbstractDsfService
if (miVariableDmc.fType == MIVariableDMC.Type.ARGUMENT){
fMICommandCache.execute(
new MIStackListArguments(execDmc, true),
fCommandFactory.createMIStackListArguments(execDmc, true),
new DataRequestMonitor<MIStackListArgumentsInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -576,7 +577,7 @@ public class MIStack extends AbstractDsfService
}//if
if (miVariableDmc.fType == MIVariableDMC.Type.LOCAL){
fMICommandCache.execute(
new MIStackListLocals(frameDmc, true),
fCommandFactory.createMIStackListLocals(frameDmc, true),
new DataRequestMonitor<MIStackListLocalsInfo>(getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -638,7 +639,7 @@ public class MIStack extends AbstractDsfService
});
fMICommandCache.execute(
new MIStackListLocals(frameDmc, true),
fCommandFactory.createMIStackListLocals(frameDmc, true),
new DataRequestMonitor<MIStackListLocalsInfo>(getExecutor(), countingRm) {
@Override
protected void handleSuccess() {
@ -670,9 +671,9 @@ public class MIStack extends AbstractDsfService
}
}
MIStackInfoDepth depthCommand = null;
if (maxDepth > 0) depthCommand = new MIStackInfoDepth(execDmc, maxDepth);
else depthCommand = new MIStackInfoDepth(execDmc);
ICommand<MIStackInfoDepthInfo> depthCommand = null;
if (maxDepth > 0) depthCommand = fCommandFactory.createMIStackInfoDepth(execDmc, maxDepth);
else depthCommand = fCommandFactory.createMIStackInfoDepth(execDmc);
fMICommandCache.execute(
depthCommand,

View file

@ -45,21 +45,13 @@ import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommand
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.MIExpressions.ExpressionInfo;
import org.eclipse.cdt.dsf.mi.service.MIExpressions.MIExpressionDMC;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.commands.ExprMetaGetAttributes;
import org.eclipse.cdt.dsf.mi.service.command.commands.ExprMetaGetChildCount;
import org.eclipse.cdt.dsf.mi.service.command.commands.ExprMetaGetChildren;
import org.eclipse.cdt.dsf.mi.service.command.commands.ExprMetaGetValue;
import org.eclipse.cdt.dsf.mi.service.command.commands.ExprMetaGetVar;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataEvaluateExpression;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarAssign;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarCreate;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarDelete;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarEvaluateExpression;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarInfoPathExpression;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarListChildren;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarSetFormat;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarShowAttributes;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarUpdate;
import org.eclipse.cdt.dsf.mi.service.command.output.ExprMetaGetAttributesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.ExprMetaGetChildCountInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.ExprMetaGetChildrenInfo;
@ -402,7 +394,7 @@ public class MIVariableManager implements ICommandControl {
rm.done();
} else {
fCommandControl.queueCommand(
new MIVarShowAttributes(getRootToUpdate().getControlDMContext(), getGdbName()),
fCommandFactory.createMIVarShowAttributes(getRootToUpdate().getControlDMContext(), getGdbName()),
new DataRequestMonitor<MIVarShowAttributesInfo>(fSession.getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -490,7 +482,7 @@ public class MIVariableManager implements ICommandControl {
} else {
// We must first set the new format and then evaluate the variable
fCommandControl.queueCommand(
new MIVarSetFormat(getRootToUpdate().getControlDMContext(), getGdbName(), dmc.getFormatID()),
fCommandFactory.createMIVarSetFormat(getRootToUpdate().getControlDMContext(), getGdbName(), dmc.getFormatID()),
new DataRequestMonitor<MIVarSetFormatInfo>(fSession.getExecutor(), rm) {
@Override
protected void handleCompleted() {
@ -526,7 +518,7 @@ public class MIVariableManager implements ICommandControl {
*/
private void evaluate(final DataRequestMonitor<FormattedValueDMData> rm) {
fCommandControl.queueCommand(
new MIVarEvaluateExpression(getRootToUpdate().getControlDMContext(), getGdbName()),
fCommandFactory.createMIVarEvaluateExpression(getRootToUpdate().getControlDMContext(), getGdbName()),
new DataRequestMonitor<MIVarEvaluateExpressionInfo>(fSession.getExecutor(), rm) {
@Override
protected void handleCompleted() {
@ -563,7 +555,7 @@ public class MIVariableManager implements ICommandControl {
private void resetFormatToNatural() {
if (!getCurrentFormat().equals(IFormattedValues.NATURAL_FORMAT)) {
fCommandControl.queueCommand(
new MIVarSetFormat(getRootToUpdate().getControlDMContext(), getGdbName(), IFormattedValues.NATURAL_FORMAT),
fCommandFactory.createMIVarSetFormat(getRootToUpdate().getControlDMContext(), getGdbName(), IFormattedValues.NATURAL_FORMAT),
new DataRequestMonitor<MIVarSetFormatInfo>(fSession.getExecutor(), null) {
@Override
protected void handleCompleted() {
@ -629,7 +621,7 @@ public class MIVariableManager implements ICommandControl {
// be called here with a fully created object.
// Also no need to lock the object, since getting the children won't affect other operations
fCommandControl.queueCommand(
new MIVarListChildren(getRootToUpdate().getControlDMContext(), getGdbName()),
fCommandFactory.createMIVarListChildren(getRootToUpdate().getControlDMContext(), getGdbName()),
new DataRequestMonitor<MIVarListChildrenInfo>(fSession.getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -746,7 +738,7 @@ public class MIVariableManager implements ICommandControl {
// To build the child id, we need the fully qualified expression which we
// can get from -var-info-path-expression starting from GDB 6.7
fCommandControl.queueCommand(
new MIVarInfoPathExpression(getRootToUpdate().getControlDMContext(), child.getVarName()),
fCommandFactory.createMIVarInfoPathExpression(getRootToUpdate().getControlDMContext(), child.getVarName()),
new DataRequestMonitor<MIVarInfoPathExpressionInfo>(fSession.getExecutor(), childPathRm) {
@Override
protected void handleCompleted() {
@ -881,7 +873,7 @@ public class MIVariableManager implements ICommandControl {
// No need to be in ready state or to lock the object
fCommandControl.queueCommand(
new MIVarAssign(getRootToUpdate().getControlDMContext(), getGdbName(), value),
fCommandFactory.createMIVarAssign(getRootToUpdate().getControlDMContext(), getGdbName(), value),
new DataRequestMonitor<MIVarAssignInfo>(fSession.getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -979,7 +971,7 @@ public class MIVariableManager implements ICommandControl {
fControlContext = DMContexts.getAncestorOfType(exprCtx, ICommandControlDMContext.class);
fCommandControl.queueCommand(
new MIVarCreate(exprCtx, exprCtx.getExpression()),
fCommandFactory.createMIVarCreate(exprCtx, exprCtx.getExpression()),
new DataRequestMonitor<MIVarCreateInfo>(fSession.getExecutor(), rm) {
@Override
protected void handleCompleted() {
@ -1070,7 +1062,7 @@ public class MIVariableManager implements ICommandControl {
// of a variable object, we immediately set it back to natural with a second
// var-set-format command. This is done in the getValue() method
fCommandControl.queueCommand(
new MIVarUpdate(getRootToUpdate().getControlDMContext(), getGdbName()),
fCommandFactory.createMIVarUpdate(getRootToUpdate().getControlDMContext(), getGdbName()),
new DataRequestMonitor<MIVarUpdateInfo>(fSession.getExecutor(), rm) {
@Override
protected void handleCompleted() {
@ -1140,7 +1132,7 @@ public class MIVariableManager implements ICommandControl {
public void deleteInGdb() {
if (getGdbName() != null) {
fCommandControl.queueCommand(
new MIVarDelete(getRootToUpdate().getControlDMContext(), getGdbName()),
fCommandFactory.createMIVarDelete(getRootToUpdate().getControlDMContext(), getGdbName()),
new DataRequestMonitor<MIVarDeleteInfo>(fSession.getExecutor(), null));
// Nothing to do in the requestMonitor, since the object was already
// removed from our list before calling this method.
@ -1336,6 +1328,8 @@ public class MIVariableManager implements ICommandControl {
/** Provides access to the GDB/MI back-end */
private final ICommandControl fCommandControl;
private CommandFactory fCommandFactory;
// The stack service needs to be used to get information such
// as the stack depth to differentiate between expressions that have the
// same name but refer to a different context
@ -1365,7 +1359,8 @@ public class MIVariableManager implements ICommandControl {
fCommandControl = tracker.getService(ICommandControl.class);
fStackService = tracker.getService(IStack.class);
fExpressionService = tracker.getService(IExpressions.class);
fCommandFactory = tracker.getService(IMICommandControl.class).getCommandFactory();
// Register to receive service events for this session.
fSession.addServiceEventListener(this, null);
}

View file

@ -17,7 +17,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import com.ibm.icu.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@ -34,12 +33,12 @@ import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl;
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.debug.service.command.ICommandListener;
import org.eclipse.cdt.dsf.debug.service.command.ICommandResult;
import org.eclipse.cdt.dsf.debug.service.command.ICommandToken;
import org.eclipse.cdt.dsf.debug.service.command.IEventListener;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.command.commands.MICommand;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIStackSelectFrame;
@ -59,6 +58,8 @@ import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import com.ibm.icu.text.MessageFormat;
/**
* Base implementation of an MI control service. It provides basic handling
* of input/output channels, and processing of the commands.
@ -66,7 +67,7 @@ import org.eclipse.core.runtime.Status;
* Extending classes need to implement the initialize() and shutdown() methods.
*/
public abstract class AbstractMIControl extends AbstractDsfService
implements ICommandControlService
implements IMICommandControl
{
private static final String MI_TRACE_IDENTIFIER = " [MI] "; //$NON-NLS-1$
@ -120,18 +121,21 @@ public abstract class AbstractMIControl extends AbstractDsfService
*/
private OutputStream fTracingStream = null;
private CommandFactory fCommandFactory;
public AbstractMIControl(DsfSession session) {
super(session);
fUseThreadAndFrameOptions = false;
fCommandFactory = new CommandFactory();
}
/**
* @since 1.1
* @since 3.0
*/
public AbstractMIControl(DsfSession session, boolean useThreadAndFrameOptions) {
public AbstractMIControl(DsfSession session, boolean useThreadAndFrameOptions, CommandFactory factory) {
super(session);
fUseThreadAndFrameOptions = useThreadAndFrameOptions;
fCommandFactory = factory;
}
/**
@ -153,6 +157,13 @@ public abstract class AbstractMIControl extends AbstractDsfService
return fTracingStream;
}
/**
* @since 3.0
*/
public CommandFactory getCommandFactory() {
return fCommandFactory;
}
/**
* Starts the threads that process the debugger input/output channels.
* To be invoked by the initialization routine of the extending class.

View file

@ -0,0 +1,732 @@
/*******************************************************************************
* Copyright (c) 2000, 2010 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* ENEA Software AB - CLI command extension - fix for bug 190277
* Ericsson - Implementation for DSF-GDB
*******************************************************************************/
package org.eclipse.cdt.dsf.mi.service.command;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext;
import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext;
import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
import org.eclipse.cdt.dsf.debug.service.IModules.IModuleDMContext;
import org.eclipse.cdt.dsf.debug.service.IModules.ISymbolDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceTargetDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIAttach;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIDetach;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIExecAbort;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIInfoSharedLibrary;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIInfoThreads;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIJump;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIPasscount;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIRecord;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLISource;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIThread;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLITrace;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIUnsetEnv;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakAfter;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakCondition;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakDelete;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakDisable;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakEnable;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakInsert;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakList;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakPasscount;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakWatch;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataDisassemble;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataEvaluateExpression;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataListRegisterNames;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataListRegisterValues;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataReadMemory;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIDataWriteMemory;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIEnvironmentCD;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIEnvironmentDirectory;
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.MIExecInterrupt;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecJump;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecNext;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecNextInstruction;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReturn;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReverseContinue;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReverseNext;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReverseNextInstruction;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReverseStep;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecReverseStepInstruction;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecRun;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecStep;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecStepInstruction;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecUncall;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecUntil;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIFileExecAndSymbols;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIFileExecFile;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIFileSymbolFile;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBExit;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSet;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetArgs;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetAutoSolib;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetEnv;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetNonStop;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetPagination;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetSolibSearchPath;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBSetTargetAsync;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBShowExitCode;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIInferiorTTYSet;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIInterpreterExec;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIInterpreterExecConsole;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIListThreadGroups;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIStackInfoDepth;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIStackListArguments;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIStackListFrames;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIStackListLocals;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIStackSelectFrame;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetAttach;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetDetach;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetSelect;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetSelectCore;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITargetSelectTFile;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIThreadInfo;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIThreadListIds;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIThreadSelect;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceDefineVariable;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceListVariables;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceSave;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceStart;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceStatus;
import org.eclipse.cdt.dsf.mi.service.command.commands.MITraceStop;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarAssign;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarCreate;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarDelete;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarEvaluateExpression;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarInfoExpression;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarInfoNumChildren;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarInfoPathExpression;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarInfoType;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarListChildren;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarSetFormat;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarShowAttributes;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarShowFormat;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarUpdate;
import org.eclipse.cdt.dsf.mi.service.command.output.CLIInfoSharedLibraryInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.CLIInfoThreadsInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.CLIThreadInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.CLITraceInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakListInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataDisassembleInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataEvaluateExpressionInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataListRegisterNamesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataListRegisterValuesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataReadMemoryInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataWriteMemoryInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIGDBShowExitCodeInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIListThreadGroupsInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIStackInfoDepthInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIStackListArgumentsInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIStackListFramesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIStackListLocalsInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIThreadInfoInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIThreadListIdsInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MITraceListVariablesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MITraceStatusInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MITraceStopInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarAssignInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarCreateInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarDeleteInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarEvaluateExpressionInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarInfoExpressionInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarInfoNumChildrenInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarInfoPathExpressionInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarInfoTypeInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarListChildrenInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarSetFormatInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarShowAttributesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarShowFormatInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarUpdateInfo;
/**
* Factory to create MI/CLI commands.
*
* @since 3.0
*/
public class CommandFactory {
public ICommand<MIInfo> createCLIAttach(IDMContext ctx, int pid) {
return new CLIAttach(ctx, pid);
}
public ICommand<MIInfo> createCLIAttach(ICommandControlDMContext ctx, String pid) {
return new CLIAttach(ctx, pid);
}
public ICommand<MIInfo> createCLIDetach(IDMContext ctx) {
return new CLIDetach(ctx);
}
public ICommand<MIInfo> createCLIExecAbort(ICommandControlDMContext ctx) {
return new CLIExecAbort(ctx);
}
public ICommand<CLIInfoSharedLibraryInfo> createCLIInfoSharedLibrary(ISymbolDMContext ctx) {
return new CLIInfoSharedLibrary(ctx);
}
public ICommand<CLIInfoSharedLibraryInfo> createCLIInfoSharedLibrary(IModuleDMContext ctx) {
return new CLIInfoSharedLibrary(ctx);
}
public ICommand<CLIInfoThreadsInfo> createCLIInfoThreads(IContainerDMContext ctx) {
return new CLIInfoThreads(ctx);
}
public ICommand<MIInfo> createCLIJump(IExecutionDMContext ctx, String location) {
return new CLIJump(ctx, location);
}
public ICommand<MIInfo> createCLIPasscount(IBreakpointsTargetDMContext ctx, int breakpoint, int passcount) {
return new CLIPasscount(ctx, breakpoint, passcount);
}
public ICommand<MIInfo> createCLIRecord(ICommandControlDMContext ctx, boolean enable) {
return new CLIRecord(ctx, enable);
}
public ICommand<MIInfo> createCLISource(ICommandControlDMContext ctx, String file) {
return new CLISource(ctx, file);
}
public ICommand<CLIThreadInfo> createCLIThread(IContainerDMContext ctx) {
return new CLIThread(ctx);
}
public ICommand<CLITraceInfo> createCLITrace(IBreakpointsTargetDMContext ctx, String location) {
return new CLITrace(ctx, location);
}
public ICommand<CLITraceInfo> createCLITrace(IBreakpointsTargetDMContext ctx, String location, String condition) {
return new CLITrace(ctx, location, condition);
}
public ICommand<MIInfo> createCLIUnsetEnv(ICommandControlDMContext ctx) {
return new CLIUnsetEnv(ctx);
}
public ICommand<MIInfo> createCLIUnsetEnv(ICommandControlDMContext ctx, String name) {
return new CLIUnsetEnv(ctx, name);
}
public ICommand<MIInfo> createMIBreakAfter(IBreakpointsTargetDMContext ctx, int breakpoint, int ignoreCount) {
return new MIBreakAfter(ctx, breakpoint, ignoreCount);
}
public ICommand<MIInfo> createMIBreakCondition(IBreakpointsTargetDMContext ctx, int breakpoint, String condition) {
return new MIBreakCondition(ctx, breakpoint, condition);
}
public ICommand<MIInfo> createMIBreakDelete(IBreakpointsTargetDMContext ctx, int[] array) {
return new MIBreakDelete(ctx, array);
}
public ICommand<MIInfo> createMIBreakDisable(IBreakpointsTargetDMContext ctx, int[] array) {
return new MIBreakDisable(ctx, array);
}
public ICommand<MIInfo> createMIBreakEnable(IBreakpointsTargetDMContext ctx, int[] array) {
return new MIBreakEnable(ctx, array);
}
public ICommand<MIBreakInsertInfo> createMIBreakInsert(IBreakpointsTargetDMContext ctx, String func) {
return new MIBreakInsert(ctx, func);
}
public ICommand<MIBreakInsertInfo> createMIBreakInsert(IBreakpointsTargetDMContext ctx, boolean isTemporary,
boolean isHardware, String condition, int ignoreCount,
String line, int tid) {
return new MIBreakInsert(ctx, isTemporary, isHardware, condition, ignoreCount, line, tid);
}
public ICommand<MIBreakInsertInfo> createMIBreakInsert(IBreakpointsTargetDMContext ctx, boolean isTemporary,
boolean isHardware, String condition, int ignoreCount,
String location, int tid, boolean disabled, boolean isTracepoint) {
return new MIBreakInsert(ctx, isTemporary, isHardware, condition, ignoreCount, location, tid, disabled, isTracepoint);
}
public ICommand<MIBreakListInfo> createMIBreakList(IBreakpointsTargetDMContext ctx) {
return new MIBreakList(ctx);
}
public ICommand<MIInfo> createMIBreakPasscount(IBreakpointsTargetDMContext ctx, int tracepoint, int passCount) {
return new MIBreakPasscount(ctx, tracepoint, passCount);
}
public ICommand<MIBreakInsertInfo> createMIBreakWatch(IBreakpointsTargetDMContext ctx, boolean isRead, boolean isWrite, String expression) {
return new MIBreakWatch(ctx, isRead, isWrite, expression);
}
public ICommand<MIDataDisassembleInfo> createMIDataDisassemble(IDisassemblyDMContext ctx, String start, String end, boolean mode) {
return new MIDataDisassemble(ctx, start, end, mode);
}
public ICommand<MIDataDisassembleInfo> createMIDataDisassemble(IDisassemblyDMContext ctx, String file, int linenum, int lines, boolean mode) {
return new MIDataDisassemble(ctx, file, linenum, lines, mode);
}
public ICommand<MIDataEvaluateExpressionInfo> createMIDataEvaluateExpression(ICommandControlDMContext ctx, String expr) {
return new MIDataEvaluateExpression<MIDataEvaluateExpressionInfo>(ctx, expr);
}
public ICommand<MIDataEvaluateExpressionInfo> createMIDataEvaluateExpression(IMIExecutionDMContext execDmc, String expr) {
return new MIDataEvaluateExpression<MIDataEvaluateExpressionInfo>(execDmc, expr);
}
public ICommand<MIDataEvaluateExpressionInfo> createMIDataEvaluateExpression(IFrameDMContext frameDmc, String expr) {
return new MIDataEvaluateExpression<MIDataEvaluateExpressionInfo>(frameDmc, expr);
}
public ICommand<MIDataEvaluateExpressionInfo> createMIDataEvaluateExpression(IExpressionDMContext exprDmc) {
return new MIDataEvaluateExpression<MIDataEvaluateExpressionInfo>(exprDmc);
}
public ICommand<MIDataListRegisterNamesInfo> createMIDataListRegisterNames(IContainerDMContext ctx) {
return new MIDataListRegisterNames(ctx);
}
public ICommand<MIDataListRegisterNamesInfo> createMIDataListRegisterNames(IContainerDMContext ctx, int [] regnos) {
return new MIDataListRegisterNames(ctx, regnos);
}
public ICommand<MIDataListRegisterValuesInfo> createMIDataListRegisterValues(IMIExecutionDMContext ctx, int fmt) {
return new MIDataListRegisterValues(ctx, fmt);
}
public ICommand<MIDataListRegisterValuesInfo> createMIDataListRegisterValues(IMIExecutionDMContext ctx, int fmt, int [] regnos) {
return new MIDataListRegisterValues(ctx, fmt, regnos);
}
public ICommand<MIDataReadMemoryInfo> createMIDataReadMemory(IDMContext ctx, long offset, String address,
int word_format, int word_size, int rows, int cols,
Character asChar) {
return new MIDataReadMemory(ctx, offset, address, word_format, word_size, rows, cols, asChar);
}
public ICommand<MIDataWriteMemoryInfo> createMIDataWriteMemory(IDMContext ctx, long offset, String address,
int wordFormat, int wordSize, String value) {
return new MIDataWriteMemory(ctx, offset, address, wordFormat, wordSize, value);
}
public ICommand<MIInfo> createMIEnvironmentCD(ICommandControlDMContext ctx, String path) {
return new MIEnvironmentCD(ctx, path);
}
public ICommand<MIInfo> createMIEnvironmentDirectory(IDMContext ctx, String[] paths, boolean reset) {
return new MIEnvironmentDirectory(ctx, paths, reset);
}
public ICommand<MIInfo> createMIExecContinue(IExecutionDMContext dmc) {
return new MIExecContinue(dmc);
}
public ICommand<MIInfo> createMIExecContinue(IExecutionDMContext dmc, boolean allThreads) {
return new MIExecContinue(dmc, allThreads);
}
public ICommand<MIInfo> createMIExecContinue(IExecutionDMContext dmc, String groupId) {
return new MIExecContinue(dmc, groupId);
}
public ICommand<MIInfo> createMIExecFinish(IFrameDMContext dmc) {
return new MIExecFinish(dmc);
}
public ICommand<MIInfo> createMIExecInterrupt(IExecutionDMContext dmc) {
return new MIExecInterrupt(dmc);
}
public ICommand<MIInfo> createMIExecInterrupt(IExecutionDMContext dmc, boolean allThreads) {
return new MIExecInterrupt(dmc, allThreads);
}
public ICommand<MIInfo> createMIExecInterrupt(IExecutionDMContext dmc, String groupId) {
return new MIExecInterrupt(dmc, groupId);
}
public ICommand<MIInfo> createMIExecJump(IExecutionDMContext ctx, String location) {
return new MIExecJump(ctx, location);
}
public ICommand<MIInfo> createMIExecNextInstruction(IExecutionDMContext dmc) {
return new MIExecNextInstruction(dmc);
}
public ICommand<MIInfo> createMIExecNextInstruction(IExecutionDMContext dmc, int count) {
return new MIExecNextInstruction(dmc, count);
}
public ICommand<MIInfo> createMIExecNext(IExecutionDMContext dmc) {
return new MIExecNext(dmc);
}
public ICommand<MIInfo> createMIExecNext(IExecutionDMContext dmc, int count) {
return new MIExecNext(dmc, count);
}
public ICommand<MIInfo> createMIExecReturn(IFrameDMContext dmc) {
return new MIExecReturn(dmc);
}
public ICommand<MIInfo> createMIExecReturn(IFrameDMContext dmc, String arg) {
return new MIExecReturn(dmc, arg);
}
public ICommand<MIInfo> createMIExecReverseContinue(IExecutionDMContext dmc) {
return new MIExecReverseContinue(dmc);
}
public ICommand<MIInfo> createMIExecReverseNextInstruction(IExecutionDMContext dmc) {
return new MIExecReverseNextInstruction(dmc);
}
public ICommand<MIInfo> createMIExecReverseNextInstruction(IExecutionDMContext dmc, int count) {
return new MIExecReverseNextInstruction(dmc, count);
}
public ICommand<MIInfo> createMIExecReverseNext(IExecutionDMContext dmc) {
return new MIExecReverseNext(dmc);
}
public ICommand<MIInfo> createMIExecReverseNext(IExecutionDMContext dmc, int count) {
return new MIExecReverseNext(dmc, count);
}
public ICommand<MIInfo> createMIExecReverseStepInstruction(IExecutionDMContext dmc) {
return new MIExecReverseStepInstruction(dmc);
}
public ICommand<MIInfo> createMIExecReverseStepInstruction(IExecutionDMContext dmc, int count) {
return new MIExecReverseStepInstruction(dmc, count);
}
public ICommand<MIInfo> createMIExecReverseStep(IExecutionDMContext dmc) {
return new MIExecReverseStep(dmc);
}
public ICommand<MIInfo> createMIExecReverseStep(IExecutionDMContext dmc, int count) {
return new MIExecReverseStep(dmc, count);
}
public ICommand<MIInfo> createMIExecRun(IExecutionDMContext dmc) {
return new MIExecRun(dmc);
}
public ICommand<MIInfo> createMIExecRun(IExecutionDMContext dmc, String[] args) {
return new MIExecRun(dmc, args);
}
public ICommand<MIInfo> createMIExecStepInstruction(IExecutionDMContext dmc) {
return new MIExecStepInstruction(dmc);
}
public ICommand<MIInfo> createMIExecStepInstruction(IExecutionDMContext dmc, int count) {
return new MIExecStepInstruction(dmc, count);
}
public ICommand<MIInfo> createMIExecStep(IExecutionDMContext dmc) {
return new MIExecStep(dmc);
}
public ICommand<MIInfo> createMIExecStep(IExecutionDMContext dmc, int count) {
return new MIExecStep(dmc, count);
}
public ICommand<MIInfo> createMIExecUncall(IFrameDMContext dmc) {
return new MIExecUncall(dmc);
}
public ICommand<MIInfo> createMIExecUntil(IExecutionDMContext dmc) {
return new MIExecUntil(dmc);
}
public ICommand<MIInfo> createMIExecUntil(IExecutionDMContext dmc, String loc) {
return new MIExecUntil(dmc, loc);
}
public ICommand<MIInfo> createMIFileExecAndSymbols(ICommandControlDMContext dmc, String file) {
return new MIFileExecAndSymbols(dmc, file);
}
public ICommand<MIInfo> createMIFileExecAndSymbols(ICommandControlDMContext dmc) {
return new MIFileExecAndSymbols(dmc);
}
public ICommand<MIInfo> createMIFileExecFile(ICommandControlDMContext dmc, String file) {
return new MIFileExecFile(dmc, file);
}
public ICommand<MIInfo> createMIFileExecFile(ICommandControlDMContext dmc) {
return new MIFileExecFile(dmc);
}
public ICommand<MIInfo> createMIFileSymbolFile(ICommandControlDMContext dmc, String file) {
return new MIFileSymbolFile(dmc, file);
}
public ICommand<MIInfo> createMIFileSymbolFile(ICommandControlDMContext dmc) {
return new MIFileSymbolFile(dmc);
}
public ICommand<MIInfo> createMIGDBExit(IDMContext ctx) {
return new MIGDBExit(ctx);
}
public ICommand<MIInfo> createMIGDBSet(IDMContext ctx, String[] params) {
return new MIGDBSet(ctx, params);
}
public ICommand<MIInfo> createMIGDBSetArgs(ICommandControlDMContext dmc) {
return new MIGDBSetArgs(dmc);
}
public ICommand<MIInfo> createMIGDBSetArgs(ICommandControlDMContext dmc, String arguments) {
return new MIGDBSetArgs(dmc, arguments);
}
public ICommand<MIInfo> createMIGDBSetAutoSolib(ICommandControlDMContext ctx, boolean isSet) {
return new MIGDBSetAutoSolib(ctx, isSet);
}
public ICommand<MIInfo> createMIGDBSetEnv(ICommandControlDMContext dmc, String name) {
return new MIGDBSetEnv(dmc, name);
}
public ICommand<MIInfo> createMIGDBSetEnv(ICommandControlDMContext dmc, String name, String value) {
return new MIGDBSetEnv(dmc, name, value);
}
public ICommand<MIInfo> createMIGDBSetNonStop(ICommandControlDMContext ctx, boolean isSet) {
return new MIGDBSetNonStop(ctx, isSet);
}
public ICommand<MIInfo> createMIGDBSetPagination(ICommandControlDMContext ctx, boolean isSet) {
return new MIGDBSetPagination(ctx, isSet);
}
public ICommand<MIInfo> createMIGDBSetSolibSearchPath(ICommandControlDMContext ctx, String[] paths) {
return new MIGDBSetSolibSearchPath(ctx, paths);
}
public ICommand<MIInfo> createMIGDBSetTargetAsync(ICommandControlDMContext ctx, boolean isSet) {
return new MIGDBSetTargetAsync(ctx, isSet);
}
public ICommand<MIGDBShowExitCodeInfo> createMIGDBShowExitCode(ICommandControlDMContext ctx) {
return new MIGDBShowExitCode(ctx);
}
public ICommand<MIInfo> createMIInferiorTTYSet(ICommandControlDMContext dmc, String tty) {
return new MIInferiorTTYSet(dmc, tty);
}
public ICommand<MIInfo> createMIInterpreterExecConsole(IDMContext ctx, String cmd) {
return new MIInterpreterExecConsole<MIInfo>(ctx, cmd);
}
public ICommand<MIInfo> createMIInterpreterExec(IDMContext ctx, String interpreter, String cmd) {
return new MIInterpreterExec<MIInfo>(ctx, interpreter, cmd);
}
public ICommand<MIListThreadGroupsInfo> createMIListThreadGroups(ICommandControlDMContext ctx) {
return new MIListThreadGroups(ctx);
}
public ICommand<MIListThreadGroupsInfo> createMIListThreadGroups(ICommandControlDMContext ctx, String groupId) {
return new MIListThreadGroups(ctx, groupId);
}
public ICommand<MIListThreadGroupsInfo> createMIListThreadGroups(ICommandControlDMContext ctx, boolean listAll) {
return new MIListThreadGroups(ctx, listAll);
}
public ICommand<MIStackInfoDepthInfo> createMIStackInfoDepth(IMIExecutionDMContext ctx) {
return new MIStackInfoDepth(ctx);
}
public ICommand<MIStackInfoDepthInfo> createMIStackInfoDepth(IMIExecutionDMContext ctx, int maxDepth) {
return new MIStackInfoDepth(ctx, maxDepth);
}
public ICommand<MIStackListArgumentsInfo> createMIStackListArguments(IMIExecutionDMContext execDmc, boolean showValues) {
return new MIStackListArguments(execDmc, showValues);
}
public ICommand<MIStackListArgumentsInfo> createMIStackListArguments(IFrameDMContext frameDmc, boolean showValues) {
return new MIStackListArguments(frameDmc, showValues);
}
public ICommand<MIStackListArgumentsInfo> createMIStackListArguments(IMIExecutionDMContext execDmc, boolean showValues, int low, int high) {
return new MIStackListArguments(execDmc, showValues, low, high);
}
public ICommand<MIStackListFramesInfo> createMIStackListFrames(IMIExecutionDMContext execDmc) {
return new MIStackListFrames(execDmc);
}
public ICommand<MIStackListFramesInfo> createMIStackListFrames(IMIExecutionDMContext execDmc, int low, int high) {
return new MIStackListFrames(execDmc, low, high);
}
public ICommand<MIStackListLocalsInfo> createMIStackListLocals(IFrameDMContext frameCtx, boolean printValues) {
return new MIStackListLocals(frameCtx, printValues);
}
public ICommand<MIInfo> createMIStackSelectFrame(IDMContext ctx, int frameNum) {
return new MIStackSelectFrame(ctx, frameNum);
}
public ICommand<MIInfo> createMITargetAttach(ICommandControlDMContext ctx, String groupId) {
return new MITargetAttach(ctx, groupId);
}
public ICommand<MIInfo> createMITargetDetach(ICommandControlDMContext ctx, String groupId) {
return new MITargetDetach(ctx, groupId);
}
public ICommand<MIInfo> createMITargetSelect(IDMContext ctx, String host, String port, boolean extended) {
return new MITargetSelect(ctx, host, port, extended);
}
public ICommand<MIInfo> createMITargetSelect(IDMContext ctx, String serialDevice, boolean extended) {
return new MITargetSelect(ctx, serialDevice, extended);
}
public ICommand<MIInfo> createMITargetSelectCore(IDMContext ctx, String coreFilePath) {
return new MITargetSelectCore(ctx, coreFilePath);
}
public ICommand<MIInfo> createMITargetSelectTFile(IDMContext ctx, String traceFilePath) {
return new MITargetSelectTFile(ctx, traceFilePath);
}
public ICommand<MIThreadInfoInfo> createMIThreadInfo(ICommandControlDMContext dmc) {
return new MIThreadInfo(dmc);
}
public ICommand<MIThreadInfoInfo> createMIThreadInfo(ICommandControlDMContext dmc, String threadId) {
return new MIThreadInfo(dmc, threadId);
}
public ICommand<MIThreadListIdsInfo> createMIThreadListIds(IContainerDMContext contDmc) {
return new MIThreadListIds(contDmc);
}
public ICommand<MIInfo> createMIThreadSelect(IDMContext ctx, int threadNum) {
return new MIThreadSelect(ctx, threadNum);
}
public ICommand<MIInfo> createMIThreadSelect(IDMContext ctx, String threadNum) {
return new MIThreadSelect(ctx, threadNum);
}
public ICommand<MIInfo> createMITraceDefineVariable(ITraceTargetDMContext ctx, String varName) {
return new MITraceDefineVariable(ctx, varName);
}
public ICommand<MIInfo> createMITraceDefineVariable(ITraceTargetDMContext ctx, String varName, String varValue) {
return new MITraceDefineVariable(ctx, varName, varValue);
}
public ICommand<MITraceListVariablesInfo> createMITraceListVariables(ITraceTargetDMContext ctx) {
return new MITraceListVariables(ctx);
}
public ICommand<MIInfo> createMITraceSave(ITraceTargetDMContext ctx, String file, boolean remoteSave) {
return new MITraceSave(ctx, file, remoteSave);
}
public ICommand<MIInfo> createMITraceStart(ITraceTargetDMContext ctx) {
return new MITraceStart(ctx);
}
public ICommand<MITraceStatusInfo> createMITraceStatus(ITraceTargetDMContext ctx) {
return new MITraceStatus(ctx);
}
public ICommand<MITraceStopInfo> createMITraceStop(ITraceTargetDMContext ctx) {
return new MITraceStop(ctx);
}
public ICommand<MIVarAssignInfo> createMIVarAssign(ICommandControlDMContext ctx, String name, String expression) {
return new MIVarAssign(ctx, name, expression);
}
public ICommand<MIVarCreateInfo> createMIVarCreate(IExpressionDMContext dmc, String expression) {
return new MIVarCreate(dmc, expression);
}
public ICommand<MIVarCreateInfo> createMIVarCreate(IExpressionDMContext dmc, String name, String expression) {
return new MIVarCreate(dmc, name, expression);
}
public ICommand<MIVarCreateInfo> createMIVarCreate(IExpressionDMContext dmc, String name, String frameAddr, String expression) {
return new MIVarCreate(dmc, name, frameAddr, expression);
}
public ICommand<MIVarDeleteInfo> createMIVarDelete(ICommandControlDMContext dmc, String name) {
return new MIVarDelete(dmc, name);
}
public ICommand<MIVarEvaluateExpressionInfo> createMIVarEvaluateExpression(ICommandControlDMContext dmc, String name) {
return new MIVarEvaluateExpression(dmc, name);
}
public ICommand<MIVarInfoExpressionInfo> createMIVarInfoExpression(ICommandControlDMContext ctx, String name) {
return new MIVarInfoExpression(ctx, name);
}
public ICommand<MIVarInfoNumChildrenInfo> createMIVarInfoNumChildren(IExpressionDMContext ctx, String name) {
return new MIVarInfoNumChildren(ctx, name);
}
public ICommand<MIVarInfoPathExpressionInfo> createMIVarInfoPathExpression(ICommandControlDMContext dmc, String name) {
return new MIVarInfoPathExpression(dmc, name);
}
public ICommand<MIVarInfoTypeInfo> createMIVarInfoType(ICommandControlDMContext ctx, String name) {
return new MIVarInfoType(ctx, name);
}
public ICommand<MIVarListChildrenInfo> createMIVarListChildren(ICommandControlDMContext ctx, String name) {
return new MIVarListChildren(ctx, name);
}
public ICommand<MIVarSetFormatInfo> createMIVarSetFormat(ICommandControlDMContext ctx, String name, String fmt) {
return new MIVarSetFormat(ctx, name, fmt);
}
public ICommand<MIVarShowAttributesInfo> createMIVarShowAttributes(ICommandControlDMContext ctx, String name) {
return new MIVarShowAttributes(ctx, name);
}
public ICommand<MIVarShowFormatInfo> createMIVarShowFormat(ICommandControlDMContext ctx, String name) {
return new MIVarShowFormat(ctx, name);
}
public ICommand<MIVarUpdateInfo> createMIVarUpdate(ICommandControlDMContext dmc, String name) {
return new MIVarUpdate(dmc, name);
}
}

View file

@ -32,16 +32,16 @@ import org.eclipse.cdt.dsf.concurrent.ThreadSafe;
import org.eclipse.cdt.dsf.concurrent.ThreadSafeAndProhibitedFromDsfExecutor;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.debug.service.command.ICommandListener;
import org.eclipse.cdt.dsf.debug.service.command.ICommandResult;
import org.eclipse.cdt.dsf.debug.service.command.ICommandToken;
import org.eclipse.cdt.dsf.debug.service.command.IEventListener;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.MIProcesses.ContainerExitedDMEvent;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLICommand;
import org.eclipse.cdt.dsf.mi.service.command.commands.CLIExecAbort;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIGDBShowExitCode;
import org.eclipse.cdt.dsf.mi.service.command.output.MIConst;
import org.eclipse.cdt.dsf.mi.service.command.output.MIExecAsyncOutput;
import org.eclipse.cdt.dsf.mi.service.command.output.MIGDBShowExitCodeInfo;
@ -83,6 +83,7 @@ public class MIInferiorProcess extends Process
private final PTY fPty;
private final ICommandControlService fCommandControl;
private CommandFactory fCommandFactory;
private IContainerDMContext fContainerDMContext;
@ -146,6 +147,13 @@ public class MIInferiorProcess extends Process
fCommandControl = commandControl;
fSession = commandControl.getSession();
if (fCommandControl instanceof IMICommandControl) {
fCommandFactory = ((IMICommandControl)fCommandControl).getCommandFactory();
} else {
// Should not happen
fCommandFactory = new CommandFactory();
}
commandControl.addEventListener(this);
commandControl.addCommandListener(this);
@ -282,7 +290,7 @@ public class MIInferiorProcess extends Process
rm.done();
} else {
getCommandControlService().queueCommand(
new MIGDBShowExitCode(getCommandControlService().getContext()),
fCommandFactory.createMIGDBShowExitCode(getCommandControlService().getContext()),
new DataRequestMonitor<MIGDBShowExitCodeInfo>(fSession.getExecutor(), rm) {
@Override
protected void handleSuccess() {
@ -355,7 +363,7 @@ public class MIInferiorProcess extends Process
// To avoid a RejectedExecutionException, use an executor that
// immediately executes in the same dispatch cycle.
CLIExecAbort cmd = new CLIExecAbort(getCommandControlService().getContext());
ICommand<MIInfo> cmd = fCommandFactory.createCLIExecAbort(getCommandControlService().getContext());
getCommandControlService().queueCommand(
cmd,
new DataRequestMonitor<MIInfo>(ImmediateExecutor.getInstance(), null) {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2009 QNX Software Systems and others.
* Copyright (c) 2010 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -35,7 +35,7 @@ public class MIVarUpdate extends MICommand<MIVarUpdateInfo> {
* @since 1.1
*/
public MIVarUpdate(ICommandControlDMContext dmc, String name) {
super(dmc, "-var-update", new String[] { "1", name }); //$NON-NLS-1$//$NON-NLS-2$
super(dmc, "-var-update", new String[] { "1" }, new String[] { name }); //$NON-NLS-1$//$NON-NLS-2$
}
@Override

View file

@ -0,0 +1,22 @@
/**********************************************************************
* Copyright (c) 2006, 2010 Nokia and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nokia - Initial API and implementation
* Marc-Andre Laperle - fix for bug 263689 (spaces in directory)
***********************************************************************/
package org.eclipse.cdt.dsf.mi.service.command.commands.macos;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIEnvironmentCD;
public class MacOSMIEnvironmentCD extends MIEnvironmentCD {
public MacOSMIEnvironmentCD(ICommandControlDMContext ctx, String path) {
super(ctx, '\"' + path + '\"');
}
}

View file

@ -14,8 +14,9 @@
package org.eclipse.cdt.dsf.mi.service.command.commands.macos;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
import org.eclipse.cdt.dsf.mi.service.command.commands.MICommand;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIVarUpdate;
import org.eclipse.cdt.dsf.mi.service.command.output.MIOutput;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarUpdateInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.macos.MacOSMIVarUpdateInfo;
/**
@ -35,15 +36,16 @@ import org.eclipse.cdt.dsf.mi.service.command.output.macos.MacOSMIVarUpdateInfo;
*
* @since 3.0
*/
public class MacOSMIVarUpdate extends MICommand<MacOSMIVarUpdateInfo> {
public class MacOSMIVarUpdate extends MIVarUpdate {
public MacOSMIVarUpdate(ICommandControlDMContext dmc, String name) {
super(dmc, name);
// Must use --all-values instead of 1 for Mac OS
super(dmc, "-var-update", new String[] { "--all-values", name }); //$NON-NLS-1$//$NON-NLS-2$
setOptions(new String[] { "--all-values" }); //$NON-NLS-1$
}
@Override
public MacOSMIVarUpdateInfo getResult(MIOutput out) {
public MIVarUpdateInfo getResult(MIOutput out) {
return new MacOSMIVarUpdateInfo(out);
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2006 QNX Software Systems and others.
* Copyright (c) 2000, 2010 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -52,10 +52,9 @@ public class MIVarUpdateInfo extends MIInfo {
/**
* For MI2 the format is now a MIList.
* @param tuple
* @param aList
* @since 3.0
*/
void parseChangeList(MIList miList, List<MIVarChange> aList) {
protected void parseChangeList(MIList miList, List<MIVarChange> aList) {
MIValue[] values = miList.getMIValues();
for (int i = 0; i < values.length; ++i) {
if (values[i] instanceof MITuple) {
@ -66,7 +65,10 @@ public class MIVarUpdateInfo extends MIInfo {
}
}
void parseChangeList(MITuple tuple, List<MIVarChange> aList) {
/**
* @since 3.0
*/
protected void parseChangeList(MITuple tuple, List<MIVarChange> aList) {
MIResult[] results = tuple.getMIResults();
MIVarChange change = null;
for (int i = 0; i < results.length; i++) {

View file

@ -11,18 +11,15 @@
*******************************************************************************/
package org.eclipse.cdt.dsf.mi.service.command.output.macos;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.dsf.mi.service.command.output.MIConst;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIList;
import org.eclipse.cdt.dsf.mi.service.command.output.MIOutput;
import org.eclipse.cdt.dsf.mi.service.command.output.MIResult;
import org.eclipse.cdt.dsf.mi.service.command.output.MIResultRecord;
import org.eclipse.cdt.dsf.mi.service.command.output.MITuple;
import org.eclipse.cdt.dsf.mi.service.command.output.MIValue;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarChange;
import org.eclipse.cdt.dsf.mi.service.command.output.MIVarUpdateInfo;
/**
* GDB/MI var-update for Mac OS.
@ -31,36 +28,10 @@ import org.eclipse.cdt.dsf.mi.service.command.output.MIVarChange;
*
* @since 3.0
*/
public class MacOSMIVarUpdateInfo extends MIInfo {
MIVarChange[] changeList;
public class MacOSMIVarUpdateInfo extends MIVarUpdateInfo {
public MacOSMIVarUpdateInfo(MIOutput record) {
super(record);
List<MIVarChange> aList = new ArrayList<MIVarChange>();
if (isDone()) {
MIOutput out = getMIOutput();
MIResultRecord rr = out.getMIResultRecord();
if (rr != null) {
MIResult[] results = rr.getMIResults();
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
if (var.equals("changelist")) { //$NON-NLS-1$
MIValue value = results[i].getMIValue();
if (value instanceof MITuple) {
parseChangeList((MITuple)value, aList);
} else if (value instanceof MIList) {
parseChangeList((MIList)value, aList);
}
}
}
}
}
changeList = aList.toArray(new MIVarChange[aList.size()]);
}
public MIVarChange[] getMIVarChanges() {
return changeList;
}
/**
@ -68,7 +39,8 @@ public class MacOSMIVarUpdateInfo extends MIInfo {
* @param tuple
* @param aList
*/
void parseChangeList(MIList miList, List<MIVarChange> aList) {
@Override
protected void parseChangeList(MIList miList, List<MIVarChange> aList) {
// The MIList in Apple gdb contains MIResults instead of MIValues. It looks like:
// ^done,changelist=[varobj={name="var1",in_scope="true",type_changed="false"}],time={.....}
// Bug 250037
@ -84,40 +56,5 @@ public class MacOSMIVarUpdateInfo extends MIInfo {
}
}
}
}
void parseChangeList(MITuple tuple, List<MIVarChange> aList) {
MIResult[] results = tuple.getMIResults();
MIVarChange change = null;
for (int i = 0; i < results.length; i++) {
String var = results[i].getVariable();
MIValue value = results[i].getMIValue();
if (value instanceof MITuple) {
parseChangeList((MITuple)value, aList);
}
else
{
String str = ""; //$NON-NLS-1$
if (value instanceof MIConst) {
str = ((MIConst)value).getString();
}
if (var.equals("name")) { //$NON-NLS-1$
change = new MIVarChange(str);
aList.add(change);
} else if (var.equals("value")) { //$NON-NLS-1$
if (change != null) {
change.setValue(str);
}
} else if (var.equals("in_scope")) { //$NON-NLS-1$
if (change != null) {
change.setInScope("true".equals(str)); //$NON-NLS-1$
}
} else if (var.equals("type_changed")) { //$NON-NLS-1$
if (change != null) {
change.setChanged("true".equals(str)); //$NON-NLS-1$
}
}
}
}
}
}

View file

@ -33,19 +33,13 @@ import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.StepType;
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
import org.eclipse.cdt.dsf.mi.service.MIRunControl;
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.MIBreakInsert;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIBreakList;
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.MIExecNext;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecStep;
import org.eclipse.cdt.dsf.mi.service.command.commands.MIExecUntil;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.mi.service.command.events.MIRunningEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIStoppedEvent;
import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo;
@ -70,6 +64,8 @@ public class SyncUtil {
private static IExpressions fExpressions;
private static DsfSession fSession;
private static CommandFactory fCommandFactory;
private static IContainerDMContext fGdbContainerDmc;
private static IBreakpointsTargetDMContext fBreakpointsDmc;
@ -94,6 +90,8 @@ public class SyncUtil {
fStack = tracker.getService(MIStack.class);
fExpressions = tracker.getService(IExpressions.class);
fCommandFactory = tracker.getService(IMICommandControl.class).getCommandFactory();
tracker.dispose();
}
@ -138,13 +136,13 @@ public class SyncUtil {
// ServiceEvent telling us the program has been suspended again
switch(stepType) {
case STEP_INTO:
fCommandControl.queueCommand(new MIExecStep(dmc), null);
fCommandControl.queueCommand(fCommandFactory.createMIExecStep(dmc), null);
break;
case STEP_OVER:
fCommandControl.queueCommand(new MIExecNext(dmc), null);
fCommandControl.queueCommand(fCommandFactory.createMIExecNext(dmc), null);
break;
case STEP_RETURN:
fCommandControl.queueCommand(new MIExecFinish(fStack.createFrameDMContext(dmc, 0)), null);
fCommandControl.queueCommand(fCommandFactory.createMIExecFinish(fStack.createFrameDMContext(dmc, 0)), null);
break;
default:
Assert.assertTrue("Unsupported step type; " + stepType.toString(), false);
@ -175,7 +173,7 @@ public class SyncUtil {
// ServiceEvent telling us the program has been suspended again
fCommandControl.queueCommand(
new MIExecUntil(dmc, fileName + ":" + lineNo), //$NON-NLS-1$
fCommandFactory.createMIExecUntil(dmc, fileName + ":" + lineNo), //$NON-NLS-1$
null);
}
});
@ -232,7 +230,7 @@ public class SyncUtil {
};
fCommandControl.queueCommand(
new MIBreakInsert(fBreakpointsDmc, temporary, false, null, 0, location, 0),
fCommandFactory.createMIBreakInsert(fBreakpointsDmc, temporary, false, null, 0, location, 0),
addBreakDone);
wait.waitUntilDone(timeout);
@ -257,7 +255,7 @@ public class SyncUtil {
}
};
fCommandControl.queueCommand(new MIBreakList(fBreakpointsDmc), listDRM);
fCommandControl.queueCommand(fCommandFactory.createMIBreakList(fBreakpointsDmc), listDRM);
wait.waitUntilDone(timeout);
assertTrue(wait.getMessage(), wait.isOK());
@ -291,7 +289,7 @@ public class SyncUtil {
};
fCommandControl.queueCommand(
new MIBreakDelete(fBreakpointsDmc, breakpointIndices), //$NON-NLS-1$
fCommandFactory.createMIBreakDelete(fBreakpointsDmc, breakpointIndices), //$NON-NLS-1$
deleteBreakDone);
wait.waitUntilDone(timeout);
@ -310,7 +308,7 @@ public class SyncUtil {
// No need for a RequestMonitor since we will wait for the
// ServiceEvent telling us the program has been suspended again
fCommandControl.queueCommand(
new MIExecContinue(dmc),
fCommandFactory.createMIExecContinue(dmc),
null);
}
});
@ -338,7 +336,7 @@ public class SyncUtil {
// No need for a RequestMonitor since we will wait for the
// ServiceEvent telling us the program has been resumed
fCommandControl.queueCommand(
new MIExecContinue(dmc),
fCommandFactory.createMIExecContinue(dmc),
null);
}
});