1
0
Fork 0
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:
Pawel Piech 2008-05-23 20:37:58 +00:00
parent abe5d81684
commit 5c5e9082f4
4 changed files with 124 additions and 39 deletions

View file

@ -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,10 +65,16 @@ 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) {
return IModelDelta.CONTENT; return IModelDelta.CONTENT;
} else if (e instanceof IStartedDMEvent) { } else if (e instanceof IStartedDMEvent) {
@ -79,11 +88,20 @@ 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 IExitedDMEvent) { } 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) {
IExecutionDMContext exeContext= ((IExitedDMEvent) e).getDMContext(); IExecutionDMContext exeContext= ((IExitedDMEvent) e).getDMContext();
if (exeContext instanceof IContainerDMContext) { if (exeContext instanceof IContainerDMContext) {
parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT);

View file

@ -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;
} else if (e instanceof ISuspendedDMEvent) {
return IModelDelta.CONTENT; return IModelDelta.CONTENT;
} } else if (e instanceof ISteppingTimedOutEvent &&
if (e instanceof ModelProxyInstalledEvent) { !(((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,

View file

@ -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,19 +115,37 @@ public class StackFramesVMNode extends AbstractDMVMNode
return; return;
} }
stackService.getFrames( if (update.getOffset() == 0 && update.getLength() == 1) {
execDmc, stackService.getTopFrame(
new ViewerDataRequestMonitor<IFrameDMContext[]>(getSession().getExecutor(), update) { execDmc,
@Override new ViewerDataRequestMonitor<IFrameDMContext>(getSession().getExecutor(), update) {
public void handleCompleted() { @Override
if (!isSuccess()) { public void handleCompleted() {
handleFailedUpdate(update); if (!isSuccess()) {
return; handleFailedUpdate(update);
return;
}
update.setChild(createVMContext(getData()), 0);
update.done();
} }
fillUpdateWithVMCs(update, getData()); });
update.done();
} // Requesting top stack frame only
}); } else {
stackService.getFrames(
execDmc,
new ViewerDataRequestMonitor<IFrameDMContext[]>(getSession().getExecutor(), update) {
@Override
public void handleCompleted() {
if (!isSuccess()) {
handleFailedUpdate(update);
return;
}
fillUpdateWithVMCs(update, getData());
update.done();
}
});
}
} }
/* /*
@ -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();
} }

View file

@ -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;
} }