diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/launch/StackFramesVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/launch/StackFramesVMNode.java index 6ed33d7797a..89023c461e3 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/launch/StackFramesVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/launch/StackFramesVMNode.java @@ -330,11 +330,18 @@ public class StackFramesVMNode extends AbstractDMVMNode public void buildDelta(final Object e, final VMDelta parent, final int nodeOffset, final RequestMonitor rm) { if (e instanceof IContainerSuspendedDMEvent) { - IExecutionDMContext threadDmc = null; + IContainerSuspendedDMEvent csEvent = (IContainerSuspendedDMEvent)e; + + IExecutionDMContext triggeringCtx = csEvent.getTriggeringContexts().length != 0 + ? csEvent.getTriggeringContexts()[0] : null; + if (parent.getElement() instanceof IDMVMContext) { + IExecutionDMContext threadDmc = null; threadDmc = DMContexts.getAncestorOfType( ((IDMVMContext)parent.getElement()).getDMContext(), IExecutionDMContext.class); + buildDeltaForSuspendedEvent((ISuspendedDMEvent)e, threadDmc, triggeringCtx, parent, nodeOffset, rm); + } else { + rm.done(); } - buildDeltaForSuspendedEvent((ISuspendedDMEvent)e, threadDmc, ((IContainerSuspendedDMEvent)e).getTriggeringContext(), parent, nodeOffset, rm); } else if (e instanceof ISuspendedDMEvent) { IExecutionDMContext execDmc = ((ISuspendedDMEvent)e).getDMContext(); buildDeltaForSuspendedEvent((ISuspendedDMEvent)e, execDmc, execDmc, parent, nodeOffset, rm); @@ -361,7 +368,7 @@ public class StackFramesVMNode extends AbstractDMVMNode // Refresh the whole list of stack frames unless the target is already stepping the next command. In // which case, the refresh will occur when the stepping sequence slows down or stops. Trying to // refresh the whole stack trace with every step would slow down stepping too much. - if (!runControlService.isStepping(triggeringCtx)) { + if (triggeringCtx == null || !runControlService.isStepping(triggeringCtx)) { parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); } diff --git a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRunControl.java b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRunControl.java index 82e36257fd6..7d5342dc272 100644 --- a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRunControl.java +++ b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/IRunControl.java @@ -65,10 +65,10 @@ public interface IRunControl extends IDMService */ public interface IContainerSuspendedDMEvent extends ISuspendedDMEvent { /** - * Returns the context which triggered the resume, which could be - * null if not known. + * Returns the contexts which triggered the resume, which could be + * an empty array if not known. */ - IExecutionDMContext getTriggeringContext(); + IExecutionDMContext[] getTriggeringContexts(); } /** @@ -76,10 +76,10 @@ public interface IRunControl extends IDMService */ public interface IContainerResumedDMEvent extends IResumedDMEvent { /** - * Returns the context which triggered the resume, which could be - * null if not known. + * Returns the contexts which triggered the resume, which could be an + * empty array if not known. */ - IExecutionDMContext getTriggeringContext(); + IExecutionDMContext[] getTriggeringContexts(); } /** diff --git a/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ThreadVMNode.java b/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ThreadVMNode.java index deb7ab3364d..1ab9ccd43be 100644 --- a/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ThreadVMNode.java +++ b/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ThreadVMNode.java @@ -21,7 +21,6 @@ import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.IDsfStatusConstants; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.DMContexts; -import org.eclipse.dd.dsf.datamodel.IDMContext; import org.eclipse.dd.dsf.datamodel.IDMEvent; import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext; @@ -101,16 +100,16 @@ public class ThreadVMNode extends AbstractDMVMNode @Override public void getContextsForEvent(VMDelta parentDelta, Object e, final DataRequestMonitor rm) { if(e instanceof IContainerResumedDMEvent) { - IDMContext triggerContext = ((IContainerResumedDMEvent)e).getTriggeringContext(); - if (triggerContext != null) { - rm.setData(new IVMContext[] { createVMContext(triggerContext) }); + IExecutionDMContext[] triggerContexts = ((IContainerResumedDMEvent)e).getTriggeringContexts(); + if (triggerContexts.length != 0) { + rm.setData(new IVMContext[] { createVMContext(triggerContexts[0]) }); rm.done(); return; } } else if(e instanceof IContainerSuspendedDMEvent) { - IDMContext triggerContext = ((IContainerSuspendedDMEvent)e).getTriggeringContext(); - if (triggerContext != null) { - rm.setData(new IVMContext[] { createVMContext(triggerContext) }); + IExecutionDMContext[] triggerContexts = ((IContainerSuspendedDMEvent)e).getTriggeringContexts(); + if (triggerContexts.length != 0) { + rm.setData(new IVMContext[] { createVMContext(triggerContexts[0]) }); rm.done(); return; } @@ -274,15 +273,15 @@ public class ThreadVMNode extends AbstractDMVMNode public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor rm) { if(e instanceof IContainerResumedDMEvent) { - IDMContext triggeringContext = ((IContainerResumedDMEvent)e).getTriggeringContext(); - if (triggeringContext != null) { - parentDelta.addNode(createVMContext(triggeringContext), IModelDelta.CONTENT); + IExecutionDMContext[] triggeringContexts = ((IContainerResumedDMEvent)e).getTriggeringContexts(); + if (triggeringContexts.length != 0) { + parentDelta.addNode(createVMContext(triggeringContexts[0]), IModelDelta.CONTENT); } rm.done(); } else if (e instanceof IContainerSuspendedDMEvent) { - IDMContext triggeringContext = ((IContainerSuspendedDMEvent)e).getTriggeringContext(); - if (triggeringContext != null) { - parentDelta.addNode(createVMContext(triggeringContext), IModelDelta.CONTENT); + IExecutionDMContext[] triggeringContexts = ((IContainerSuspendedDMEvent)e).getTriggeringContexts(); + if (triggeringContexts.length != 0) { + parentDelta.addNode(createVMContext(triggeringContexts[0]), IModelDelta.CONTENT); } rm.done(); } else if(e instanceof IResumedDMEvent || e instanceof ISuspendedDMEvent) { diff --git a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRunControl.java b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRunControl.java index c0879ffed74..b87010fdc49 100644 --- a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRunControl.java +++ b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRunControl.java @@ -180,14 +180,15 @@ public class MIRunControl extends AbstractDsfService implements IRunControl protected static class ContainerSuspendedEvent extends SuspendedEvent implements IContainerSuspendedDMEvent { - final IExecutionDMContext triggeringDmc; + final IExecutionDMContext[] triggeringDmcs; ContainerSuspendedEvent(IContainerDMContext containerDmc, MIStoppedEvent miInfo, IExecutionDMContext triggeringDmc) { super(containerDmc, miInfo); - this.triggeringDmc = triggeringDmc; + this.triggeringDmcs = triggeringDmc != null + ? new IExecutionDMContext[] { triggeringDmc } : new IExecutionDMContext[0]; } - public IExecutionDMContext getTriggeringContext() { - return triggeringDmc; + public IExecutionDMContext[] getTriggeringContexts() { + return triggeringDmcs; } } @@ -223,15 +224,16 @@ public class MIRunControl extends AbstractDsfService implements IRunControl protected static class ContainerResumedEvent extends ResumedEvent implements IContainerResumedDMEvent { - final IExecutionDMContext triggeringDmc; + final IExecutionDMContext[] triggeringDmcs; ContainerResumedEvent(IContainerDMContext containerDmc, MIRunningEvent miInfo, IExecutionDMContext triggeringDmc) { super(containerDmc, miInfo); - this.triggeringDmc = triggeringDmc; + this.triggeringDmcs = triggeringDmc != null + ? new IExecutionDMContext[] { triggeringDmc } : new IExecutionDMContext[0]; } - public IExecutionDMContext getTriggeringContext() { - return triggeringDmc; + public IExecutionDMContext[] getTriggeringContexts() { + return triggeringDmcs; } } @@ -394,7 +396,8 @@ public class MIRunControl extends AbstractDsfService implements IRunControl fMICommandCache.setContextAvailable(e.getDMContext(), true); fMICommandCache.reset(); fStateChangeReason = e.getReason(); - fStateChangeTriggeringContext = e.getTriggeringContext(); + fStateChangeTriggeringContext = e.getTriggeringContexts().length != 0 + ? e.getTriggeringContexts()[0] : null; fSuspended = true; fStepping = false; } @@ -427,13 +430,23 @@ public class MIRunControl extends AbstractDsfService implements IRunControl /////////////////////////////////////////////////////////////////////////// // IRunControl - public boolean canResume(IExecutionDMContext context) { - return !fTerminated && isSuspended(context) && !fResumePending; + public void canResume(IExecutionDMContext context, DataRequestMonitor rm) { + rm.setData(doCanResume(context)); + rm.done(); + } + + private boolean doCanResume(IExecutionDMContext context) { + return !fTerminated && isSuspended(context) && !fResumePending; } - public boolean canSuspend(IExecutionDMContext context) { - return !fTerminated && !isSuspended(context); + public void canSuspend(IExecutionDMContext context, DataRequestMonitor rm) { + rm.setData(doCanSuspend(context)); + rm.done(); } + + private boolean doCanSuspend(IExecutionDMContext context) { + return !fTerminated && !isSuspended(context); + } public boolean isSuspended(IExecutionDMContext context) { return !fTerminated && fSuspended; @@ -446,7 +459,7 @@ public class MIRunControl extends AbstractDsfService implements IRunControl public void resume(IExecutionDMContext context, final RequestMonitor rm) { assert context != null; - if (canResume(context)) { + if (doCanResume(context)) { fResumePending = true; // Cygwin GDB will accept commands and execute them after the step // which is not what we want, so mark the target as unavailable @@ -482,7 +495,7 @@ public class MIRunControl extends AbstractDsfService implements IRunControl public void suspend(IExecutionDMContext context, final RequestMonitor rm){ assert context != null; - if (canSuspend(context)) { + if (doCanSuspend(context)) { MIExecInterrupt cmd = null; if(context instanceof IContainerDMContext){ cmd = new MIExecInterrupt(context); @@ -511,8 +524,8 @@ public class MIRunControl extends AbstractDsfService implements IRunControl } } - public boolean canStep(IExecutionDMContext context, StepType stepType) { - return canResume(context); + public void canStep(IExecutionDMContext context, StepType stepType, DataRequestMonitor rm) { + canResume(context, rm); } public void step(IExecutionDMContext context, StepType stepType, final RequestMonitor rm) { @@ -525,7 +538,7 @@ public class MIRunControl extends AbstractDsfService implements IRunControl return; } - if (!canResume(context)) { + if (!doCanResume(context)) { rm.setStatus(new Status(IStatus.ERROR, MIPlugin.PLUGIN_ID, INVALID_STATE, "Cannot resume context", null)); //$NON-NLS-1$ rm.done(); return; @@ -567,15 +580,6 @@ public class MIRunControl extends AbstractDsfService implements IRunControl } } - public boolean canInstructionStep(IExecutionDMContext context, StepType stepType) { - return false; - } - - public void instructionStep(IExecutionDMContext context, StepType stepType, RequestMonitor rm) { - rm.setStatus(new Status(IStatus.ERROR, MIPlugin.PLUGIN_ID, NOT_SUPPORTED, "Operation not implemented", null)); //$NON-NLS-1$ - rm.done(); - } - public void getExecutionContexts(final IContainerDMContext containerDmc, final DataRequestMonitor rm) { fMICommandCache.execute( new MIThreadListIds(containerDmc), @@ -631,7 +635,7 @@ public class MIRunControl extends AbstractDsfService implements IRunControl return; } - if (canResume(context)) { + if (doCanResume(context)) { fResumePending = true; fMICommandCache.setContextAvailable(context, false); fConnection.queueCommand(new MIExecUntil(dmc, fileName + ":" + lineNo), //$NON-NLS-1$