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

Bug 338769: Allow for different versions of the FinalLaunchSequence

This commit is contained in:
Marc Khouzam 2011-03-07 18:05:03 +00:00
parent eb02ad7b69
commit 03252ec0f9
14 changed files with 394 additions and 70 deletions

View file

@ -20,10 +20,10 @@ import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
import org.eclipse.cdt.dsf.concurrent.ReflectionSequence;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.DataModelInitializedEvent;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
@ -42,6 +42,7 @@ import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
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.cdt.dsf.service.DsfSession;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
@ -50,14 +51,11 @@ import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.IStatusHandler;
public class FinalLaunchSequence extends ReflectionSequence {
private GdbLaunch fLaunch;
private SessionType fSessionType;
private boolean fAttach;
// The launchConfiguration attributes
private Map<String, Object> fAttributes;
@ -67,12 +65,15 @@ public class FinalLaunchSequence extends ReflectionSequence {
private CommandFactory fCommandFactory;
private DsfServicesTracker fTracker;
private DsfSession fSession;
public FinalLaunchSequence(DsfExecutor executor, GdbLaunch launch, SessionType sessionType, boolean attach, IProgressMonitor pm) {
super(executor, pm, LaunchMessages.getString("FinalLaunchSequence.0"), LaunchMessages.getString("FinalLaunchSequence.1")); //$NON-NLS-1$ //$NON-NLS-2$
fLaunch = launch;
fSessionType = sessionType;
fAttach = attach;
/**
* @since 4.0
*/
public FinalLaunchSequence(DsfSession session, Map<String, Object> attributes, RequestMonitorWithProgress rm) {
super(session.getExecutor(), rm, LaunchMessages.getString("FinalLaunchSequence.0"), LaunchMessages.getString("FinalLaunchSequence.1")); //$NON-NLS-1$ //$NON-NLS-2$
fSession = session;
fAttributes = attributes;
}
@Override
@ -106,14 +107,13 @@ public class FinalLaunchSequence extends ReflectionSequence {
}
/**
* Initialize the members of the {@link FinalLaunchSequence} class.
* This step is mandatory for the rest fo the sequence to complete.
* Initialize the members of the FinalLaunchSequence class.
* This step is mandatory for the rest of the sequence to complete.
* @since 4.0
*/
@SuppressWarnings("unchecked")
@Execute
public void stepInitializeFinalLaunchSequence(RequestMonitor requestMonitor) {
fTracker = new DsfServicesTracker(GdbPlugin.getBundleContext(), fLaunch.getSession().getId());
fTracker = new DsfServicesTracker(GdbPlugin.getBundleContext(), fSession.getId());
fGDBBackend = fTracker.getService(IGDBBackend.class);
if (fGDBBackend == null) {
requestMonitor.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, -1, "Cannot obtain GDBBackend service", null)); //$NON-NLS-1$
@ -137,14 +137,6 @@ public class FinalLaunchSequence extends ReflectionSequence {
return;
}
try {
fAttributes = fLaunch.getLaunchConfiguration().getAttributes();
} catch (CoreException e) {
requestMonitor.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, -1, "Cannot obtain launch configuration attributes", null)); //$NON-NLS-1$
requestMonitor.done();
return;
}
requestMonitor.done();
}
@ -190,7 +182,7 @@ public class FinalLaunchSequence extends ReflectionSequence {
*/
@Execute
public void stepSetBreakpointPending(final RequestMonitor requestMonitor) {
if (fSessionType != SessionType.CORE) {
if (fGDBBackend.getSessionType() != SessionType.CORE) {
fCommandControl.queueCommand(
fCommandFactory.createMIGDBSetBreakpointPending(fCommandControl.getContext(), true),
new DataRequestMonitor<MIInfo>(getExecutor(), requestMonitor));
@ -353,7 +345,8 @@ public class FinalLaunchSequence extends ReflectionSequence {
@Execute
public void stepSetSourceLookupPath(RequestMonitor requestMonitor) {
CSourceLookup sourceLookup = fTracker.getService(CSourceLookup.class);
CSourceLookupDirector locator = (CSourceLookupDirector)fLaunch.getSourceLocator();
ILaunch launch = (ILaunch)fSession.getModelAdapter(ILaunch.class);
CSourceLookupDirector locator = (CSourceLookupDirector)launch.getSourceLocator();
ISourceLookupDMContext sourceLookupDmc = (ISourceLookupDMContext)fCommandControl.getContext();
sourceLookup.setSourceLookupPath(sourceLookupDmc, locator.getSourceContainers(), requestMonitor);
@ -407,7 +400,7 @@ public class FinalLaunchSequence extends ReflectionSequence {
*/
@Execute
public void stepSpecifyCoreFile(final RequestMonitor requestMonitor) {
if (fSessionType == SessionType.CORE) {
if (fGDBBackend.getSessionType() == SessionType.CORE) {
String coreFile = CDebugUtils.getAttribute(
fAttributes,
ICDTLaunchConfigurationConstants.ATTR_COREFILE_PATH, ""); //$NON-NLS-1$
@ -478,7 +471,7 @@ public class FinalLaunchSequence extends ReflectionSequence {
*/
@Execute
public void stepRemoteConnection(final RequestMonitor rm) {
if (fSessionType == SessionType.REMOTE && fAttach) {
if (fGDBBackend.getSessionType() == SessionType.REMOTE && fGDBBackend.getIsAttachSession()) {
boolean isTcpConnection = CDebugUtils.getAttribute(
fAttributes,
IGDBLaunchConfigurationConstants.ATTR_REMOTE_TCP,
@ -518,7 +511,7 @@ public class FinalLaunchSequence extends ReflectionSequence {
*/
@Execute
public void stepNewProcess(final RequestMonitor rm) {
if (!fAttach) {
if (!fGDBBackend.getIsAttachSession()) {
boolean noBinarySpecified = CDebugUtils.getAttribute(
fAttributes,
@ -548,7 +541,7 @@ public class FinalLaunchSequence extends ReflectionSequence {
*/
@Execute
public void stepAttachToProcess(final RequestMonitor requestMonitor) {
if (fAttach && fSessionType != SessionType.REMOTE) {
if (fGDBBackend.getIsAttachSession() && fGDBBackend.getSessionType() != SessionType.REMOTE) {
// Is the process id already stored in the launch?
int pid = CDebugUtils.getAttribute(
fAttributes,
@ -559,7 +552,7 @@ public class FinalLaunchSequence extends ReflectionSequence {
fProcService.createProcessContext(fCommandControl.getContext(), Integer.toString(pid)),
new DataRequestMonitor<IDMContext>(getExecutor(), requestMonitor));
} else {
IConnect connectCommand = (IConnect)fLaunch.getSession().getModelAdapter(IConnect.class);
IConnect connectCommand = (IConnect)fSession.getModelAdapter(IConnect.class);
if (connectCommand != null) {
connectCommand.connect(requestMonitor);
} else {
@ -577,7 +570,7 @@ public class FinalLaunchSequence extends ReflectionSequence {
*/
@Execute
public void stepDataModelInitializationComplete(final RequestMonitor requestMonitor) {
fLaunch.getSession().dispatchEvent(new DataModelInitializedEvent(fCommandControl.getContext()),
fSession.dispatchEvent(new DataModelInitializedEvent(fCommandControl.getContext()),
fCommandControl.getProperties());
requestMonitor.done();
}

View file

@ -19,9 +19,9 @@ import java.util.concurrent.ExecutionException;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress;
import org.eclipse.cdt.dsf.concurrent.ThreadSafe;
import org.eclipse.cdt.dsf.debug.service.IDsfDebugServicesFactory;
import org.eclipse.cdt.dsf.debug.sourcelookup.DsfSourceLookupDirector;
@ -29,7 +29,9 @@ import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.gdb.service.GdbDebugServicesFactory;
import org.eclipse.cdt.dsf.gdb.service.GdbDebugServicesFactoryNS;
import org.eclipse.cdt.dsf.gdb.service.SessionType;
import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
import org.eclipse.cdt.dsf.gdb.service.macos.MacOSGdbDebugServicesFactory;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.launch.AbstractCLaunchDelegate2;
import org.eclipse.core.runtime.CoreException;
@ -181,14 +183,32 @@ public class GdbLaunchDelegate extends AbstractCLaunchDelegate2
monitor.worked(1);
// Create and invoke the final launch sequence to setup GDB
IProgressMonitor subMon2 = new SubProgressMonitor(monitor, 4, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
final Sequence finalLaunchSequence =
getFinalLaunchSequence(launch.getSession().getExecutor(), launch, sessionType, attach, subMon2);
final IProgressMonitor subMon2 = new SubProgressMonitor(monitor, 4, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
launch.getSession().getExecutor().execute(finalLaunchSequence);
Query<Object> completeLaunchQuery = new Query<Object>() {
@Override
protected void execute(final DataRequestMonitor<Object> rm) {
DsfServicesTracker tracker = new DsfServicesTracker(GdbPlugin.getBundleContext(), launch.getSession().getId());
IGDBControl control = tracker.getService(IGDBControl.class);
tracker.dispose();
control.completeInitialization(new RequestMonitorWithProgress(ImmediateExecutor.getInstance(), subMon2) {
@Override
protected void handleCompleted() {
if (isCanceled()) {
rm.cancel();
} else {
rm.setStatus(getStatus());
}
rm.done();
}
});
}
};
launch.getSession().getExecutor().execute(completeLaunchQuery);
boolean succeed = false;
try {
finalLaunchSequence.get();
completeLaunchQuery.get();
succeed = true;
} catch (InterruptedException e1) {
throw new DebugException(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, DebugException.INTERNAL_ERROR, "Interrupted Exception in dispatch thread", e1)); //$NON-NLS-1$
@ -250,14 +270,6 @@ public class GdbLaunchDelegate extends AbstractCLaunchDelegate2
return LaunchUtils.getGDBVersion(config);
}
/*
* This method can be overridden by subclasses to allow to change the final launch sequence without
* having to change the entire GdbLaunchDelegate
*/
protected Sequence getFinalLaunchSequence(DsfExecutor executor, GdbLaunch launch, SessionType type, boolean attach, IProgressMonitor pm) {
return new FinalLaunchSequence(executor, launch, type, attach, pm);
}
@Override
public boolean preLaunchCheck(ILaunchConfiguration config, String mode, IProgressMonitor monitor) throws CoreException {
// no pre launch check for core file

View file

@ -45,11 +45,14 @@ import org.eclipse.debug.core.ILaunchConfiguration;
public class GdbDebugServicesFactory extends AbstractDsfDebugServicesFactory {
private static final String GDB_6_8_VERSION = "6.8"; //$NON-NLS-1$
// This should eventually be "7.0" once GDB 7.0 is released
private static final String GDB_7_0_VERSION = "6.8.50.20090218"; //$NON-NLS-1$
private static final String GDB_7_1_VERSION = "7.1"; //$NON-NLS-1$
private static final String GDB_7_2_VERSION = "7.2"; //$NON-NLS-1$
/** @since 4.0 */
public static final String GDB_6_8_VERSION = "6.8"; //$NON-NLS-1$
/** @since 4.0 */
public static final String GDB_7_0_VERSION = "7.0"; //$NON-NLS-1$
/** @since 4.0 */
public static final String GDB_7_1_VERSION = "7.1"; //$NON-NLS-1$
/** @since 4.0 */
public static final String GDB_7_2_VERSION = "7.2"; //$NON-NLS-1$
private final String fVersion;

View file

@ -19,6 +19,7 @@ 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;
@ -28,12 +29,15 @@ 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.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;
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
import org.eclipse.cdt.dsf.gdb.service.SessionType;
import org.eclipse.cdt.dsf.mi.service.IMIBackend;
@ -51,8 +55,11 @@ import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.utils.pty.PTY;
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;
@ -313,6 +320,48 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
countingRm.setDoneCount(count);
}
/**
* @since 4.0
*/
@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(getSession(), attributes, rm);
}
@DsfServiceEventHandler
public void eventDispatched(ICommandControlShutdownDMEvent e) {
// Handle our "GDB Exited" event and stop processing commands.

View file

@ -19,6 +19,7 @@ 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;
@ -28,12 +29,15 @@ 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.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;
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceRecordSelectedChangedDMEvent;
import org.eclipse.cdt.dsf.gdb.service.SessionType;
@ -53,8 +57,11 @@ 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.cdt.utils.pty.PTY;
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;
@ -321,6 +328,48 @@ public class GDBControl_7_0 extends AbstractMIControl implements IGDBControl {
countingRm.setDoneCount(count);
}
/**
* @since 4.0
*/
@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(getSession(), attributes, rm);
}
/**@since 4.0 */
public List<String> getFeatures() {
return fFeatures;

View file

@ -32,6 +32,20 @@ public interface IGDBControl extends IMICommandControl {
MIInferiorProcess getInferiorProcess();
/**
* This method should be called once and only once, during the launch,
* to complete the initialization. It will perform the final steps
* to configure GDB for the type of debugging session chosen by the
* user.
*
* @param requestMonitor The requestMonitor indicating that the
* final steps if initialization are completed.
*
* @since 4.0
*/
void completeInitialization(RequestMonitor requestMonitor);
/**
* @since 2.0
*/

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.cdt.debug.gdbjtag.core;singleton:=true
Bundle-Version: 7.0.0.qualifier
Bundle-Version: 8.0.0.qualifier
Bundle-Activator: org.eclipse.cdt.debug.gdbjtag.core.Activator
Bundle-Localization: plugin
Require-Bundle: org.eclipse.core.runtime,

View file

@ -36,6 +36,7 @@ import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
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.DMContexts;
import org.eclipse.cdt.dsf.datamodel.DataModelInitializedEvent;
@ -58,7 +59,6 @@ import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.variables.VariablesPlugin;
@ -745,8 +745,11 @@ public class GDBJtagDSFFinalLaunchSequence extends Sequence {
DsfServicesTracker fTracker;
public GDBJtagDSFFinalLaunchSequence(DsfExecutor executor, GdbLaunch launch, SessionType sessionType, boolean attach, IProgressMonitor pm) {
super(executor, pm, LaunchMessages.getString("FinalLaunchSequence.0"), LaunchMessages.getString("FinalLaunchSequence.1")); //$NON-NLS-1$ //$NON-NLS-2$
/**
* @since 8.0
*/
public GDBJtagDSFFinalLaunchSequence(DsfExecutor executor, GdbLaunch launch, SessionType sessionType, boolean attach, RequestMonitorWithProgress rm) {
super(executor, rm, LaunchMessages.getString("FinalLaunchSequence.0"), LaunchMessages.getString("FinalLaunchSequence.1")); //$NON-NLS-1$ //$NON-NLS-2$
fLaunch = launch;
fSessionType = sessionType;
fAttach = attach;

View file

@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial implementation
* Ericsson - Updated for changes in base DSF-GDB launching (Bug 338769)
*******************************************************************************/
package org.eclipse.cdt.debug.gdbjtag.core;
@ -15,13 +16,12 @@ package org.eclipse.cdt.debug.gdbjtag.core;
*
*/
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.debug.gdbjtag.core.dsf.gdb.service.GdbJtagDebugServicesFactory;
import org.eclipse.cdt.debug.gdbjtag.core.dsf.gdb.service.macos.MacOSGdbJtagDebugServicesFactory;
import org.eclipse.cdt.dsf.concurrent.ThreadSafe;
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
import org.eclipse.cdt.dsf.debug.service.IDsfDebugServicesFactory;
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate;
import org.eclipse.cdt.dsf.gdb.service.SessionType;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.cdt.dsf.gdb.launching.LaunchUtils;
/**
* The launch configuration delegate for the Jtag hardware debugging using
@ -31,21 +31,23 @@ import org.eclipse.core.runtime.IProgressMonitor;
* launch configuration types.
* <p>
* It extends the standard DSF/GDB launch delegate <code>GdbLaunchDelegate</code>
* but overrides the <code>getFinalLaunchSequence</code> method to return the Jtag
* hardware debugging specific launch sequence.
* but overrides the <code>newServiceFactory</code> method to return the Jtag
* hardware debugging factory.
* @since 7.0
*/
@ThreadSafe
public class GDBJtagDSFLaunchConfigurationDelegate extends GdbLaunchDelegate {
protected IDsfDebugServicesFactory newServiceFactory(String version) {
if (version.contains(LaunchUtils.MACOS_GDB_MARKER)) {
// The version string at this point should look like
// 6.3.50-20050815APPLE1346, we extract the gdb version and apple version
String versions [] = version.split(LaunchUtils.MACOS_GDB_MARKER);
if (versions.length == 2) {
return new MacOSGdbJtagDebugServicesFactory(versions[0], versions[1]);
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.dsf.gdb.launching.GdbLaunchDelegate#getFinalLaunchSequence(org.eclipse.cdt.dsf.concurrent.DsfExecutor, org.eclipse.cdt.dsf.gdb.launching.GdbLaunch, org.eclipse.cdt.dsf.gdb.service.SessionType, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
protected Sequence getFinalLaunchSequence(DsfExecutor executor,
GdbLaunch launch, SessionType type, boolean attach,
IProgressMonitor pm) {
return new GDBJtagDSFFinalLaunchSequence(executor, launch, type, attach, pm);
return new GdbJtagDebugServicesFactory(version);
}
}

View file

@ -0,0 +1,42 @@
/*******************************************************************************
* Copyright (c) 2011 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.debug.gdbjtag.core.dsf.gdb.service;
import java.util.Map;
import org.eclipse.cdt.debug.gdbjtag.core.GDBJtagDSFFinalLaunchSequence;
import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress;
import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
import org.eclipse.cdt.dsf.gdb.service.command.GDBControl;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
/**
* Jtag control service which selects the Jtag CompleteInitializationSequence.
* Use for GDB < 7.0
*/
public class GDBJtagControl extends GDBControl {
public GDBJtagControl(DsfSession session, ILaunchConfiguration config, CommandFactory factory) {
super(session, config, factory);
}
protected Sequence getCompleteInitializationSequence(Map<String,Object> attributes, RequestMonitorWithProgress rm) {
GdbLaunch launch = (GdbLaunch)getSession().getModelAdapter(ILaunch.class);
IGDBBackend backend = getServicesTracker().getService(IGDBBackend.class);
return new GDBJtagDSFFinalLaunchSequence(getExecutor(), launch, backend.getSessionType(), backend.getIsAttachSession(), rm);
}
}

View file

@ -0,0 +1,42 @@
/*******************************************************************************
* Copyright (c) 2011 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.debug.gdbjtag.core.dsf.gdb.service;
import java.util.Map;
import org.eclipse.cdt.debug.gdbjtag.core.GDBJtagDSFFinalLaunchSequence;
import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress;
import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
import org.eclipse.cdt.dsf.gdb.service.command.GDBControl_7_0;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
/**
* Jtag control service which selects the Jtag CompleteInitializationSequence.
* Use for GDB >= 7.0
*/
public class GDBJtagControl_7_0 extends GDBControl_7_0 {
public GDBJtagControl_7_0(DsfSession session, ILaunchConfiguration config, CommandFactory factory) {
super(session, config, factory);
}
protected Sequence getCompleteInitializationSequence(Map<String,Object> attributes, RequestMonitorWithProgress rm) {
GdbLaunch launch = (GdbLaunch)getSession().getModelAdapter(ILaunch.class);
IGDBBackend backend = getServicesTracker().getService(IGDBBackend.class);
return new GDBJtagDSFFinalLaunchSequence(getExecutor(), launch, backend.getSessionType(), backend.getIsAttachSession(), rm);
}
}

View file

@ -0,0 +1,42 @@
/*******************************************************************************
* Copyright (c) 2011 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.debug.gdbjtag.core.dsf.gdb.service;
import java.util.Map;
import org.eclipse.cdt.debug.gdbjtag.core.GDBJtagDSFFinalLaunchSequence;
import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress;
import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch;
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
import org.eclipse.cdt.dsf.gdb.service.command.GDBControl_7_2;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
/**
* Jtag control service which selects the Jtag CompleteInitializationSequence.
* Use for GDB >= 7.2
*/
public class GDBJtagControl_7_2 extends GDBControl_7_2 {
public GDBJtagControl_7_2(DsfSession session, ILaunchConfiguration config, CommandFactory factory) {
super(session, config, factory);
}
protected Sequence getCompleteInitializationSequence(Map<String,Object> attributes, RequestMonitorWithProgress rm) {
GdbLaunch launch = (GdbLaunch)getSession().getModelAdapter(ILaunch.class);
IGDBBackend backend = getServicesTracker().getService(IGDBBackend.class);
return new GDBJtagDSFFinalLaunchSequence(getExecutor(), launch, backend.getSessionType(), backend.getIsAttachSession(), rm);
}
}

View file

@ -0,0 +1,42 @@
/*******************************************************************************
* Copyright (c) 2011 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.debug.gdbjtag.core.dsf.gdb.service;
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.CommandFactory_6_8;
import org.eclipse.cdt.dsf.mi.service.command.CommandFactory;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.debug.core.ILaunchConfiguration;
/**
* @since 8.0
*/
public class GdbJtagDebugServicesFactory extends GdbDebugServicesFactory {
public GdbJtagDebugServicesFactory(String version) {
super(version);
}
protected ICommandControl createCommandControl(DsfSession session, ILaunchConfiguration config) {
if (GDB_7_2_VERSION.compareTo(getVersion()) <= 0) {
return new GDBJtagControl_7_2(session, config, new CommandFactory_6_8());
}
if (GDB_7_0_VERSION.compareTo(getVersion()) <= 0) {
return new GDBJtagControl_7_0(session, config, new CommandFactory_6_8());
}
if (GDB_6_8_VERSION.compareTo(getVersion()) <= 0) {
return new GDBJtagControl(session, config, new CommandFactory_6_8());
}
return new GDBJtagControl(session, config, new CommandFactory());
}
}

View file

@ -0,0 +1,31 @@
/*******************************************************************************
* Copyright (c) 2011 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 implementation
*******************************************************************************/
package org.eclipse.cdt.debug.gdbjtag.core.dsf.gdb.service.macos;
import org.eclipse.cdt.debug.gdbjtag.core.dsf.gdb.service.GDBJtagControl;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
import org.eclipse.cdt.dsf.gdb.service.macos.MacOSCommandFactory;
import org.eclipse.cdt.dsf.gdb.service.macos.MacOSGdbDebugServicesFactory;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.debug.core.ILaunchConfiguration;
/** @since 8.0 */
public class MacOSGdbJtagDebugServicesFactory extends MacOSGdbDebugServicesFactory {
public MacOSGdbJtagDebugServicesFactory(String gdbVersion, String appleVersion) {
super(gdbVersion, appleVersion);
}
@Override
protected ICommandControl createCommandControl(DsfSession session, ILaunchConfiguration config) {
return new GDBJtagControl(session, config, new MacOSCommandFactory());
}
}