diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/SteppingController.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/SteppingController.java index 8c7d50007b8..0b98b8240b9 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/SteppingController.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/SteppingController.java @@ -73,7 +73,7 @@ public final class SteppingController implements IStepQueueManager * stepping is enabled. This also serves as a safeguard in the case stepping * control participants fail to indicate completion of event processing. */ - public final static int MAX_STEP_DELAY= 1000; + public final static int MAX_STEP_DELAY= 5000; private final static boolean DEBUG = "true".equals(Platform.getDebugOption("org.eclipse.dd.dsf.debug.ui/stepping")); //$NON-NLS-1$ //$NON-NLS-2$ @@ -216,6 +216,7 @@ public final class SteppingController implements IStepQueueManager * @param execCtx */ public void doneStepping(final IExecutionDMContext execCtx, final ISteppingControlParticipant participant) { + if (DEBUG) System.out.println("[SteppingController] doneStepping participant=" + participant.getClass().getSimpleName()); //$NON-NLS-1$ List participants = fStepInProgress.get(execCtx); if (participants != null) { participants.remove(participant); @@ -285,7 +286,9 @@ public final class SteppingController implements IStepQueueManager * @return true if the step should be delayed */ private boolean shouldDelayStep(IExecutionDMContext execCtx) { - return getStepDelay(execCtx) > 0; + final int stepDelay= getStepDelay(execCtx); + if (DEBUG) System.out.println("[SteppingController] shouldDelayStep delay=" + stepDelay); //$NON-NLS-1$ + return stepDelay > 0; } /** @@ -345,6 +348,7 @@ public final class SteppingController implements IStepQueueManager * @param stepType Type of step to execute. */ public void enqueueStep(final IExecutionDMContext execCtx, final StepType stepType) { + System.out.println("[SteppingController] enqueueStep ctx=" + execCtx); //$NON-NLS-1$ if (!shouldDelayStep(execCtx) || doCanEnqueueStep(execCtx, stepType)) { doEnqueueStep(execCtx, stepType); processStepQueue(execCtx); @@ -415,6 +419,7 @@ public final class SteppingController implements IStepQueueManager return; } final StepRequest request = queue.get(0); + if (DEBUG) System.out.println("[SteppingController] processStepQueue request-in-progress="+request.inProgress); //$NON-NLS-1$ if (!request.inProgress) { if (isSteppingDisabled(request.fContext)) { return; @@ -502,10 +507,11 @@ public final class SteppingController implements IStepQueueManager long now = System.currentTimeMillis(); long lastStepTime = getLastStepTime(execCtx); if (now - lastStepTime > MAX_STEP_DELAY) { + if (DEBUG) System.out.println("[SteppingController] stepping control participant(s) timed out"); //$NON-NLS-1$ enableStepping(execCtx); disabled = false; } - } + } return disabled; } diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java index 69801526e43..986e8cf4c8f 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java @@ -185,7 +185,16 @@ public class ExpressionManagerVMNode extends AbstractVMNode final CountingRequestMonitor multiRm = new ViewerCountingRequestMonitor(getVMProvider().getExecutor(), update); int multiRmCount = 0; - for (int i = update.getOffset(); i < update.getOffset() + update.getLength() && i < expressions.length + 1; i++) { + int lowOffset= update.getOffset(); + if (lowOffset < 0) { + lowOffset = 0; + } + int length= update.getLength(); + if (length <= 0) { + length = expressions.length; + } + final int highOffset= lowOffset + length; + for (int i = lowOffset; i < highOffset && i < expressions.length + 1; i++) { if (i < expressions.length) { multiRmCount++; final int childIndex = i; diff --git a/plugins/org.eclipse.dd.dsf.ui/.options b/plugins/org.eclipse.dd.dsf.ui/.options index 1a35ae98fbc..ade15430e9c 100644 --- a/plugins/org.eclipse.dd.dsf.ui/.options +++ b/plugins/org.eclipse.dd.dsf.ui/.options @@ -3,3 +3,4 @@ org.eclipse.dd.dsf.ui/debug/vm/contentProvider = false org.eclipse.dd.dsf.ui/debug/vm/delta = false org.eclipse.dd.dsf.ui/debug/vm/cache = false org.eclipse.dd.dsf.ui/debug/vm/presentationId = +org.eclipse.dd.dsf.ui/debug/vm/atomicUpdate = false diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/AbstractCachingVMProvider.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/AbstractCachingVMProvider.java index 5d985f66379..2b673a6f115 100644 --- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/AbstractCachingVMProvider.java +++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/AbstractCachingVMProvider.java @@ -18,13 +18,16 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.Executor; +import java.util.concurrent.RejectedExecutionException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor; import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfExecutor; 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.IDMContext; import org.eclipse.dd.dsf.datamodel.IDMData; @@ -986,11 +989,16 @@ public class AbstractCachingVMProvider extends AbstractVMProvider implements ICa getModelDataFromService(node, update, service, dmc, rm, executor, entry ); } else { - dsfExecutor.execute(new DsfRunnable() { - public void run() { - getModelDataFromService(node, update, service, dmc, rm, executor, entry ); - } - }); + try { + dsfExecutor.execute(new DsfRunnable() { + public void run() { + getModelDataFromService(node, update, service, dmc, rm, executor, entry ); + } + }); + } catch (RejectedExecutionException e) { + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Service session's executor shut down.", null)); //$NON-NLS-1$ + rm.done(); + } } } } diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/MultiLevelUpdateHandler.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/MultiLevelUpdateHandler.java index 3b9aa2a5647..09241d936cc 100644 --- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/MultiLevelUpdateHandler.java +++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/MultiLevelUpdateHandler.java @@ -17,6 +17,7 @@ import java.util.concurrent.RejectedExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; import org.eclipse.dd.dsf.concurrent.CountingRequestMonitor; import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; import org.eclipse.dd.dsf.concurrent.DsfRunnable; @@ -39,6 +40,9 @@ import org.eclipse.swt.graphics.RGB; @SuppressWarnings("restriction") class MultiLevelUpdateHandler extends DataRequestMonitor> { + + private static final boolean DEBUG = Boolean.parseBoolean(Platform.getDebugOption("org.eclipse.dd.dsf.ui/debug/vm/atomicUpdate")); //$NON-NLS-1$ //; + private static final class UpdateLevel { private final List fChildren; private final TreePath fPath; @@ -135,8 +139,9 @@ class MultiLevelUpdateHandler extends DataRequestMonitor> { fRequestMonitor = new CountingRequestMonitor(fExecutor, parentRequestMonitor); } void startUpdate() { + if (DEBUG) System.out.println("[MultiLevelUpdateHandler] startUpdate " + fLowIndex + '-' + fHighIndex); //$NON-NLS-1$ fContentProvider.update(new IChildrenUpdate[] { - new VMChildrenUpdate(fCurrentPath, fViewerInput, fPresentationContext, fLowIndex, fHighIndex - fLowIndex + 1, this) + new VMChildrenUpdate(fCurrentPath, fViewerInput, fPresentationContext, -1, -1, this) }); } void setRange(int low, int high) { @@ -153,6 +158,7 @@ class MultiLevelUpdateHandler extends DataRequestMonitor> { public void run() { final List data= getData(); if (data != null && !data.isEmpty()) { + if (DEBUG) System.out.println("[MultiLevelUpdateHandler] gotChildUpdate " + data.size()); //$NON-NLS-1$ fStack.push(new UpdateLevel(fCurrentPath, data)); } processNext(); @@ -196,6 +202,7 @@ class MultiLevelUpdateHandler extends DataRequestMonitor> { IElementLabelProvider labelProvider = (IElementLabelProvider) ((IAdaptable)data).getAdapter(IElementLabelProvider.class); if (labelProvider != null) { ++fPendingUpdates; + if (DEBUG) System.out.println("[MultiLevelUpdateHandler] labelUpdate " + data); //$NON-NLS-1$ labelProvider.update(new ILabelUpdate[] { new DummyLabelUpdate(data, path, fRequestMonitor) }); @@ -207,13 +214,15 @@ class MultiLevelUpdateHandler extends DataRequestMonitor> { TreeViewer treeViewer = (TreeViewer) fViewer; if (treeViewer.getExpandedState(data)) { fCurrentPath = path; + if (DEBUG) System.out.println("[MultiLevelUpdateHandler] childrenUpdate " + data); //$NON-NLS-1$ fContentProvider.update(new IChildrenUpdate[] { new VMChildrenUpdate(path, fViewerInput, fPresentationContext, -1, -1, this) }); return; - } else { + } else if (fIndex >= fLowIndex) { // update also the hasChildren flag ++fPendingUpdates; + if (DEBUG) System.out.println("[MultiLevelUpdateHandler] hasChildUpdate " + data); //$NON-NLS-1$ fContentProvider.update(new IHasChildrenUpdate[] { new VMHasChildrenUpdate(path, fViewerInput, fPresentationContext, new DataRequestMonitor(fExecutor, fRequestMonitor)) });