diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml index 655fa49925e..9d26c5623fc 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/plugin.xml @@ -167,6 +167,13 @@ adaptableType="org.eclipse.cdt.dsf.ui.viewmodel.IVMContext"> + + + + + diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/DisassemblyRunToLineAdapter.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/DisassemblyRunToLineAdapter.java new file mode 100644 index 00000000000..d71dc11f2aa --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/DisassemblyRunToLineAdapter.java @@ -0,0 +1,112 @@ +/******************************************************************************* + * Copyright (c) 2010 Ericsson and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Ericsson - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.dsf.gdb.internal.ui.actions; + +import java.math.BigInteger; + +import org.eclipse.cdt.core.IAddress; +import org.eclipse.cdt.debug.core.CDIDebugModel; +import org.eclipse.cdt.debug.core.model.IRunToAddress; +import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants; +import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.DisassemblySelection; +import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.IDisassemblyPart; +import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.provisional.IDisassemblySelection; +import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; +import org.eclipse.cdt.utils.Addr64; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.model.ISuspendResume; +import org.eclipse.debug.ui.DebugUITools; +import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.debug.ui.actions.IRunToLineTarget; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IWorkbenchPart; + +/** + * Run to line target adapter for the DSF Disassembly view + * + * @since 2.1 + */ +public class DisassemblyRunToLineAdapter implements IRunToLineTarget { + + /* (non-Javadoc) + * @see org.eclipse.debug.ui.actions.IRunToLineTarget#runToLine(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection, org.eclipse.debug.core.model.ISuspendResume) + */ + public void runToLine(IWorkbenchPart part, ISelection selection, ISuspendResume target) throws CoreException { + if (part instanceof IDisassemblyPart && selection instanceof ITextSelection) { + if (!(selection instanceof IDisassemblySelection)) { + selection = new DisassemblySelection((ITextSelection)selection, (IDisassemblyPart)part); + } + IDisassemblySelection disassemblySelection = (IDisassemblySelection)selection; + BigInteger rawAddress = disassemblySelection.getStartAddress(); + if (rawAddress == null) { + return; + } + + final IAddress address = new Addr64(rawAddress); + if (address != null && target instanceof IAdaptable) { + final IRunToAddress runToAddress = (IRunToAddress)((IAdaptable)target).getAdapter(IRunToAddress.class); + if (runToAddress != null && runToAddress.canRunToAddress(address)) { +// Runnable r = new Runnable() { +// public void run() { + try { + boolean skipBreakpoints = DebugUITools.getPreferenceStore().getBoolean(IDebugUIConstants.PREF_SKIP_BREAKPOINTS_DURING_RUN_TO_LINE); + runToAddress.runToAddress(address, skipBreakpoints); + } + catch( DebugException e ) { + failed( e ); + } +// } +// }; +// DebugPlugin.getDefault().asyncExec(r); + } + } + } + } + + /* (non-Javadoc) + * @see org.eclipse.debug.ui.actions.IRunToLineTarget#canRunToLine(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection, org.eclipse.debug.core.model.ISuspendResume) + */ + public boolean canRunToLine(IWorkbenchPart part, ISelection selection, ISuspendResume target) { + if (target instanceof IAdaptable && part instanceof IDisassemblyPart && selection instanceof ITextSelection) { + IRunToAddress runToAddress = (IRunToAddress)((IAdaptable)target).getAdapter(IRunToAddress.class); + if (runToAddress == null) { + return false; + } + + if (!(selection instanceof IDisassemblySelection)) { + selection = new DisassemblySelection((ITextSelection)selection, (IDisassemblyPart)part); + } + IDisassemblySelection disassemblySelection = (IDisassemblySelection)selection; + BigInteger rawAddress = disassemblySelection.getStartAddress(); + if (rawAddress == null) { + return false; + } + + final IAddress address = new Addr64(rawAddress); + return runToAddress.canRunToAddress(address); + } + + return false; + } + + protected void failed( Throwable e ) { + MultiStatus ms = new MultiStatus( CDIDebugModel.getPluginIdentifier(), IDsfStatusConstants.REQUEST_FAILED, "RunToLine failed", null ); //$NON-NLS-1$ + ms.add( new Status( IStatus.ERROR, CDIDebugModel.getPluginIdentifier(), IDsfStatusConstants.REQUEST_FAILED, e.getMessage(), e ) ); + GdbUIPlugin.log(ms); + } + +} diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRunToLine.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRunToLine.java index 047c6a85aaa..d2b24caf26b 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRunToLine.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/GdbRunToLine.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Wind River Systems and others. + * Copyright (c) 2009, 2010 Wind River Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,12 +7,15 @@ * * Contributors: * Wind River Systems - initial API and implementation + * Ericsson - Added support for IRunToAddress for DSF DisassemblyView (302324) *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.ui.actions; import java.util.concurrent.ExecutionException; import java.util.concurrent.RejectedExecutionException; +import org.eclipse.cdt.core.IAddress; +import org.eclipse.cdt.debug.core.model.IRunToAddress; import org.eclipse.cdt.debug.core.model.IRunToLine; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants; @@ -37,7 +40,7 @@ import org.eclipse.debug.ui.actions.IRunToLineTarget; * * @since 2.0 */ -public class GdbRunToLine implements IRunToLine { +public class GdbRunToLine implements IRunToLine, IRunToAddress { private final IExecutionDMContext fContext; @@ -46,14 +49,32 @@ public class GdbRunToLine implements IRunToLine { } public boolean canRunToLine(IFile file, int lineNumber) { - return canRunToLine(); + return canRunToLocation(); } public boolean canRunToLine(String fileName, int lineNumber) { - return canRunToLine(); + return canRunToLocation(); } - private boolean canRunToLine() { + public void runToLine(IFile file, int lineNumber, boolean skipBreakpoints) throws DebugException { + runToLine(file.getLocation().makeAbsolute().toOSString(), lineNumber, skipBreakpoints); + } + + public void runToLine(String fileName, int lineNumber, boolean skipBreakpoints) throws DebugException { + runToLocation(fileName + ":" + lineNumber, skipBreakpoints); //$NON-NLS-1$ + } + + /** @since 2.1 */ + public boolean canRunToAddress(IAddress address) { + return canRunToLocation(); + } + + /** @since 2.1 */ + public void runToAddress(IAddress address, boolean skipBreakpoints) throws DebugException { + runToLocation("*0x" + address.toString(16), skipBreakpoints); //$NON-NLS-1$ + } + + private boolean canRunToLocation() { DsfSession session = DsfSession.getSession(fContext.getSessionId()); if (session != null && session.isActive()) { try { @@ -83,11 +104,7 @@ public class GdbRunToLine implements IRunToLine { return false; } - public void runToLine(IFile file, int lineNumber, boolean skipBreakpoints) throws DebugException { - runToLine(file.getLocation().makeAbsolute().toOSString(), lineNumber, skipBreakpoints); - } - - public void runToLine(final String fileName, final int lineNumber, final boolean skipBreakpoints) throws DebugException { + private void runToLocation(final String location, final boolean skipBreakpoints) throws DebugException { DsfSession session = DsfSession.getSession(fContext.getSessionId()); if (session != null && session.isActive()) { Throwable exception = null; @@ -100,15 +117,9 @@ public class GdbRunToLine implements IRunToLine { IMIRunControl miRunControl = tracker.getService(IMIRunControl.class); if (miRunControl != null) { - miRunControl.runToLine( - fContext, fileName, Integer.toString(lineNumber), skipBreakpoints, - new DataRequestMonitor(ImmediateExecutor.getInstance(), rm) { - @Override - protected void handleSuccess() { - rm.setData(new Object()); - rm.done(); - }; - }); + miRunControl.runToLocation( + fContext, location, skipBreakpoints, + new DataRequestMonitor(ImmediateExecutor.getInstance(), rm)); } else { rm.setStatus(new Status(IStatus.ERROR, GdbUIPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "MIRunControl service not available", null)); //$NON-NLS-1$ rm.done(); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/RetargettableActionAdapterFactory.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/RetargettableActionAdapterFactory.java new file mode 100644 index 00000000000..4f2936dbd56 --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/actions/RetargettableActionAdapterFactory.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2010 Ericsson and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Ericsson - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.dsf.gdb.internal.ui.actions; + +import org.eclipse.cdt.debug.internal.ui.actions.IMoveToLineTarget; +import org.eclipse.cdt.debug.internal.ui.actions.IResumeAtLineTarget; +import org.eclipse.core.runtime.IAdapterFactory; +import org.eclipse.debug.ui.actions.IRunToLineTarget; + +/** + * Retargettable Action Adapter Factory for the DSF Disassembly view + * + * @since 2.1 + */ +public class RetargettableActionAdapterFactory implements IAdapterFactory { + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class) + */ + public Object getAdapter(Object adaptableObject, Class adapterType) { + if (adapterType == IRunToLineTarget.class) { + return new DisassemblyRunToLineAdapter(); + } +// if (adapterType == IResumeAtLineTarget.class) { +// return new DisassemblyResumeAtLineAdapter(); +// } +// if (adapterType == IMoveToLineTarget.class) { +// return new DisassemblyMoveToLineAdapter(); +// } + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList() + */ + public Class[] getAdapterList() { + return new Class[]{ IRunToLineTarget.class, IResumeAtLineTarget.class, IMoveToLineTarget.class }; + } +} diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java index 63615ef7677..58251ae421e 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2008 Wind River Systems and others. + * Copyright (c) 2006, 2010 Wind River Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -257,11 +257,9 @@ public class GDBRunControl extends MIRunControl { canResume(context, rm); } - /** @since 2.0 */ + /** @since 3.0 */ @Override - public void runToLine(final IExecutionDMContext context, String fileName, String lineNo, final boolean skipBreakpoints, final DataRequestMonitor rm){ - // Later add support for Address and function. - + public void runToLocation(IExecutionDMContext context, final String location, final boolean skipBreakpoints, final RequestMonitor rm){ assert context != null; final IMIExecutionDMContext dmc = DMContexts.getAncestorOfType(context, IMIExecutionDMContext.class); @@ -271,12 +269,11 @@ public class GDBRunControl extends MIRunControl { return; } - if (doCanResume(context)) { - final String fileLocation = fileName + ":" + lineNo; //$NON-NLS-1$ + if (doCanResume(dmc)) { IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(context, IBreakpointsTargetDMContext.class); getConnection().queueCommand( new MIBreakInsert(bpDmc, true, false, null, 0, - fileLocation, dmc.getThreadId()), + location, dmc.getThreadId()), new DataRequestMonitor(getExecutor(), rm) { @Override public void handleSuccess() { @@ -284,9 +281,9 @@ public class GDBRunControl extends MIRunControl { // or else we may get the stopped event, before we have set this variable. int bpId = getData().getMIBreakpoints()[0].getNumber(); String addr = getData().getMIBreakpoints()[0].getAddress(); - fRunToLineActiveOperation = new RunToLineActiveOperation(dmc, bpId, fileLocation, addr, skipBreakpoints); + fRunToLineActiveOperation = new RunToLineActiveOperation(dmc, bpId, location, addr, skipBreakpoints); - resume(context, new RequestMonitor(getExecutor(), rm) { + resume(dmc, new RequestMonitor(getExecutor(), rm) { @Override public void handleFailure() { IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(fRunToLineActiveOperation.getThreadContext(), diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0.java index a6ba893f2a1..912813a04b0 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008 Wind River Systems and others. + * Copyright (c) 2008, 2010 Wind River Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -435,10 +435,9 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro }); } - /** @since 2.0 */ + /** @since 3.0 */ @Override - public void runToLine(final IExecutionDMContext context, String fileName, String lineNo, final boolean skipBreakpoints, final DataRequestMonitor rm){ - // Later add support for Address and function. + public void runToLocation(final IExecutionDMContext context, final String location, final boolean skipBreakpoints, final RequestMonitor rm){ assert context != null; @@ -449,12 +448,11 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro return; } - if (doCanResume(context)) { - final String fileLocation = fileName + ":" + lineNo; //$NON-NLS-1$ + if (doCanResume(dmc)) { IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(context, IBreakpointsTargetDMContext.class); getConnection().queueCommand( new MIBreakInsert(bpDmc, true, false, null, 0, - fileLocation, dmc.getThreadId()), + location, dmc.getThreadId()), new DataRequestMonitor(getExecutor(), rm) { @Override public void handleSuccess() { @@ -462,9 +460,9 @@ public class GDBRunControl_7_0 extends MIRunControl implements IReverseRunContro // or else we may get the stopped event, before we have set this variable. int bpId = getData().getMIBreakpoints()[0].getNumber(); String addr = getData().getMIBreakpoints()[0].getAddress(); - fRunToLineActiveOperation = new RunToLineActiveOperation(dmc, bpId, fileLocation, addr, skipBreakpoints); + fRunToLineActiveOperation = new RunToLineActiveOperation(dmc, bpId, location, addr, skipBreakpoints); - resume(context, new RequestMonitor(getExecutor(), rm) { + resume(dmc, new RequestMonitor(getExecutor(), rm) { @Override public void handleFailure() { IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(fRunToLineActiveOperation.getThreadContext(), diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java index 6393a6edbf2..67120104903 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2008 Wind River Systems and others. + * Copyright (c) 2006, 2010 Wind River Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -608,7 +608,8 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo // Run to line // ------------------------------------------------------------------------ - public void runToLine(IExecutionDMContext context, String fileName, String lineNo, final boolean skipBreakpoints, final DataRequestMonitor rm) { + /** @since 3.0 */ + public void runToLocation(final IExecutionDMContext context, final String location, final boolean skipBreakpoints, final RequestMonitor rm){ assert context != null; @@ -620,26 +621,25 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo return; } - if (!doCanResume(context)) { + if (!doCanResume(dmc)) { rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE, "Cannot resume context", null)); //$NON-NLS-1$ rm.done(); return; } - MIThreadRunState threadState = fThreadRunStates.get(context); + MIThreadRunState threadState = fThreadRunStates.get(dmc); if (threadState == null) { rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE, - "Given context: " + context + " is not an MI execution context.", null)); //$NON-NLS-1$ //$NON-NLS-2$ + "Given context: " + dmc + " is not an MI execution context.", null)); //$NON-NLS-1$ //$NON-NLS-2$ rm.done(); return; } - final String fileLocation = fileName + ":" + lineNo; //$NON-NLS-1$ IBreakpointsTargetDMContext bpDmc = DMContexts.getAncestorOfType(context, IBreakpointsTargetDMContext.class); fConnection.queueCommand( new MIBreakInsert(bpDmc, true, false, null, 0, - fileLocation, dmc.getThreadId()), + location, dmc.getThreadId()), new DataRequestMonitor(getExecutor(), rm) { @Override public void handleSuccess() { @@ -647,7 +647,7 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo // or else we may get the stopped event, before we have set this variable. int bpId = getData().getMIBreakpoints()[0].getNumber(); String addr = getData().getMIBreakpoints()[0].getAddress(); - fRunToLineActiveOperation = new RunToLineActiveOperation(dmc, bpId, fileLocation, addr, skipBreakpoints); + fRunToLineActiveOperation = new RunToLineActiveOperation(dmc, bpId, location, addr, skipBreakpoints); resume(dmc, new RequestMonitor(getExecutor(), rm) { @Override diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/IMIRunControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/IMIRunControl.java index f949621b60f..3b896aec08a 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/IMIRunControl.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/IMIRunControl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Ericsson and others. + * Copyright (c) 2009, 2010 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,9 +10,8 @@ *******************************************************************************/ package org.eclipse.cdt.dsf.mi.service; -import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; +import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.debug.service.IRunControl; -import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo; /** * This interface provides methods for RunControl that are not @@ -27,8 +26,9 @@ public interface IMIRunControl extends IRunControl * If skipBreakpoints is false, any other breakpoint will stop this * command; while if skipBreakpoints is true, the operation will ignore * other breakpoints and continue until the specified location. + * + * @since 3.0 */ - void runToLine(IExecutionDMContext context, String fileName, String lineNo, - boolean skipBreakpoints, DataRequestMonitor rm); + void runToLocation(IExecutionDMContext context, String location, boolean skipBreakpoints, RequestMonitor rm); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java index db7b3ed0c9d..ab9dd0eec78 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2008 Wind River Systems and others. + * Copyright (c) 2006, 2010 Wind River Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -680,12 +680,9 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I } rm.done(); } - - /** - * Run selected execution thread to a given line number. - */ - public void runToLine(IExecutionDMContext context, String fileName, String lineNo, boolean skipBreakpoints, final DataRequestMonitor rm){ - // Later add support for Address and function. + + /** @since 3.0 */ + public void runToLocation(IExecutionDMContext context, String location, boolean skipBreakpoints, final RequestMonitor rm){ // skipBreakpoints is not used at the moment. Implement later assert context != null; @@ -697,10 +694,10 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I return; } - if (doCanResume(context)) { + if (doCanResume(dmc)) { fResumePending = true; - fMICommandCache.setContextAvailable(context, false); - fConnection.queueCommand(new MIExecUntil(dmc, fileName + ":" + lineNo), //$NON-NLS-1$ + fMICommandCache.setContextAvailable(dmc, false); + fConnection.queueCommand(new MIExecUntil(dmc, location), new DataRequestMonitor(getExecutor(), rm)); } else { rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED, diff --git a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java index 2a3adb43bee..e58278cc151 100644 --- a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java +++ b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 Ericsson and others. + * Copyright (c) 2007, 2010 Ericsson and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -13,18 +13,22 @@ package org.eclipse.cdt.tests.dsf.gdb.tests; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; +import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.debug.service.IRunControl; import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; +import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMData; import org.eclipse.cdt.dsf.debug.service.IRunControl.IResumedDMEvent; import org.eclipse.cdt.dsf.debug.service.IRunControl.IStartedDMEvent; +import org.eclipse.cdt.dsf.debug.service.IRunControl.ISuspendedDMEvent; import org.eclipse.cdt.dsf.debug.service.IRunControl.StateChangeReason; import org.eclipse.cdt.dsf.debug.service.IRunControl.StepType; import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl; import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext; import org.eclipse.cdt.dsf.mi.service.IMIProcesses; +import org.eclipse.cdt.dsf.mi.service.IMIRunControl; import org.eclipse.cdt.dsf.mi.service.MIProcesses; import org.eclipse.cdt.dsf.mi.service.MIRunControl; import org.eclipse.cdt.dsf.mi.service.command.events.MIStoppedEvent; @@ -55,10 +59,11 @@ public class MIRunControlTest extends BaseTestCase { private DsfServicesTracker fServicesTracker; private IGDBControl fGDBCtrl; - private MIRunControl fRunCtrl; + private IMIRunControl fRunCtrl; private IMIProcesses fProcService; private IContainerDMContext fContainerDmc; + private IExecutionDMContext fThreadExecDmc; /* * Path to executable @@ -80,8 +85,10 @@ public class MIRunControlTest extends BaseTestCase { IMIProcesses procService = fServicesTracker.getService(IMIProcesses.class); IProcessDMContext procDmc = procService.createProcessContext(fGDBCtrl.getContext(), MIProcesses.UNIQUE_GROUP_ID); fContainerDmc = procService.createContainerContext(procDmc, MIProcesses.UNIQUE_GROUP_ID); + IThreadDMContext threadDmc = procService.createThreadContext(procDmc, "1"); + fThreadExecDmc = procService.createExecutionContext(fContainerDmc, threadDmc, "1"); - fRunCtrl = fServicesTracker.getService(MIRunControl.class); + fRunCtrl = fServicesTracker.getService(IMIRunControl.class); fProcService = fServicesTracker.getService(IMIProcesses.class); } @@ -263,7 +270,7 @@ public class MIRunControlTest extends BaseTestCase { String pid = MIProcesses.UNIQUE_GROUP_ID; IProcessDMContext procDmc = fProcService.createProcessContext(fGDBCtrl.getContext(), pid); IContainerDMContext containerDmc = fProcService.createContainerContext(procDmc, pid); - fRunCtrl.getExecutionData(fRunCtrl.createMIExecutionContext(containerDmc, 1), rm); + fRunCtrl.getExecutionData(((MIRunControl)fRunCtrl).createMIExecutionContext(containerDmc, 1), rm); } }); wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER); @@ -518,9 +525,6 @@ public class MIRunControlTest extends BaseTestCase { wait.waitReset(); } - - - @Test public void resumeContainerContext() throws InterruptedException{ @@ -573,4 +577,51 @@ public class MIRunControlTest extends BaseTestCase { wait.waitReset(); } + + @Test + public void runToLine() throws InterruptedException{ + final AsyncCompletionWaitor wait = new AsyncCompletionWaitor(); + + + fRunCtrl.getExecutor().submit(new Runnable() { + public void run() { + fRunCtrl.runToLocation(fThreadExecDmc, SOURCE_NAME + ":27", true, + new RequestMonitor(fRunCtrl.getExecutor(), null) { + @Override + protected void handleCompleted() { + wait.waitFinished(getStatus()); + } + }); + } + }); + wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER); + Assert.assertTrue(wait.getMessage(), wait.isOK()); + wait.waitReset(); + + try { + new ServiceEventWaitor( + getGDBLaunch().getSession(), + ISuspendedDMEvent.class).waitForEvent(ServiceEventWaitor.WAIT_FOREVER); + } catch (Exception e) { + Assert.fail("Exception raised:: " + e.getMessage()); + e.printStackTrace(); + return; + } + + fRunCtrl.getExecutor().submit(new Runnable() { + public void run() { + String pid = MIProcesses.UNIQUE_GROUP_ID; + IProcessDMContext procDmc = fProcService.createProcessContext(fGDBCtrl.getContext(), pid); + IContainerDMContext containerDmc = fProcService.createContainerContext(procDmc, pid); + + wait.setReturnInfo(fRunCtrl.isSuspended(containerDmc)); + wait.waitFinished(); + } + }); + + wait.waitUntilDone(AsyncCompletionWaitor.WAIT_FOREVER); + Assert.assertTrue("Target is running. It should have been suspended", (Boolean)wait.getReturnInfo()); + + wait.waitReset(); + } }