mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-14 11:45: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.
|
* Nokia - create and use backend service.
|
||||||
* Vladimir Prus (CodeSourcery) - Support for -data-read-memory-bytes (bug 322658)
|
* Vladimir Prus (CodeSourcery) - Support for -data-read-memory-bytes (bug 322658)
|
||||||
* Jens Elmenthaler (Verigy) - Added Full GDB pretty-printing support (bug 302121)
|
* 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;
|
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.AbstractMIControl;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.CLIEventProcessor;
|
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.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.MIControlDMContext;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.MIRunControlEventProcessor;
|
import org.eclipse.cdt.dsf.mi.service.command.MIRunControlEventProcessor;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
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 IGDBBackend fMIBackend;
|
||||||
|
|
||||||
private MIRunControlEventProcessor fMIEventProcessor;
|
private IEventProcessor fMIEventProcessor;
|
||||||
private CLIEventProcessor fCLICommandProcessor;
|
private IEventProcessor fCLICommandProcessor;
|
||||||
private AbstractCLIProcess fCLIProcess;
|
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;
|
private boolean fTerminated;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 3.0
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
public GDBControl(DsfSession session, ILaunchConfiguration config, CommandFactory factory) {
|
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
|
@Override
|
||||||
|
@ -136,37 +152,18 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
// have it, before we can create this context.
|
// have it, before we can create this context.
|
||||||
fControlDmc = new GDBControlDMContext(getSession().getId(), getId());
|
fControlDmc = new GDBControlDMContext(getSession().getId(), getId());
|
||||||
|
|
||||||
final Sequence.Step[] initializeSteps = new Sequence.Step[] {
|
getExecutor().execute(getStartupSequence(requestMonitor));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void shutdown(final RequestMonitor requestMonitor) {
|
public void shutdown(final RequestMonitor requestMonitor) {
|
||||||
final Sequence.Step[] shutdownSteps = new Sequence.Step[] {
|
getExecutor().execute(getShutdownSequence(new RequestMonitor(getExecutor(), requestMonitor) {
|
||||||
new RegisterStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
|
||||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
@Override
|
||||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
protected void handleCompleted() {
|
||||||
};
|
GDBControl.super.shutdown(requestMonitor);
|
||||||
Sequence shutdownSequence =
|
}
|
||||||
new Sequence(getExecutor(),
|
}));
|
||||||
new RequestMonitor(getExecutor(), requestMonitor) {
|
|
||||||
@Override
|
|
||||||
protected void handleCompleted() {
|
|
||||||
GDBControl.super.shutdown(requestMonitor);
|
|
||||||
}
|
|
||||||
}) {
|
|
||||||
@Override public Step[] getSteps() { return shutdownSteps; }
|
|
||||||
};
|
|
||||||
getExecutor().execute(shutdownSequence);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -403,8 +400,8 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fCLICommandProcessor = new CLIEventProcessor(GDBControl.this, fControlDmc);
|
fCLICommandProcessor = createCLIEventProcessor(GDBControl.this, fControlDmc);
|
||||||
fMIEventProcessor = new MIRunControlEventProcessor(GDBControl.this, fControlDmc);
|
fMIEventProcessor = createMIRunControlEventProcessor(GDBControl.this, fControlDmc);
|
||||||
|
|
||||||
requestMonitor.done();
|
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 */
|
/** @since 4.0 */
|
||||||
@Override
|
@Override
|
||||||
public List<String> getFeatures() {
|
public List<String> getFeatures() {
|
||||||
|
@ -471,4 +461,55 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
public void setPrintPythonErrors(boolean enabled, RequestMonitor rm) {
|
public void setPrintPythonErrors(boolean enabled, RequestMonitor rm) {
|
||||||
rm.done();
|
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)
|
* Vladimir Prus (CodeSourcery) - Support for -data-read-memory-bytes (bug 322658)
|
||||||
* Jens Elmenthaler (Verigy) - Added Full GDB pretty-printing support (bug 302121)
|
* Jens Elmenthaler (Verigy) - Added Full GDB pretty-printing support (bug 302121)
|
||||||
* Marc Khouzam (Ericsson) - Call new FinalLaunchSequence_7_0 (Bug 365471)
|
* 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;
|
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;
|
||||||
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.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.RequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress;
|
import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress;
|
||||||
import org.eclipse.cdt.dsf.concurrent.Sequence;
|
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.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.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.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.AbstractMIControl;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.CLIEventProcessor_7_0;
|
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.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.MIRunControlEventProcessor_7_0;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
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.mi.service.command.output.MIListFeaturesInfo;
|
||||||
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
|
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
|
||||||
import org.eclipse.cdt.dsf.service.DsfSession;
|
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.eclipse.debug.core.ILaunchConfiguration;
|
||||||
import org.osgi.framework.BundleContext;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GDB Debugger control implementation. This implementation extends the
|
* GDB Debugger control implementation. This implementation extends the
|
||||||
|
@ -71,374 +43,144 @@ import org.osgi.framework.BundleContext;
|
||||||
* - CLI console support,<br>
|
* - CLI console support,<br>
|
||||||
* - inferior process status tracking.<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>
|
@Deprecated
|
||||||
implements ICommandControlInitializedDMEvent
|
public static class InitializationShutdownStep extends GDBControl.InitializationShutdownStep {
|
||||||
{
|
|
||||||
public GDBControlInitializedDMEvent(ICommandControlDMContext context) {
|
/**
|
||||||
super(context);
|
* @deprecated use {@link GDBControl.InitializationShutdownStep.Direction}.
|
||||||
}
|
*/
|
||||||
}
|
@Deprecated
|
||||||
|
public enum Direction { INITIALIZING, SHUTTING_DOWN }
|
||||||
/**
|
|
||||||
* Event indicating that the CommandControl (back end process) has terminated.
|
public InitializationShutdownStep(Direction direction) {
|
||||||
*/
|
super((direction == Direction.INITIALIZING) ?
|
||||||
private static class GDBControlShutdownDMEvent extends AbstractDMEvent<ICommandControlDMContext>
|
GDBControl.InitializationShutdownStep.Direction.INITIALIZING :
|
||||||
implements ICommandControlShutdownDMEvent
|
GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN);
|
||||||
{
|
}
|
||||||
public GDBControlShutdownDMEvent(ICommandControlDMContext context) {
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private GDBControlDMContext fControlDmc;
|
/**
|
||||||
|
* @deprecated use {@link GDBControl.CommandMonitoringStep}.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected class CommandMonitoringStep extends GDBControl.CommandMonitoringStep {
|
||||||
|
|
||||||
private IGDBBackend fMIBackend;
|
CommandMonitoringStep(GDBControl_7_0.InitializationShutdownStep.Direction direction) {
|
||||||
|
super((direction == GDBControl_7_0.InitializationShutdownStep.Direction.INITIALIZING) ?
|
||||||
private MIRunControlEventProcessor_7_0 fMIEventProcessor;
|
GDBControl.InitializationShutdownStep.Direction.INITIALIZING :
|
||||||
private CLIEventProcessor_7_0 fCLICommandProcessor;
|
GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN);
|
||||||
private AbstractCLIProcess fCLIProcess;
|
}
|
||||||
|
}
|
||||||
private List<String> fFeatures = new ArrayList<String>();
|
|
||||||
|
/**
|
||||||
|
* @deprecated use {@link GDBControl.CommandProcessorsStep}.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected class CommandProcessorsStep extends GDBControl.CommandProcessorsStep {
|
||||||
|
|
||||||
|
CommandProcessorsStep(GDBControl_7_0.InitializationShutdownStep.Direction direction) {
|
||||||
|
super((direction == GDBControl_7_0.InitializationShutdownStep.Direction.INITIALIZING) ?
|
||||||
|
GDBControl.InitializationShutdownStep.Direction.INITIALIZING :
|
||||||
|
GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated use {@link GDBControl.RegisterStep}.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected class RegisterStep extends GDBControl.RegisterStep {
|
||||||
|
|
||||||
|
RegisterStep(GDBControl_7_0.InitializationShutdownStep.Direction direction) {
|
||||||
|
super((direction == GDBControl_7_0.InitializationShutdownStep.Direction.INITIALIZING) ?
|
||||||
|
GDBControl.InitializationShutdownStep.Direction.INITIALIZING :
|
||||||
|
GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean fTerminated;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 3.0
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
public GDBControl_7_0(DsfSession session, ILaunchConfiguration config, CommandFactory factory) {
|
public GDBControl_7_0(DsfSession session, ILaunchConfiguration config, CommandFactory factory) {
|
||||||
super(session, true, factory);
|
super(session, true, config, factory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BundleContext getBundleContext() {
|
protected Sequence getStartupSequence(RequestMonitor requestMonitor) {
|
||||||
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());
|
|
||||||
|
|
||||||
final Sequence.Step[] initializeSteps = new Sequence.Step[] {
|
final Sequence.Step[] initializeSteps = new Sequence.Step[] {
|
||||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.INITIALIZING),
|
new GDBControl.CommandMonitoringStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.INITIALIZING),
|
new GDBControl.CommandProcessorsStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
new ListFeaturesStep(InitializationShutdownStep.Direction.INITIALIZING),
|
new ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
new RegisterStep(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; }
|
@Override public Step[] getSteps() { return initializeSteps; }
|
||||||
};
|
};
|
||||||
getExecutor().execute(startupSequence);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void shutdown(final RequestMonitor requestMonitor) {
|
protected Sequence getShutdownSequence(RequestMonitor requestMonitor) {
|
||||||
final Sequence.Step[] shutdownSteps = new Sequence.Step[] {
|
final Sequence.Step[] shutdownSteps = new Sequence.Step[] {
|
||||||
new RegisterStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new GDBControl.RegisterStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
new ListFeaturesStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new GDBControl.CommandProcessorsStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new GDBControl.CommandMonitoringStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
};
|
};
|
||||||
Sequence shutdownSequence =
|
return new Sequence(getExecutor(), requestMonitor) {
|
||||||
new Sequence(getExecutor(),
|
|
||||||
new RequestMonitor(getExecutor(), requestMonitor) {
|
|
||||||
@Override
|
|
||||||
protected void handleCompleted() {
|
|
||||||
GDBControl_7_0.super.shutdown(requestMonitor);
|
|
||||||
}
|
|
||||||
}) {
|
|
||||||
@Override public Step[] getSteps() { return shutdownSteps; }
|
@Override public Step[] getSteps() { return shutdownSteps; }
|
||||||
};
|
};
|
||||||
getExecutor().execute(shutdownSequence);
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getId() {
|
|
||||||
return fMIBackend.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MIControlDMContext getControlDMContext() {
|
|
||||||
return fControlDmc;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ICommandControlDMContext getContext() {
|
protected IEventProcessor createCLIEventProcessor(ICommandControlService connection, ICommandControlDMContext controlDmc) {
|
||||||
return fControlDmc;
|
return new CLIEventProcessor_7_0(connection, controlDmc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@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.
|
@Override
|
||||||
// If we don't get a response to the quit command, this
|
protected IEventProcessor createMIRunControlEventProcessor(AbstractMIControl connection, ICommandControlDMContext controlDmc) {
|
||||||
// runnable will kill the task.
|
return new MIRunControlEventProcessor_7_0(connection, controlDmc);
|
||||||
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.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void listFeatures(final RequestMonitor requestMonitor) {
|
private void listFeatures(final RequestMonitor requestMonitor) {
|
||||||
queueCommand(
|
queueCommand(
|
||||||
getCommandFactory().createMIListFeatures(fControlDmc),
|
getCommandFactory().createMIListFeatures(getControlDMContext()),
|
||||||
new DataRequestMonitor<MIListFeaturesInfo>(getExecutor(), requestMonitor) {
|
new DataRequestMonitor<MIListFeaturesInfo>(getExecutor(), requestMonitor) {
|
||||||
@Override
|
@Override
|
||||||
public void handleSuccess() {
|
public void handleSuccess() {
|
||||||
fFeatures = getData().getFeatures();
|
setFeatures(getData().getFeatures());
|
||||||
super.handleSuccess();
|
super.handleSuccess();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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) {
|
protected Sequence getCompleteInitializationSequence(Map<String, Object> attributes, RequestMonitorWithProgress rm) {
|
||||||
return new FinalLaunchSequence_7_0(getSession(), attributes, rm);
|
return new FinalLaunchSequence_7_0(getSession(), attributes, rm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**@since 4.0 */
|
@Override
|
||||||
@Override
|
@DsfServiceEventHandler
|
||||||
public List<String> getFeatures() {
|
|
||||||
return fFeatures;
|
|
||||||
}
|
|
||||||
|
|
||||||
@DsfServiceEventHandler
|
|
||||||
public void eventDispatched(ICommandControlShutdownDMEvent e) {
|
public void eventDispatched(ICommandControlShutdownDMEvent e) {
|
||||||
// Handle our "GDB Exited" event and stop processing commands.
|
// Handle our "GDB Exited" event and stop processing commands.
|
||||||
stopCommandProcessing();
|
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 */
|
/** @since 3.0 */
|
||||||
@DsfServiceEventHandler
|
@DsfServiceEventHandler
|
||||||
public void eventDispatched(ITraceRecordSelectedChangedDMEvent e) {
|
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 */
|
/** @since 4.0 */
|
||||||
protected class ListFeaturesStep extends InitializationShutdownStep {
|
protected class ListFeaturesStep extends GDBControl.InitializationShutdownStep {
|
||||||
ListFeaturesStep(Direction direction) { super(direction); }
|
|
||||||
|
ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction direction) { super(direction); }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void initialize(final RequestMonitor requestMonitor) {
|
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
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void enablePrettyPrintingForMIVariableObjects(RequestMonitor rm) {
|
public void enablePrettyPrintingForMIVariableObjects(RequestMonitor rm) {
|
||||||
queueCommand(
|
queueCommand(
|
||||||
getCommandFactory().createMIEnablePrettyPrinting(fControlDmc),
|
getCommandFactory().createMIEnablePrettyPrinting(getControlDMContext()),
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
|
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$
|
String subCommand = "set python print-stack " + (enabled ? "on" : "off"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
|
||||||
|
|
||||||
queueCommand(
|
queueCommand(
|
||||||
getCommandFactory().createCLIMaintenance(fControlDmc, subCommand),
|
getCommandFactory().createCLIMaintenance(getControlDMContext(), subCommand),
|
||||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
|
new DataRequestMonitor<MIInfo>(getExecutor(), rm));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
* Wind River Systems - Modified for new DSF Reference Implementation
|
* Wind River Systems - Modified for new DSF Reference Implementation
|
||||||
* Ericsson AB - Additional handling of events
|
* 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;
|
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.ISignals.ISignalsDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
|
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.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.ICommandResult;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandToken;
|
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.internal.GdbPlugin;
|
||||||
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
|
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
|
||||||
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
|
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
|
||||||
|
@ -51,7 +50,7 @@ import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
||||||
*/
|
*/
|
||||||
@ConfinedToDsfExecutor("fConnection#getExecutor")
|
@ConfinedToDsfExecutor("fConnection#getExecutor")
|
||||||
public class CLIEventProcessor
|
public class CLIEventProcessor
|
||||||
implements ICommandListener, IEventListener
|
implements IEventProcessor
|
||||||
{
|
{
|
||||||
private final ICommandControlService fCommandControl;
|
private final ICommandControlService fCommandControl;
|
||||||
private final ICommandControlDMContext fControlDmc;
|
private final ICommandControlDMContext fControlDmc;
|
||||||
|
@ -74,7 +73,8 @@ public class CLIEventProcessor
|
||||||
fCommandControl.getSession().addServiceEventListener(this, null);
|
fCommandControl.getSession().addServiceEventListener(this, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dispose() {
|
@Override
|
||||||
|
public void dispose() {
|
||||||
fCommandControl.getSession().removeServiceEventListener(this);
|
fCommandControl.getSession().removeServiceEventListener(this);
|
||||||
fCommandControl.removeCommandListener(this);
|
fCommandControl.removeCommandListener(this);
|
||||||
fCommandControl.removeEventListener(this);
|
fCommandControl.removeEventListener(this);
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
* Wind River Systems - Modified for new DSF Reference Implementation
|
* Wind River Systems - Modified for new DSF Reference Implementation
|
||||||
* Ericsson AB - Additional handling of events
|
* Ericsson AB - Additional handling of events
|
||||||
* Ericsson - Version 7.0
|
* Ericsson - Version 7.0
|
||||||
|
* Mikhail Khodjaiants (Mentor Graphics) - Refactor common code in GDBControl* classes (bug 372795)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
package org.eclipse.cdt.dsf.mi.service.command;
|
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.IBreakpoints.IBreakpointsTargetDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.ISignals.ISignalsDMContext;
|
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;
|
||||||
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.ICommandResult;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandToken;
|
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.gdb.internal.GdbPlugin;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.CLICommand;
|
import org.eclipse.cdt.dsf.mi.service.command.commands.CLICommand;
|
||||||
import org.eclipse.cdt.dsf.mi.service.command.commands.MIInterpreterExecConsole;
|
import org.eclipse.cdt.dsf.mi.service.command.commands.MIInterpreterExecConsole;
|
||||||
|
@ -41,7 +40,7 @@ import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
||||||
*/
|
*/
|
||||||
@ConfinedToDsfExecutor("fConnection#getExecutor")
|
@ConfinedToDsfExecutor("fConnection#getExecutor")
|
||||||
public class CLIEventProcessor_7_0
|
public class CLIEventProcessor_7_0
|
||||||
implements ICommandListener, IEventListener
|
implements IEventProcessor
|
||||||
{
|
{
|
||||||
private final ICommandControlService fCommandControl;
|
private final ICommandControlService fCommandControl;
|
||||||
|
|
||||||
|
@ -54,7 +53,8 @@ public class CLIEventProcessor_7_0
|
||||||
fCommandControl.addEventListener(this);
|
fCommandControl.addEventListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void dispose() {
|
@Override
|
||||||
|
public void dispose() {
|
||||||
fCommandControl.removeCommandListener(this);
|
fCommandControl.removeCommandListener(this);
|
||||||
fCommandControl.removeEventListener(this);
|
fCommandControl.removeEventListener(this);
|
||||||
fServicesTracker.dispose();
|
fServicesTracker.dispose();
|
||||||
|
|
|
@ -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:
|
* Contributors:
|
||||||
* Wind River Systems - initial API and implementation
|
* Wind River Systems - initial API and implementation
|
||||||
* Ericsson - Additional handling of events
|
* 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;
|
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.IRunControl.IExecutionDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
|
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.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.ICommandResult;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandToken;
|
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.internal.GdbPlugin;
|
||||||
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
|
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
|
||||||
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
|
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.
|
* received by other services and clients.
|
||||||
*/
|
*/
|
||||||
public class MIRunControlEventProcessor
|
public class MIRunControlEventProcessor
|
||||||
implements IEventListener, ICommandListener
|
implements IEventProcessor
|
||||||
{
|
{
|
||||||
private static final String STOPPED_REASON = "stopped"; //$NON-NLS-1$
|
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.
|
* This processor must be disposed before the control service is un-registered.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
fCommandControl.removeEventListener(this);
|
fCommandControl.removeEventListener(this);
|
||||||
fCommandControl.removeCommandListener(this);
|
fCommandControl.removeCommandListener(this);
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Wind River Systems - initial API and implementation
|
* Wind River Systems - initial API and implementation
|
||||||
* Ericsson - Version 7.0
|
* Ericsson - Version 7.0
|
||||||
|
* Mikhail Khodjaiants (Mentor Graphics) - Refactor common code in GDBControl* classes (bug 372795)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.dsf.mi.service.command;
|
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.IRunControl.IExecutionDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
|
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.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.ICommandResult;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandToken;
|
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.internal.GdbPlugin;
|
||||||
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
|
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
|
||||||
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
|
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
|
||||||
|
@ -71,7 +70,7 @@ import org.eclipse.cdt.dsf.service.DsfServicesTracker;
|
||||||
* @since 1.1
|
* @since 1.1
|
||||||
*/
|
*/
|
||||||
public class MIRunControlEventProcessor_7_0
|
public class MIRunControlEventProcessor_7_0
|
||||||
implements IEventListener, ICommandListener
|
implements IEventProcessor
|
||||||
{
|
{
|
||||||
private static final String STOPPED_REASON = "stopped"; //$NON-NLS-1$
|
private static final String STOPPED_REASON = "stopped"; //$NON-NLS-1$
|
||||||
private static final String RUNNING_REASON = "running"; //$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.
|
* This processor must be disposed before the control service is un-registered.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
fCommandControl.removeEventListener(this);
|
fCommandControl.removeEventListener(this);
|
||||||
fCommandControl.removeCommandListener(this);
|
fCommandControl.removeCommandListener(this);
|
||||||
|
|
Loading…
Add table
Reference in a new issue