mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
[233716] - [debug view][run control] Step buttons are still available when stepping over a sleep() call
This commit is contained in:
parent
abe5d81684
commit
5c5e9082f4
4 changed files with 124 additions and 39 deletions
|
@ -18,9 +18,12 @@ import org.eclipse.dd.dsf.datamodel.DMContexts;
|
||||||
import org.eclipse.dd.dsf.datamodel.IDMEvent;
|
import org.eclipse.dd.dsf.datamodel.IDMEvent;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRunControl;
|
import org.eclipse.dd.dsf.debug.service.IRunControl;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext;
|
import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext;
|
||||||
|
import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerResumedDMEvent;
|
||||||
|
import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerSuspendedDMEvent;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext;
|
import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRunControl.IExitedDMEvent;
|
import org.eclipse.dd.dsf.debug.service.IRunControl.IExitedDMEvent;
|
||||||
import org.eclipse.dd.dsf.debug.service.IRunControl.IStartedDMEvent;
|
import org.eclipse.dd.dsf.debug.service.IRunControl.IStartedDMEvent;
|
||||||
|
import org.eclipse.dd.dsf.debug.service.StepQueueManager.ISteppingTimedOutEvent;
|
||||||
import org.eclipse.dd.dsf.service.DsfSession;
|
import org.eclipse.dd.dsf.service.DsfSession;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.VMDelta;
|
import org.eclipse.dd.dsf.ui.viewmodel.VMDelta;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode;
|
import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode;
|
||||||
|
@ -62,8 +65,14 @@ public abstract class AbstractContainerVMNode extends AbstractDMVMNode implement
|
||||||
protected abstract void updateLabelInSessionThread(ILabelUpdate[] updates);
|
protected abstract void updateLabelInSessionThread(ILabelUpdate[] updates);
|
||||||
|
|
||||||
public int getDeltaFlags(Object e) {
|
public int getDeltaFlags(Object e) {
|
||||||
if(e instanceof IRunControl.IContainerResumedDMEvent ||
|
if (e instanceof IContainerResumedDMEvent &&
|
||||||
e instanceof IRunControl.IContainerSuspendedDMEvent)
|
((IContainerResumedDMEvent)e).getReason() != IRunControl.StateChangeReason.STEP)
|
||||||
|
{
|
||||||
|
return IModelDelta.CONTENT;
|
||||||
|
} else if (e instanceof IContainerSuspendedDMEvent) {
|
||||||
|
return IModelDelta.CONTENT;
|
||||||
|
} else if (e instanceof ISteppingTimedOutEvent &&
|
||||||
|
((ISteppingTimedOutEvent)e).getDMContext() instanceof IContainerDMContext)
|
||||||
{
|
{
|
||||||
return IModelDelta.CONTENT;
|
return IModelDelta.CONTENT;
|
||||||
} else if (e instanceof IExitedDMEvent) {
|
} else if (e instanceof IExitedDMEvent) {
|
||||||
|
@ -79,10 +88,19 @@ public abstract class AbstractContainerVMNode extends AbstractDMVMNode implement
|
||||||
}
|
}
|
||||||
|
|
||||||
public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) {
|
public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) {
|
||||||
if(e instanceof IRunControl.IContainerResumedDMEvent ||
|
if(e instanceof IContainerResumedDMEvent &&
|
||||||
e instanceof IRunControl.IContainerSuspendedDMEvent)
|
((IContainerResumedDMEvent)e).getReason() != IRunControl.StateChangeReason.STEP)
|
||||||
{
|
{
|
||||||
parentDelta.addNode(createVMContext(((IDMEvent<?>)e).getDMContext()), IModelDelta.CONTENT);
|
parentDelta.addNode(createVMContext(((IDMEvent<?>)e).getDMContext()), IModelDelta.CONTENT);
|
||||||
|
} else if (e instanceof IContainerSuspendedDMEvent) {
|
||||||
|
parentDelta.addNode(createVMContext(((IDMEvent<?>)e).getDMContext()), IModelDelta.CONTENT);
|
||||||
|
} else if (e instanceof ISteppingTimedOutEvent &&
|
||||||
|
((ISteppingTimedOutEvent)e).getDMContext() instanceof IContainerDMContext)
|
||||||
|
{
|
||||||
|
parentDelta.addNode(createVMContext(((IDMEvent<?>)e).getDMContext()), IModelDelta.CONTENT);
|
||||||
|
// Workaround for bug 233730: we need to add a separate delta node for the state flag in
|
||||||
|
// order to trigger an update of the run control actions.
|
||||||
|
parentDelta.addNode(createVMContext(((IDMEvent<?>)e).getDMContext()), IModelDelta.STATE);
|
||||||
} else if (e instanceof IExitedDMEvent) {
|
} else if (e instanceof IExitedDMEvent) {
|
||||||
IExecutionDMContext exeContext= ((IExitedDMEvent) e).getDMContext();
|
IExecutionDMContext exeContext= ((IExitedDMEvent) e).getDMContext();
|
||||||
if (exeContext instanceof IContainerDMContext) {
|
if (exeContext instanceof IContainerDMContext) {
|
||||||
|
|
|
@ -209,31 +209,51 @@ public abstract class AbstractThreadVMNode extends AbstractDMVMNode
|
||||||
|
|
||||||
|
|
||||||
public int getDeltaFlags(Object e) {
|
public int getDeltaFlags(Object e) {
|
||||||
if(e instanceof IResumedDMEvent || e instanceof ISuspendedDMEvent) {
|
if (e instanceof IContainerResumedDMEvent || e instanceof IContainerSuspendedDMEvent) {
|
||||||
|
// No need to react to container events, because the container
|
||||||
|
// nodes will deal with them. We need this if statement however,
|
||||||
|
// because the these events extend IResumedDMEvent and
|
||||||
|
// ISuspendedDMEvent and would trigger the if statement below.
|
||||||
|
return IModelDelta.NO_CHANGE;
|
||||||
|
} else if (e instanceof IResumedDMEvent &&
|
||||||
|
((IResumedDMEvent)e).getReason() != IRunControl.StateChangeReason.STEP)
|
||||||
|
{
|
||||||
return IModelDelta.CONTENT;
|
return IModelDelta.CONTENT;
|
||||||
}
|
} else if (e instanceof ISuspendedDMEvent) {
|
||||||
if (e instanceof ModelProxyInstalledEvent) {
|
return IModelDelta.CONTENT;
|
||||||
|
} else if (e instanceof ISteppingTimedOutEvent &&
|
||||||
|
!(((ISteppingTimedOutEvent)e).getDMContext() instanceof IContainerDMContext) )
|
||||||
|
{
|
||||||
|
return IModelDelta.CONTENT;
|
||||||
|
} else if (e instanceof ModelProxyInstalledEvent) {
|
||||||
return IModelDelta.SELECT | IModelDelta.EXPAND;
|
return IModelDelta.SELECT | IModelDelta.EXPAND;
|
||||||
}
|
}
|
||||||
return IModelDelta.NO_CHANGE;
|
return IModelDelta.NO_CHANGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor rm) {
|
public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor rm) {
|
||||||
if(e instanceof IContainerResumedDMEvent) {
|
if(e instanceof IContainerResumedDMEvent || e instanceof IContainerSuspendedDMEvent) {
|
||||||
IExecutionDMContext[] triggeringContexts = ((IContainerResumedDMEvent)e).getTriggeringContexts();
|
// No need to react to container events, because the container
|
||||||
if (triggeringContexts.length != 0) {
|
// nodes will deal with them. We need this if statement however,
|
||||||
parentDelta.addNode(createVMContext(triggeringContexts[0]), IModelDelta.CONTENT);
|
// because the these events extend IResumedDMEvent and
|
||||||
}
|
// ISuspendedDMEvent and would trigger the if statement below.
|
||||||
rm.done();
|
rm.done();
|
||||||
} else if (e instanceof IContainerSuspendedDMEvent) {
|
} else if(e instanceof IResumedDMEvent &&
|
||||||
IExecutionDMContext[] triggeringContexts = ((IContainerSuspendedDMEvent)e).getTriggeringContexts();
|
((IResumedDMEvent)e).getReason() != IRunControl.StateChangeReason.STEP)
|
||||||
if (triggeringContexts.length != 0) {
|
{
|
||||||
parentDelta.addNode(createVMContext(triggeringContexts[0]), IModelDelta.CONTENT);
|
|
||||||
}
|
|
||||||
rm.done();
|
|
||||||
} else if(e instanceof IResumedDMEvent || e instanceof ISuspendedDMEvent) {
|
|
||||||
parentDelta.addNode(createVMContext(((IDMEvent<?>)e).getDMContext()), IModelDelta.CONTENT);
|
parentDelta.addNode(createVMContext(((IDMEvent<?>)e).getDMContext()), IModelDelta.CONTENT);
|
||||||
rm.done();
|
rm.done();
|
||||||
|
} else if (e instanceof ISuspendedDMEvent) {
|
||||||
|
parentDelta.addNode(createVMContext(((IDMEvent<?>)e).getDMContext()), IModelDelta.CONTENT);
|
||||||
|
rm.done();
|
||||||
|
} else if (e instanceof ISteppingTimedOutEvent &&
|
||||||
|
!(((ISteppingTimedOutEvent)e).getDMContext() instanceof IContainerDMContext) )
|
||||||
|
{
|
||||||
|
parentDelta.addNode(createVMContext(((IDMEvent<?>)e).getDMContext()), IModelDelta.CONTENT);
|
||||||
|
// Workaround for bug 233730: we need to add a separate delta node for the state flag in
|
||||||
|
// order to trigger an update of the run control actions.
|
||||||
|
parentDelta.addNode(createVMContext(((IDMEvent<?>)e).getDMContext()), IModelDelta.STATE);
|
||||||
|
rm.done();
|
||||||
} else if (e instanceof ModelProxyInstalledEvent) {
|
} else if (e instanceof ModelProxyInstalledEvent) {
|
||||||
getThreadVMCForModelProxyInstallEvent(
|
getThreadVMCForModelProxyInstallEvent(
|
||||||
parentDelta,
|
parentDelta,
|
||||||
|
|
|
@ -38,6 +38,7 @@ import org.eclipse.dd.dsf.ui.viewmodel.VMDelta;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode;
|
import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMProvider;
|
import org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMProvider;
|
||||||
import org.eclipse.dd.dsf.ui.viewmodel.datamodel.IDMVMContext;
|
import org.eclipse.dd.dsf.ui.viewmodel.datamodel.IDMVMContext;
|
||||||
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest;
|
||||||
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
|
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
|
||||||
|
@ -77,6 +78,30 @@ public class StackFramesVMNode extends AbstractDMVMNode
|
||||||
update.done();
|
update.done();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void updateElementCountInSessionThread(final IChildrenCountUpdate update) {
|
||||||
|
IStack stackService = getServicesTracker().getService(IStack.class);
|
||||||
|
final IExecutionDMContext execDmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IExecutionDMContext.class);
|
||||||
|
if (stackService == null || execDmc == null) {
|
||||||
|
handleFailedUpdate(update);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
stackService.getStackDepth(
|
||||||
|
execDmc, 0,
|
||||||
|
new ViewerDataRequestMonitor<Integer>(getSession().getExecutor(), update) {
|
||||||
|
@Override
|
||||||
|
public void handleCompleted() {
|
||||||
|
if (!isSuccess()) {
|
||||||
|
handleFailedUpdate(update);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
update.setChildCount(getData());
|
||||||
|
update.done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode#updateElementsInSessionThread(org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate)
|
* @see org.eclipse.dd.dsf.ui.viewmodel.datamodel.AbstractDMVMNode#updateElementsInSessionThread(org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate)
|
||||||
|
@ -90,6 +115,23 @@ public class StackFramesVMNode extends AbstractDMVMNode
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (update.getOffset() == 0 && update.getLength() == 1) {
|
||||||
|
stackService.getTopFrame(
|
||||||
|
execDmc,
|
||||||
|
new ViewerDataRequestMonitor<IFrameDMContext>(getSession().getExecutor(), update) {
|
||||||
|
@Override
|
||||||
|
public void handleCompleted() {
|
||||||
|
if (!isSuccess()) {
|
||||||
|
handleFailedUpdate(update);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
update.setChild(createVMContext(getData()), 0);
|
||||||
|
update.done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Requesting top stack frame only
|
||||||
|
} else {
|
||||||
stackService.getFrames(
|
stackService.getFrames(
|
||||||
execDmc,
|
execDmc,
|
||||||
new ViewerDataRequestMonitor<IFrameDMContext[]>(getSession().getExecutor(), update) {
|
new ViewerDataRequestMonitor<IFrameDMContext[]>(getSession().getExecutor(), update) {
|
||||||
|
@ -104,6 +146,7 @@ public class StackFramesVMNode extends AbstractDMVMNode
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
|
@ -249,7 +292,7 @@ public class StackFramesVMNode extends AbstractDMVMNode
|
||||||
getVMProvider().updateNode(
|
getVMProvider().updateNode(
|
||||||
this,
|
this,
|
||||||
new VMChildrenUpdate(
|
new VMChildrenUpdate(
|
||||||
parentDelta, getVMProvider().getPresentationContext(), -1, -1,
|
parentDelta, getVMProvider().getPresentationContext(), 0, 1,
|
||||||
new DataRequestMonitor<List<Object>>(getExecutor(), rm) {
|
new DataRequestMonitor<List<Object>>(getExecutor(), rm) {
|
||||||
@Override
|
@Override
|
||||||
public void handleCompleted() {
|
public void handleCompleted() {
|
||||||
|
@ -391,7 +434,7 @@ public class StackFramesVMNode extends AbstractDMVMNode
|
||||||
|
|
||||||
private void buildDeltaForSteppingTimedOutEvent(final StepQueueManager.ISteppingTimedOutEvent e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor rm) {
|
private void buildDeltaForSteppingTimedOutEvent(final StepQueueManager.ISteppingTimedOutEvent e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor rm) {
|
||||||
// Repaint the stack frame images to have the running symbol.
|
// Repaint the stack frame images to have the running symbol.
|
||||||
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
|
//parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);
|
||||||
rm.done();
|
rm.done();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
package org.eclipse.dd.dsf.ui.viewmodel.update;
|
package org.eclipse.dd.dsf.ui.viewmodel.update;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
@ -238,7 +239,7 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
||||||
* Also, the ordering is used to optimize the flushing of the cache data (see
|
* Also, the ordering is used to optimize the flushing of the cache data (see
|
||||||
* {@link FlushMarkerKey} for more details).
|
* {@link FlushMarkerKey} for more details).
|
||||||
*/
|
*/
|
||||||
private final Map<Object, Entry> fCacheData = new HashMap<Object, Entry>(200, 0.75f);
|
private final Map<Object, Entry> fCacheData = Collections.synchronizedMap(new HashMap<Object, Entry>(200, 0.75f));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pointer to the first cache entry in the double-linked list of cache entries.
|
* Pointer to the first cache entry in the double-linked list of cache entries.
|
||||||
|
@ -758,9 +759,12 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public IDMData getArchivedModelData(IVMNode node, IViewerUpdate update, IDMContext dmc) {
|
public IDMData getArchivedModelData(IVMNode node, IViewerUpdate update, IDMContext dmc) {
|
||||||
ElementDataKey key = makeEntryKey(node, update);
|
ElementDataKey key = makeEntryKey(node, update);
|
||||||
final ElementDataEntry entry = getElementDataEntry(key);
|
final Entry entry = fCacheData.get(key);
|
||||||
if ( entry.fArchiveData != null) {
|
if ( entry instanceof ElementDataEntry) {
|
||||||
return entry.fArchiveData.get(dmc);
|
Map<IDMContext,IDMData> archiveData = ((ElementDataEntry)entry).fArchiveData;
|
||||||
|
if (archiveData != null) {
|
||||||
|
return archiveData.get(dmc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue