mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-13 19:25:38 +02:00
Bug 372795 - Refactor common code in GDBControl* classes
This commit is contained in:
parent
35530262d8
commit
84e82daec5
7 changed files with 214 additions and 427 deletions
|
@ -11,6 +11,7 @@
|
|||
* Nokia - create and use backend service.
|
||||
* Vladimir Prus (CodeSourcery) - Support for -data-read-memory-bytes (bug 322658)
|
||||
* Jens Elmenthaler (Verigy) - Added Full GDB pretty-printing support (bug 302121)
|
||||
* Mikhail Khodjaiants (Mentor Graphics) - Refactor common code in GDBControl* classes (bug 372795)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.dsf.gdb.service.command;
|
||||
|
||||
|
@ -52,6 +53,7 @@ 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.IEventProcessor;
|
||||
import org.eclipse.cdt.dsf.mi.service.command.MIControlDMContext;
|
||||
import org.eclipse.cdt.dsf.mi.service.command.MIRunControlEventProcessor;
|
||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
||||
|
@ -100,17 +102,31 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
|||
|
||||
private IGDBBackend fMIBackend;
|
||||
|
||||
private MIRunControlEventProcessor fMIEventProcessor;
|
||||
private CLIEventProcessor fCLICommandProcessor;
|
||||
private IEventProcessor fMIEventProcessor;
|
||||
private IEventProcessor fCLICommandProcessor;
|
||||
private AbstractCLIProcess fCLIProcess;
|
||||
|
||||
/**
|
||||
* GDBControl is only used for GDB earlier that 7.0. Although -list-features
|
||||
* is available in 6.8, it does not report anything we care about, so
|
||||
* return empty list.
|
||||
*/
|
||||
private final List<String> fFeatures = new ArrayList<String>();
|
||||
|
||||
private boolean fTerminated;
|
||||
|
||||
/**
|
||||
* @since 3.0
|
||||
*/
|
||||
public GDBControl(DsfSession session, ILaunchConfiguration config, CommandFactory factory) {
|
||||
super(session, false, factory);
|
||||
this(session, false, config, factory);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.1
|
||||
*/
|
||||
protected GDBControl(DsfSession session, boolean useThreadAndFrameOptions, ILaunchConfiguration config, CommandFactory factory) {
|
||||
super(session, useThreadAndFrameOptions, factory);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -136,37 +152,18 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
|||
// have it, before we can create this context.
|
||||
fControlDmc = new GDBControlDMContext(getSession().getId(), getId());
|
||||
|
||||
final Sequence.Step[] initializeSteps = new Sequence.Step[] {
|
||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new RegisterStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||
};
|
||||
|
||||
Sequence startupSequence = new Sequence(getExecutor(), requestMonitor) {
|
||||
@Override public Step[] getSteps() { return initializeSteps; }
|
||||
};
|
||||
getExecutor().execute(startupSequence);
|
||||
getExecutor().execute(getStartupSequence(requestMonitor));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutdown(final RequestMonitor requestMonitor) {
|
||||
final Sequence.Step[] shutdownSteps = new Sequence.Step[] {
|
||||
new RegisterStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
};
|
||||
Sequence shutdownSequence =
|
||||
new Sequence(getExecutor(),
|
||||
new RequestMonitor(getExecutor(), requestMonitor) {
|
||||
getExecutor().execute(getShutdownSequence(new RequestMonitor(getExecutor(), requestMonitor) {
|
||||
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
GDBControl.super.shutdown(requestMonitor);
|
||||
}
|
||||
}) {
|
||||
@Override public Step[] getSteps() { return shutdownSteps; }
|
||||
};
|
||||
getExecutor().execute(shutdownSequence);
|
||||
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -403,8 +400,8 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
|||
return;
|
||||
}
|
||||
|
||||
fCLICommandProcessor = new CLIEventProcessor(GDBControl.this, fControlDmc);
|
||||
fMIEventProcessor = new MIRunControlEventProcessor(GDBControl.this, fControlDmc);
|
||||
fCLICommandProcessor = createCLIEventProcessor(GDBControl.this, fControlDmc);
|
||||
fMIEventProcessor = createMIRunControlEventProcessor(GDBControl.this, fControlDmc);
|
||||
|
||||
requestMonitor.done();
|
||||
}
|
||||
|
@ -443,13 +440,6 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GDBControl is only used for GDB earlier that 7.0. Although -list-features
|
||||
* is available in 6.8, it does not report anything we care about, so
|
||||
* return empty list.
|
||||
*/
|
||||
private final List<String> fFeatures = new ArrayList<String>();
|
||||
|
||||
/** @since 4.0 */
|
||||
@Override
|
||||
public List<String> getFeatures() {
|
||||
|
@ -471,4 +461,55 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
|||
public void setPrintPythonErrors(boolean enabled, RequestMonitor rm) {
|
||||
rm.done();
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.1
|
||||
*/
|
||||
protected Sequence getStartupSequence(final RequestMonitor requestMonitor) {
|
||||
final Sequence.Step[] initializeSteps = new Sequence.Step[] {
|
||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new RegisterStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||
};
|
||||
|
||||
return new Sequence(getExecutor(), requestMonitor) {
|
||||
@Override public Step[] getSteps() { return initializeSteps; }
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.1
|
||||
*/
|
||||
protected Sequence getShutdownSequence(RequestMonitor requestMonitor) {
|
||||
final Sequence.Step[] shutdownSteps = new Sequence.Step[] {
|
||||
new RegisterStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
};
|
||||
return new Sequence(getExecutor(), requestMonitor) {
|
||||
@Override public Step[] getSteps() { return shutdownSteps; }
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.1
|
||||
*/
|
||||
protected IEventProcessor createCLIEventProcessor(ICommandControlService connection, ICommandControlDMContext controlDmc) {
|
||||
return new CLIEventProcessor(connection, controlDmc);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.1
|
||||
*/
|
||||
protected IEventProcessor createMIRunControlEventProcessor(AbstractMIControl connection, ICommandControlDMContext controlDmc) {
|
||||
return new MIRunControlEventProcessor(connection, controlDmc);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.1
|
||||
*/
|
||||
protected void setFeatures(List<String> features) {
|
||||
fFeatures.clear();
|
||||
fFeatures.addAll(features);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,57 +12,29 @@
|
|||
* Vladimir Prus (CodeSourcery) - Support for -data-read-memory-bytes (bug 322658)
|
||||
* Jens Elmenthaler (Verigy) - Added Full GDB pretty-printing support (bug 302121)
|
||||
* Marc Khouzam (Ericsson) - Call new FinalLaunchSequence_7_0 (Bug 365471)
|
||||
* Mikhail Khodjaiants (Mentor Graphics) - Refactor common code in GDBControl* classes (bug 372795)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.dsf.gdb.service.command;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Hashtable;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
|
||||
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
||||
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
|
||||
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
|
||||
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
|
||||
import org.eclipse.cdt.dsf.concurrent.ImmediateRequestMonitor;
|
||||
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
||||
import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress;
|
||||
import org.eclipse.cdt.dsf.concurrent.Sequence;
|
||||
import org.eclipse.cdt.dsf.datamodel.AbstractDMEvent;
|
||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
|
||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
|
||||
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
||||
import org.eclipse.cdt.dsf.gdb.launching.FinalLaunchSequence_7_0;
|
||||
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
|
||||
import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceRecordSelectedChangedDMEvent;
|
||||
import org.eclipse.cdt.dsf.mi.service.IMIBackend;
|
||||
import org.eclipse.cdt.dsf.mi.service.IMIBackend.BackendStateChangedEvent;
|
||||
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
|
||||
import org.eclipse.cdt.dsf.mi.service.IMIRunControl;
|
||||
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.IEventProcessor;
|
||||
import org.eclipse.cdt.dsf.mi.service.command.MIRunControlEventProcessor_7_0;
|
||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIListFeaturesInfo;
|
||||
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
|
||||
import org.eclipse.cdt.dsf.service.DsfSession;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
import org.eclipse.debug.core.ILaunch;
|
||||
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||
import org.osgi.framework.BundleContext;
|
||||
|
||||
/**
|
||||
* GDB Debugger control implementation. This implementation extends the
|
||||
|
@ -71,374 +43,144 @@ import org.osgi.framework.BundleContext;
|
|||
* - CLI console support,<br>
|
||||
* - inferior process status tracking.<br>
|
||||
*/
|
||||
public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
|
||||
public class GDBControl_7_0 extends GDBControl {
|
||||
|
||||
/**
|
||||
* Event indicating that the back end process has started.
|
||||
* @deprecated use {@link GDBControl.InitializationShutdownStep}.
|
||||
*/
|
||||
private static class GDBControlInitializedDMEvent extends AbstractDMEvent<ICommandControlDMContext>
|
||||
implements ICommandControlInitializedDMEvent
|
||||
{
|
||||
public GDBControlInitializedDMEvent(ICommandControlDMContext context) {
|
||||
super(context);
|
||||
@Deprecated
|
||||
public static class InitializationShutdownStep extends GDBControl.InitializationShutdownStep {
|
||||
|
||||
/**
|
||||
* @deprecated use {@link GDBControl.InitializationShutdownStep.Direction}.
|
||||
*/
|
||||
@Deprecated
|
||||
public enum Direction { INITIALIZING, SHUTTING_DOWN }
|
||||
|
||||
public InitializationShutdownStep(Direction direction) {
|
||||
super((direction == Direction.INITIALIZING) ?
|
||||
GDBControl.InitializationShutdownStep.Direction.INITIALIZING :
|
||||
GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Event indicating that the CommandControl (back end process) has terminated.
|
||||
* @deprecated use {@link GDBControl.CommandMonitoringStep}.
|
||||
*/
|
||||
private static class GDBControlShutdownDMEvent extends AbstractDMEvent<ICommandControlDMContext>
|
||||
implements ICommandControlShutdownDMEvent
|
||||
{
|
||||
public GDBControlShutdownDMEvent(ICommandControlDMContext context) {
|
||||
super(context);
|
||||
@Deprecated
|
||||
protected class CommandMonitoringStep extends GDBControl.CommandMonitoringStep {
|
||||
|
||||
CommandMonitoringStep(GDBControl_7_0.InitializationShutdownStep.Direction direction) {
|
||||
super((direction == GDBControl_7_0.InitializationShutdownStep.Direction.INITIALIZING) ?
|
||||
GDBControl.InitializationShutdownStep.Direction.INITIALIZING :
|
||||
GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN);
|
||||
}
|
||||
}
|
||||
|
||||
private GDBControlDMContext fControlDmc;
|
||||
/**
|
||||
* @deprecated use {@link GDBControl.CommandProcessorsStep}.
|
||||
*/
|
||||
@Deprecated
|
||||
protected class CommandProcessorsStep extends GDBControl.CommandProcessorsStep {
|
||||
|
||||
private IGDBBackend fMIBackend;
|
||||
CommandProcessorsStep(GDBControl_7_0.InitializationShutdownStep.Direction direction) {
|
||||
super((direction == GDBControl_7_0.InitializationShutdownStep.Direction.INITIALIZING) ?
|
||||
GDBControl.InitializationShutdownStep.Direction.INITIALIZING :
|
||||
GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN);
|
||||
}
|
||||
}
|
||||
|
||||
private MIRunControlEventProcessor_7_0 fMIEventProcessor;
|
||||
private CLIEventProcessor_7_0 fCLICommandProcessor;
|
||||
private AbstractCLIProcess fCLIProcess;
|
||||
/**
|
||||
* @deprecated use {@link GDBControl.RegisterStep}.
|
||||
*/
|
||||
@Deprecated
|
||||
protected class RegisterStep extends GDBControl.RegisterStep {
|
||||
|
||||
private List<String> fFeatures = new ArrayList<String>();
|
||||
|
||||
private boolean fTerminated;
|
||||
RegisterStep(GDBControl_7_0.InitializationShutdownStep.Direction direction) {
|
||||
super((direction == GDBControl_7_0.InitializationShutdownStep.Direction.INITIALIZING) ?
|
||||
GDBControl.InitializationShutdownStep.Direction.INITIALIZING :
|
||||
GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.0
|
||||
*/
|
||||
public GDBControl_7_0(DsfSession session, ILaunchConfiguration config, CommandFactory factory) {
|
||||
super(session, true, factory);
|
||||
super(session, true, config, factory);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BundleContext getBundleContext() {
|
||||
return GdbPlugin.getBundleContext();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize(final RequestMonitor requestMonitor) {
|
||||
super.initialize(new ImmediateRequestMonitor(requestMonitor) {
|
||||
@Override
|
||||
protected void handleSuccess() {
|
||||
doInitialize(requestMonitor);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void doInitialize(final RequestMonitor requestMonitor) {
|
||||
fMIBackend = getServicesTracker().getService(IGDBBackend.class);
|
||||
|
||||
// getId uses the MIBackend service, which is why we must wait until we
|
||||
// have it, before we can create this context.
|
||||
fControlDmc = new GDBControlDMContext(getSession().getId(), getId());
|
||||
|
||||
protected Sequence getStartupSequence(RequestMonitor requestMonitor) {
|
||||
final Sequence.Step[] initializeSteps = new Sequence.Step[] {
|
||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new ListFeaturesStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new RegisterStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new GDBControl.CommandMonitoringStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new GDBControl.CommandProcessorsStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||
new GDBControl.RegisterStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||
};
|
||||
|
||||
Sequence startupSequence = new Sequence(getExecutor(), requestMonitor) {
|
||||
return new Sequence(getExecutor(), requestMonitor) {
|
||||
@Override public Step[] getSteps() { return initializeSteps; }
|
||||
};
|
||||
getExecutor().execute(startupSequence);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutdown(final RequestMonitor requestMonitor) {
|
||||
protected Sequence getShutdownSequence(RequestMonitor requestMonitor) {
|
||||
final Sequence.Step[] shutdownSteps = new Sequence.Step[] {
|
||||
new RegisterStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new ListFeaturesStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new GDBControl.RegisterStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new GDBControl.CommandProcessorsStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
new GDBControl.CommandMonitoringStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||
};
|
||||
Sequence shutdownSequence =
|
||||
new Sequence(getExecutor(),
|
||||
new RequestMonitor(getExecutor(), requestMonitor) {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
GDBControl_7_0.super.shutdown(requestMonitor);
|
||||
}
|
||||
}) {
|
||||
return new Sequence(getExecutor(), requestMonitor) {
|
||||
@Override public Step[] getSteps() { return shutdownSteps; }
|
||||
};
|
||||
getExecutor().execute(shutdownSequence);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return fMIBackend.getId();
|
||||
protected IEventProcessor createCLIEventProcessor(ICommandControlService connection, ICommandControlDMContext controlDmc) {
|
||||
return new CLIEventProcessor_7_0(connection, controlDmc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MIControlDMContext getControlDMContext() {
|
||||
return fControlDmc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICommandControlDMContext getContext() {
|
||||
return fControlDmc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void terminate(final RequestMonitor rm) {
|
||||
if (fTerminated) {
|
||||
rm.done();
|
||||
return;
|
||||
}
|
||||
fTerminated = true;
|
||||
|
||||
// To fix bug 234467:
|
||||
// Interrupt GDB in case the inferior is running.
|
||||
// That way, the inferior will also be killed when we exit GDB.
|
||||
//
|
||||
IMIRunControl runControl = getServicesTracker().getService(IMIRunControl.class);
|
||||
if (runControl != null && !runControl.isTargetAcceptingCommands()) {
|
||||
fMIBackend.interrupt();
|
||||
}
|
||||
|
||||
// Schedule a runnable to be executed 2 seconds from now.
|
||||
// If we don't get a response to the quit command, this
|
||||
// runnable will kill the task.
|
||||
final Future<?> forceQuitTask = getExecutor().schedule(
|
||||
new DsfRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
fMIBackend.destroy();
|
||||
rm.done();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isExecutionRequired() {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
2, TimeUnit.SECONDS);
|
||||
|
||||
queueCommand(
|
||||
getCommandFactory().createMIGDBExit(fControlDmc),
|
||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
||||
@Override
|
||||
public void handleCompleted() {
|
||||
if (isSuccess()) {
|
||||
// Cancel the time out runnable (if it hasn't run yet).
|
||||
forceQuitTask.cancel(false);
|
||||
rm.done();
|
||||
}
|
||||
// else: the forceQuitTask has or will handle it.
|
||||
// It is good to wait for the forceQuitTask to trigger
|
||||
// to leave enough time for the interrupt() to complete.
|
||||
}
|
||||
}
|
||||
);
|
||||
protected IEventProcessor createMIRunControlEventProcessor(AbstractMIControl connection, ICommandControlDMContext controlDmc) {
|
||||
return new MIRunControlEventProcessor_7_0(connection, controlDmc);
|
||||
}
|
||||
|
||||
private void listFeatures(final RequestMonitor requestMonitor) {
|
||||
queueCommand(
|
||||
getCommandFactory().createMIListFeatures(fControlDmc),
|
||||
getCommandFactory().createMIListFeatures(getControlDMContext()),
|
||||
new DataRequestMonitor<MIListFeaturesInfo>(getExecutor(), requestMonitor) {
|
||||
@Override
|
||||
public void handleSuccess() {
|
||||
fFeatures = getData().getFeatures();
|
||||
setFeatures(getData().getFeatures());
|
||||
super.handleSuccess();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractCLIProcess getCLIProcess() {
|
||||
return fCLIProcess;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 2.0
|
||||
*/
|
||||
@Override
|
||||
public void setTracingStream(OutputStream tracingStream) {
|
||||
setMITracingStream(tracingStream);
|
||||
}
|
||||
|
||||
/** @since 3.0 */
|
||||
@Override
|
||||
public void setEnvironment(Properties props, boolean clear, RequestMonitor rm) {
|
||||
int count = 0;
|
||||
CountingRequestMonitor countingRm = new CountingRequestMonitor(getExecutor(), rm);
|
||||
|
||||
// First clear the environment if requested.
|
||||
if (clear) {
|
||||
count++;
|
||||
queueCommand(
|
||||
getCommandFactory().createCLIUnsetEnv(getContext()),
|
||||
new DataRequestMonitor<MIInfo>(getExecutor(), countingRm));
|
||||
}
|
||||
|
||||
// Now set the new variables
|
||||
for (Entry<Object,Object> property : props.entrySet()) {
|
||||
count++;
|
||||
String name = (String)property.getKey();
|
||||
String value = (String)property.getValue();
|
||||
queueCommand(
|
||||
getCommandFactory().createMIGDBSetEnv(getContext(), name, value),
|
||||
new DataRequestMonitor<MIInfo>(getExecutor(), countingRm));
|
||||
}
|
||||
countingRm.setDoneCount(count);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.0
|
||||
*/
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void completeInitialization(final RequestMonitor rm) {
|
||||
// We take the attributes from the launchConfiguration
|
||||
ILaunch launch = (ILaunch)getSession().getModelAdapter(ILaunch.class);
|
||||
Map<String, Object> attributes = null;
|
||||
try {
|
||||
attributes = launch.getLaunchConfiguration().getAttributes();
|
||||
} catch (CoreException e) {}
|
||||
|
||||
// We need a RequestMonitorWithProgress, if we don't have one, we create one.
|
||||
RequestMonitorWithProgress progressRm;
|
||||
if (rm instanceof RequestMonitorWithProgress) {
|
||||
progressRm = (RequestMonitorWithProgress)rm;
|
||||
} else {
|
||||
progressRm = new RequestMonitorWithProgress(getExecutor(), new NullProgressMonitor()) {
|
||||
@Override
|
||||
protected void handleCompleted() {
|
||||
rm.setStatus(getStatus());
|
||||
rm.done();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
ImmediateExecutor.getInstance().execute(getCompleteInitializationSequence(attributes, progressRm));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the sequence that is to be used to complete the initialization of GDB.
|
||||
*
|
||||
* @param rm A RequestMonitorWithProgress that will indicate when the sequence is completed, but that
|
||||
* also contains an IProgressMonitor to be able to cancel the launch. A NullProgressMonitor
|
||||
* can be used if cancellation is not required.
|
||||
*
|
||||
* @since 4.0
|
||||
*/
|
||||
protected Sequence getCompleteInitializationSequence(Map<String, Object> attributes, RequestMonitorWithProgress rm) {
|
||||
return new FinalLaunchSequence_7_0(getSession(), attributes, rm);
|
||||
}
|
||||
|
||||
/**@since 4.0 */
|
||||
@Override
|
||||
public List<String> getFeatures() {
|
||||
return fFeatures;
|
||||
}
|
||||
|
||||
@DsfServiceEventHandler
|
||||
public void eventDispatched(ICommandControlShutdownDMEvent e) {
|
||||
// Handle our "GDB Exited" event and stop processing commands.
|
||||
stopCommandProcessing();
|
||||
}
|
||||
|
||||
@DsfServiceEventHandler
|
||||
public void eventDispatched(BackendStateChangedEvent e) {
|
||||
if (e.getState() == IMIBackend.State.TERMINATED && e.getBackendId().equals(fMIBackend.getId())) {
|
||||
// Handle "GDB Exited" event, just relay to following event.
|
||||
getSession().dispatchEvent(new GDBControlShutdownDMEvent(fControlDmc), getProperties());
|
||||
}
|
||||
}
|
||||
|
||||
/** @since 3.0 */
|
||||
@DsfServiceEventHandler
|
||||
public void eventDispatched(ITraceRecordSelectedChangedDMEvent e) {
|
||||
}
|
||||
|
||||
public static class InitializationShutdownStep extends Sequence.Step {
|
||||
public enum Direction { INITIALIZING, SHUTTING_DOWN }
|
||||
|
||||
private Direction fDirection;
|
||||
public InitializationShutdownStep(Direction direction) { fDirection = direction; }
|
||||
|
||||
@Override
|
||||
final public void execute(RequestMonitor requestMonitor) {
|
||||
if (fDirection == Direction.INITIALIZING) {
|
||||
initialize(requestMonitor);
|
||||
} else {
|
||||
shutdown(requestMonitor);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
final public void rollBack(RequestMonitor requestMonitor) {
|
||||
if (fDirection == Direction.INITIALIZING) {
|
||||
shutdown(requestMonitor);
|
||||
} else {
|
||||
super.rollBack(requestMonitor);
|
||||
}
|
||||
}
|
||||
|
||||
protected void initialize(RequestMonitor requestMonitor) {
|
||||
requestMonitor.done();
|
||||
}
|
||||
protected void shutdown(RequestMonitor requestMonitor) {
|
||||
requestMonitor.done();
|
||||
}
|
||||
}
|
||||
|
||||
protected class CommandMonitoringStep extends InitializationShutdownStep {
|
||||
CommandMonitoringStep(Direction direction) { super(direction); }
|
||||
|
||||
@Override
|
||||
protected void initialize(final RequestMonitor requestMonitor) {
|
||||
startCommandProcessing(fMIBackend.getMIInputStream(), fMIBackend.getMIOutputStream());
|
||||
requestMonitor.done();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void shutdown(RequestMonitor requestMonitor) {
|
||||
stopCommandProcessing();
|
||||
requestMonitor.done();
|
||||
}
|
||||
}
|
||||
|
||||
protected class CommandProcessorsStep extends InitializationShutdownStep {
|
||||
CommandProcessorsStep(Direction direction) { super(direction); }
|
||||
|
||||
@Override
|
||||
public void initialize(final RequestMonitor requestMonitor) {
|
||||
try {
|
||||
fCLIProcess = new GDBBackendCLIProcess(GDBControl_7_0.this, fMIBackend);
|
||||
}
|
||||
catch(IOException e) {
|
||||
requestMonitor.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, IDsfStatusConstants.REQUEST_FAILED, "Failed to create CLI Process", e)); //$NON-NLS-1$
|
||||
requestMonitor.done();
|
||||
return;
|
||||
}
|
||||
|
||||
fCLICommandProcessor = new CLIEventProcessor_7_0(GDBControl_7_0.this, fControlDmc);
|
||||
fMIEventProcessor = new MIRunControlEventProcessor_7_0(GDBControl_7_0.this, fControlDmc);
|
||||
|
||||
requestMonitor.done();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void shutdown(RequestMonitor requestMonitor) {
|
||||
fCLICommandProcessor.dispose();
|
||||
fMIEventProcessor.dispose();
|
||||
fCLIProcess.dispose();
|
||||
|
||||
requestMonitor.done();
|
||||
}
|
||||
}
|
||||
|
||||
/** @since 4.0 */
|
||||
protected class ListFeaturesStep extends InitializationShutdownStep {
|
||||
ListFeaturesStep(Direction direction) { super(direction); }
|
||||
protected class ListFeaturesStep extends GDBControl.InitializationShutdownStep {
|
||||
|
||||
ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction direction) { super(direction); }
|
||||
|
||||
@Override
|
||||
protected void initialize(final RequestMonitor requestMonitor) {
|
||||
|
@ -451,37 +193,13 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
|
|||
}
|
||||
}
|
||||
|
||||
protected class RegisterStep extends InitializationShutdownStep {
|
||||
RegisterStep(Direction direction) { super(direction); }
|
||||
@Override
|
||||
public void initialize(final RequestMonitor requestMonitor) {
|
||||
getSession().addServiceEventListener(GDBControl_7_0.this, null);
|
||||
register(
|
||||
new String[]{ ICommandControl.class.getName(),
|
||||
ICommandControlService.class.getName(),
|
||||
IMICommandControl.class.getName(),
|
||||
AbstractMIControl.class.getName(),
|
||||
IGDBControl.class.getName() },
|
||||
new Hashtable<String,String>());
|
||||
getSession().dispatchEvent(new GDBControlInitializedDMEvent(fControlDmc), getProperties());
|
||||
requestMonitor.done();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void shutdown(RequestMonitor requestMonitor) {
|
||||
unregister();
|
||||
getSession().removeServiceEventListener(GDBControl_7_0.this);
|
||||
requestMonitor.done();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 4.0
|
||||
*/
|
||||
@Override
|
||||
public void enablePrettyPrintingForMIVariableObjects(RequestMonitor rm) {
|
||||
queueCommand(
|
||||
getCommandFactory().createMIEnablePrettyPrinting(fControlDmc),
|
||||
getCommandFactory().createMIEnablePrettyPrinting(getControlDMContext()),
|
||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
|
||||
}
|
||||
|
||||
|
@ -494,7 +212,7 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
|
|||
String subCommand = "set python print-stack " + (enabled ? "on" : "off"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
||||
|
||||
queueCommand(
|
||||
getCommandFactory().createCLIMaintenance(fControlDmc, subCommand),
|
||||
getCommandFactory().createCLIMaintenance(getControlDMContext(), subCommand),
|
||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
* QNX Software Systems - Initial API and implementation
|
||||
* Wind River Systems - Modified for new DSF Reference Implementation
|
||||
* Ericsson AB - Additional handling of events
|
||||
* Mikhail Khodjaiants (Mentor Graphics) - Refactor common code in GDBControl* classes (bug 372795)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.mi.service.command;
|
||||
|
@ -25,10 +26,8 @@ import org.eclipse.cdt.dsf.debug.service.IRunControl.IStartedDMEvent;
|
|||
import org.eclipse.cdt.dsf.debug.service.ISignals.ISignalsDMContext;
|
||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
|
||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
|
||||
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.IMIProcesses;
|
||||
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
|
||||
|
@ -51,7 +50,7 @@ import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
|||
*/
|
||||
@ConfinedToDsfExecutor("fConnection#getExecutor")
|
||||
public class CLIEventProcessor
|
||||
implements ICommandListener, IEventListener
|
||||
implements IEventProcessor
|
||||
{
|
||||
private final ICommandControlService fCommandControl;
|
||||
private final ICommandControlDMContext fControlDmc;
|
||||
|
@ -74,6 +73,7 @@ public class CLIEventProcessor
|
|||
fCommandControl.getSession().addServiceEventListener(this, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
fCommandControl.getSession().removeServiceEventListener(this);
|
||||
fCommandControl.removeCommandListener(this);
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
* Wind River Systems - Modified for new DSF Reference Implementation
|
||||
* Ericsson AB - Additional handling of events
|
||||
* Ericsson - Version 7.0
|
||||
* Mikhail Khodjaiants (Mentor Graphics) - Refactor common code in GDBControl* classes (bug 372795)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.mi.service.command;
|
||||
|
@ -20,11 +21,9 @@ import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
|||
import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext;
|
||||
import org.eclipse.cdt.dsf.debug.service.ISignals.ISignalsDMContext;
|
||||
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.ICommandControlService.ICommandControlDMContext;
|
||||
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.debug.service.command.ICommandControlService.ICommandControlDMContext;
|
||||
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
||||
import org.eclipse.cdt.dsf.mi.service.command.commands.CLICommand;
|
||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIInterpreterExecConsole;
|
||||
|
@ -41,7 +40,7 @@ import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
|||
*/
|
||||
@ConfinedToDsfExecutor("fConnection#getExecutor")
|
||||
public class CLIEventProcessor_7_0
|
||||
implements ICommandListener, IEventListener
|
||||
implements IEventProcessor
|
||||
{
|
||||
private final ICommandControlService fCommandControl;
|
||||
|
||||
|
@ -54,6 +53,7 @@ public class CLIEventProcessor_7_0
|
|||
fCommandControl.addEventListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
fCommandControl.removeCommandListener(this);
|
||||
fCommandControl.removeEventListener(this);
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Mentor Graphics 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:
|
||||
* Mentor Graphics - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.dsf.mi.service.command;
|
||||
|
||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandListener;
|
||||
import org.eclipse.cdt.dsf.debug.service.command.IEventListener;
|
||||
|
||||
/**
|
||||
* Common interface that represents all MI and CLI event/command processors.
|
||||
*
|
||||
* @since 4.1
|
||||
*/
|
||||
public interface IEventProcessor extends IEventListener, ICommandListener {
|
||||
|
||||
/**
|
||||
* Disposes of this processor's resources.
|
||||
*/
|
||||
public void dispose();
|
||||
}
|
|
@ -8,6 +8,7 @@
|
|||
* Contributors:
|
||||
* Wind River Systems - initial API and implementation
|
||||
* Ericsson - Additional handling of events
|
||||
* Mikhail Khodjaiants (Mentor Graphics) - Refactor common code in GDBControl* classes (bug 372795)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.dsf.mi.service.command;
|
||||
|
||||
|
@ -23,10 +24,8 @@ 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.ICommandControlDMContext;
|
||||
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.gdb.service.IGDBBackend;
|
||||
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
|
||||
|
@ -72,7 +71,7 @@ import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
|||
* received by other services and clients.
|
||||
*/
|
||||
public class MIRunControlEventProcessor
|
||||
implements IEventListener, ICommandListener
|
||||
implements IEventProcessor
|
||||
{
|
||||
private static final String STOPPED_REASON = "stopped"; //$NON-NLS-1$
|
||||
|
||||
|
@ -107,6 +106,7 @@ public class MIRunControlEventProcessor
|
|||
/**
|
||||
* This processor must be disposed before the control service is un-registered.
|
||||
*/
|
||||
@Override
|
||||
public void dispose() {
|
||||
fCommandControl.removeEventListener(this);
|
||||
fCommandControl.removeCommandListener(this);
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
* Contributors:
|
||||
* Wind River Systems - initial API and implementation
|
||||
* Ericsson - Version 7.0
|
||||
* Mikhail Khodjaiants (Mentor Graphics) - Refactor common code in GDBControl* classes (bug 372795)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.dsf.mi.service.command;
|
||||
|
||||
|
@ -22,10 +23,8 @@ 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.ICommandControlDMContext;
|
||||
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.IMIProcesses;
|
||||
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
|
||||
|
@ -71,7 +70,7 @@ import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
|||
* @since 1.1
|
||||
*/
|
||||
public class MIRunControlEventProcessor_7_0
|
||||
implements IEventListener, ICommandListener
|
||||
implements IEventProcessor
|
||||
{
|
||||
private static final String STOPPED_REASON = "stopped"; //$NON-NLS-1$
|
||||
private static final String RUNNING_REASON = "running"; //$NON-NLS-1$
|
||||
|
@ -107,6 +106,7 @@ public class MIRunControlEventProcessor_7_0
|
|||
/**
|
||||
* This processor must be disposed before the control service is un-registered.
|
||||
*/
|
||||
@Override
|
||||
public void dispose() {
|
||||
fCommandControl.removeEventListener(this);
|
||||
fCommandControl.removeCommandListener(this);
|
||||
|
|
Loading…
Add table
Reference in a new issue