From 1cdd030ea598fa00d681d5d9f56606a982882584 Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Thu, 22 May 2008 20:20:17 +0000 Subject: [PATCH] [164044] - [view model] Move ThreadsVMNode and ContainerVMNode to the org.eclipse.dd.dsf.debug.ui plugin. --- .../launch/AbstractContainerVMNode.java | 111 ++++++++ .../launch/AbstractThreadVMNode.java | 257 ++++++++++++++++++ .../ui/viewmodel/launch/ContainerVMNode.java | 101 +++---- .../ui/viewmodel/launch/ThreadVMNode.java | 244 ++--------------- 4 files changed, 416 insertions(+), 297 deletions(-) create mode 100644 plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/AbstractContainerVMNode.java create mode 100644 plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/AbstractThreadVMNode.java diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/AbstractContainerVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/AbstractContainerVMNode.java new file mode 100644 index 00000000000..302197fdb7f --- /dev/null +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/AbstractContainerVMNode.java @@ -0,0 +1,111 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. 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: + * Anton Leherbauer (Wind River Systems) - initial API and implementation + *******************************************************************************/ +package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.launch; + +import java.util.concurrent.RejectedExecutionException; + +import org.eclipse.dd.dsf.concurrent.DsfRunnable; +import org.eclipse.dd.dsf.concurrent.RequestMonitor; +import org.eclipse.dd.dsf.datamodel.DMContexts; +import org.eclipse.dd.dsf.datamodel.IDMEvent; +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.IExecutionDMContext; +import org.eclipse.dd.dsf.debug.service.IRunControl.IExitedDMEvent; +import org.eclipse.dd.dsf.debug.service.IRunControl.IStartedDMEvent; +import org.eclipse.dd.dsf.service.DsfSession; +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.AbstractDMVMProvider; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; + +/** + * Abstract implementation of a container view model node. + * Clients need to implement {@link #updateLabelInSessionThread(ILabelUpdate[])}. + */ +@SuppressWarnings("restriction") +public abstract class AbstractContainerVMNode extends AbstractDMVMNode implements IElementLabelProvider { + + public AbstractContainerVMNode(AbstractDMVMProvider provider, DsfSession session) { + super(provider, session, IRunControl.IExecutionDMContext.class); + } + + public void update(final ILabelUpdate[] updates) { + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + updateLabelInSessionThread(updates); + }}); + } catch (RejectedExecutionException e) { + for (ILabelUpdate update : updates) { + handleFailedUpdate(update); + } + } + } + + /** + * Perform the given label updates in the session executor thread. + * + * @param updates the pending label updates + * @see {@link #update(ILabelUpdate[]) + */ + protected abstract void updateLabelInSessionThread(ILabelUpdate[] updates); + + public int getDeltaFlags(Object e) { + if(e instanceof IRunControl.IContainerResumedDMEvent || + e instanceof IRunControl.IContainerSuspendedDMEvent) + { + return IModelDelta.CONTENT; + } else if (e instanceof IExitedDMEvent) { + return IModelDelta.CONTENT; + } else if (e instanceof IStartedDMEvent) { + if (((IStartedDMEvent) e).getDMContext() instanceof IContainerDMContext) { + return IModelDelta.EXPAND | IModelDelta.SELECT; + } else { + return IModelDelta.CONTENT; + } + } + return IModelDelta.NO_CHANGE; + } + + public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) { + if(e instanceof IRunControl.IContainerResumedDMEvent || + e instanceof IRunControl.IContainerSuspendedDMEvent) + { + parentDelta.addNode(createVMContext(((IDMEvent)e).getDMContext()), IModelDelta.CONTENT); + } else if (e instanceof IExitedDMEvent) { + IExecutionDMContext exeContext= ((IExitedDMEvent) e).getDMContext(); + if (exeContext instanceof IContainerDMContext) { + parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); + } else { + IContainerDMContext containerCtx = DMContexts.getAncestorOfType(exeContext, IContainerDMContext.class); + if (containerCtx != null) { + parentDelta.addNode(createVMContext(containerCtx), IModelDelta.CONTENT); + } + } + } else if (e instanceof IStartedDMEvent) { + IExecutionDMContext exeContext= ((IStartedDMEvent) e).getDMContext(); + if (exeContext instanceof IContainerDMContext) { + parentDelta.addNode(createVMContext(exeContext), IModelDelta.EXPAND | IModelDelta.SELECT); + } else { + IContainerDMContext containerCtx = DMContexts.getAncestorOfType(exeContext, IContainerDMContext.class); + if (containerCtx != null) { + parentDelta.addNode(createVMContext(containerCtx), IModelDelta.CONTENT); + } + } + } + + requestMonitor.done(); + } + +} diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/AbstractThreadVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/AbstractThreadVMNode.java new file mode 100644 index 00000000000..fc3fb1978aa --- /dev/null +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/AbstractThreadVMNode.java @@ -0,0 +1,257 @@ +/******************************************************************************* + * Copyright (c) 2006, 2008 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Wind River Systems - initial API and implementation + * Ericsson - Modified for multi threaded functionality + *******************************************************************************/ +package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.launch; + +import java.util.List; +import java.util.concurrent.RejectedExecutionException; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; +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.IDMEvent; +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.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.IResumedDMEvent; +import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent; +import org.eclipse.dd.dsf.debug.service.StepQueueManager.ISteppingTimedOutEvent; +import org.eclipse.dd.dsf.internal.ui.DsfUIPlugin; +import org.eclipse.dd.dsf.service.DsfSession; +import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor; +import org.eclipse.dd.dsf.ui.viewmodel.IVMContext; +import org.eclipse.dd.dsf.ui.viewmodel.ModelProxyInstalledEvent; +import org.eclipse.dd.dsf.ui.viewmodel.VMChildrenUpdate; +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.AbstractDMVMProvider; +import org.eclipse.dd.dsf.ui.viewmodel.datamodel.IDMVMContext; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; + + +/** + * Abstract implementation of a thread view model node. + * Clients need to implement {@link #updateLabelInSessionThread(ILabelUpdate[])}. + */ +@SuppressWarnings("restriction") +public abstract class AbstractThreadVMNode extends AbstractDMVMNode + implements IElementLabelProvider +{ + public AbstractThreadVMNode(AbstractDMVMProvider provider, DsfSession session) { + super(provider, session, IExecutionDMContext.class); + } + + @Override + protected void updateElementsInSessionThread(final IChildrenUpdate update) { + IRunControl runControl = getServicesTracker().getService(IRunControl.class); + final IContainerDMContext contDmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IContainerDMContext.class); + if (runControl == null || contDmc == null) { + handleFailedUpdate(update); + return; + } + + runControl.getExecutionContexts(contDmc, + new ViewerDataRequestMonitor(getSession().getExecutor(), update){ + @Override + public void handleCompleted() { + if (!isSuccess()) { + handleFailedUpdate(update); + return; + } + fillUpdateWithVMCs(update, getData()); + update.done(); + } + }); + } + + + public void update(final ILabelUpdate[] updates) { + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + updateLabelInSessionThread(updates); + }}); + } catch (RejectedExecutionException e) { + for (ILabelUpdate update : updates) { + handleFailedUpdate(update); + } + } + } + + @Override + public void getContextsForEvent(VMDelta parentDelta, Object e, final DataRequestMonitor rm) { + if(e instanceof IContainerResumedDMEvent) { + IExecutionDMContext[] triggerContexts = ((IContainerResumedDMEvent)e).getTriggeringContexts(); + if (triggerContexts.length != 0) { + rm.setData(new IVMContext[] { createVMContext(triggerContexts[0]) }); + rm.done(); + return; + } + } else if(e instanceof IContainerSuspendedDMEvent) { + IExecutionDMContext[] triggerContexts = ((IContainerSuspendedDMEvent)e).getTriggeringContexts(); + if (triggerContexts.length != 0) { + rm.setData(new IVMContext[] { createVMContext(triggerContexts[0]) }); + rm.done(); + return; + } + } else if (e instanceof ISteppingTimedOutEvent && + ((ISteppingTimedOutEvent)e).getDMContext() instanceof IContainerDMContext) + { + // The timed out event occured on a container and not on a thread. Do not + // return a context for this event, which will force the view model to generate + // a delta for all the threads. + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "", null)); //$NON-NLS-1$ + rm.done(); + } else if (e instanceof ModelProxyInstalledEvent) { + getThreadVMCForModelProxyInstallEvent( + parentDelta, + new DataRequestMonitor(getExecutor(), rm) { + @Override + protected void handleCompleted() { + if (isSuccess()) { + rm.setData(new IVMContext[] { getData().fVMContext }); + } else { + rm.setData(new IVMContext[0]); + } + rm.done(); + } + }); + return; + } + super.getContextsForEvent(parentDelta, e, rm); + } + + private static class VMContextInfo { + final IVMContext fVMContext; + final int fIndex; + final boolean fIsSuspended; + VMContextInfo(IVMContext vmContext, int index, boolean isSuspended) { + fVMContext = vmContext; + fIndex = index; + fIsSuspended = isSuspended; + } + } + + private void getThreadVMCForModelProxyInstallEvent(VMDelta parentDelta, final DataRequestMonitor rm) { + getVMProvider().updateNode(this, new VMChildrenUpdate( + parentDelta, getVMProvider().getPresentationContext(), -1, -1, + new DataRequestMonitor>(getExecutor(), rm) { + @Override + protected void handleSuccess() { + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + final IRunControl runControl = getServicesTracker().getService(IRunControl.class); + if (runControl != null) { + int vmcIdx = -1; + int suspendedVmcIdx = -1; + + for (int i = 0; i < getData().size(); i++) { + if (getData().get(i) instanceof IDMVMContext) { + IDMVMContext vmc = (IDMVMContext)getData().get(i); + IExecutionDMContext execDmc = DMContexts.getAncestorOfType( + vmc.getDMContext(), IExecutionDMContext.class); + if (execDmc != null) { + vmcIdx = vmcIdx < 0 ? i : vmcIdx; + if (runControl.isSuspended(execDmc)) { + suspendedVmcIdx = suspendedVmcIdx < 0 ? i : suspendedVmcIdx; + } + } + } + } + if (suspendedVmcIdx >= 0) { + rm.setData(new VMContextInfo( + (IVMContext)getData().get(suspendedVmcIdx), suspendedVmcIdx, true)); + } else if (vmcIdx >= 0) { + rm.setData(new VMContextInfo((IVMContext)getData().get(vmcIdx), vmcIdx, false)); + } else { + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.REQUEST_FAILED, "No threads available", null)); //$NON-NLS-1$ + } + rm.done(); + } else { + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.REQUEST_FAILED, "No threads available", null)); //$NON-NLS-1$ + rm.done(); + } + } + }); + } catch (RejectedExecutionException e) { + rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "", null)); //$NON-NLS-1$ + rm.done(); + } + } + })); + } + + /** + * Perform the given label updates in the session executor thread. + * + * @param updates the pending label updates + * @see {@link #update(ILabelUpdate[]) + */ + protected abstract void updateLabelInSessionThread(ILabelUpdate[] updates); + + + public int getDeltaFlags(Object e) { + if(e instanceof IResumedDMEvent || e instanceof ISuspendedDMEvent) { + return IModelDelta.CONTENT; + } + if (e instanceof ModelProxyInstalledEvent) { + return IModelDelta.SELECT | IModelDelta.EXPAND; + } + return IModelDelta.NO_CHANGE; + } + + public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor rm) { + if(e instanceof IContainerResumedDMEvent) { + IExecutionDMContext[] triggeringContexts = ((IContainerResumedDMEvent)e).getTriggeringContexts(); + if (triggeringContexts.length != 0) { + parentDelta.addNode(createVMContext(triggeringContexts[0]), IModelDelta.CONTENT); + } + rm.done(); + } else if (e instanceof IContainerSuspendedDMEvent) { + 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) { + parentDelta.addNode(createVMContext(((IDMEvent)e).getDMContext()), IModelDelta.CONTENT); + rm.done(); + } else if (e instanceof ModelProxyInstalledEvent) { + getThreadVMCForModelProxyInstallEvent( + parentDelta, + new DataRequestMonitor(getExecutor(), rm) { + @Override + protected void handleCompleted() { + if (isSuccess()) { + parentDelta.addNode( + getData().fVMContext, nodeOffset + getData().fIndex, + IModelDelta.EXPAND | (getData().fIsSuspended ? 0 : IModelDelta.SELECT)); + } + rm.done(); + } + }); + } else { + + rm.done(); + } + } + +} diff --git a/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ContainerVMNode.java b/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ContainerVMNode.java index 77ce65792a5..ab7947a8cd2 100644 --- a/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ContainerVMNode.java +++ b/plugins/org.eclipse.dd.gdb.ui/src/org/eclipse/dd/gdb/internal/ui/viewmodel/launch/ContainerVMNode.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Ericsson and others. + * Copyright (c) 2006, 2008 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 @@ -7,6 +7,7 @@ * * Contributors: * Ericsson - Initial API and implementation + * Wind River Systems - Factored out AbstractContainerVMNode *******************************************************************************/ package org.eclipse.dd.gdb.internal.ui.viewmodel.launch; @@ -16,30 +17,21 @@ import java.util.concurrent.RejectedExecutionException; import org.eclipse.dd.dsf.concurrent.DsfRunnable; 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; -import org.eclipse.dd.dsf.debug.service.IRunControl.IExitedDMEvent; -import org.eclipse.dd.dsf.debug.service.IRunControl.IStartedDMEvent; +import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.launch.AbstractContainerVMNode; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor; 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.AbstractDMVMProvider; import org.eclipse.dd.dsf.ui.viewmodel.datamodel.IDMVMContext; import org.eclipse.dd.gdb.internal.provisional.service.GDBRunControl; import org.eclipse.dd.gdb.internal.provisional.service.GDBRunControl.GDBProcessData; import org.eclipse.dd.gdb.internal.provisional.service.command.GDBControl; import org.eclipse.dd.gdb.internal.provisional.service.command.GDBControlDMContext; -import org.eclipse.dd.gdb.internal.provisional.service.command.GDBControl.GDBStartedEvent; import org.eclipse.dd.mi.service.command.MIInferiorProcess; -import org.eclipse.dd.mi.service.command.MIInferiorProcess.InferiorExitedDMEvent; -import org.eclipse.dd.mi.service.command.MIInferiorProcess.InferiorStartedDMEvent; 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.IElementLabelProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest; import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate; @@ -50,13 +42,13 @@ import org.eclipse.ui.IMemento; @SuppressWarnings("restriction") -public class ContainerVMNode extends AbstractDMVMNode - implements IElementLabelProvider, IElementMementoProvider +public class ContainerVMNode extends AbstractContainerVMNode + implements IElementMementoProvider { public ContainerVMNode(AbstractDMVMProvider provider, DsfSession session) { - super(provider, session, IRunControl.IExecutionDMContext.class); + super(provider, session); } @Override @@ -75,19 +67,7 @@ public class ContainerVMNode extends AbstractDMVMNode } - public void update(final ILabelUpdate[] updates) { - try { - getSession().getExecutor().execute(new DsfRunnable() { - public void run() { - updateLabelInSessionThread(updates); - }}); - } catch (RejectedExecutionException e) { - for (ILabelUpdate update : updates) { - handleFailedUpdate(update); - } - } - } - + @Override protected void updateLabelInSessionThread(ILabelUpdate[] updates) { for (final ILabelUpdate update : updates) { final GDBRunControl runControl = getServicesTracker().getService(GDBRunControl.class); @@ -107,8 +87,8 @@ public class ContainerVMNode extends AbstractDMVMNode update.setImageDescriptor(DebugUITools.getImageDescriptor(imageKey), 0); runControl.getProcessData( - dmc, - new ViewerDataRequestMonitor(getExecutor(), update) { + dmc, + new ViewerDataRequestMonitor(getExecutor(), update) { @Override public void handleCompleted() { if (!isSuccess()) { @@ -122,46 +102,29 @@ public class ContainerVMNode extends AbstractDMVMNode } } - public int getDeltaFlags(Object e) { - if(e instanceof IRunControl.IContainerResumedDMEvent || - e instanceof IRunControl.IContainerSuspendedDMEvent) - { - return IModelDelta.CONTENT; - } else if (e instanceof GDBControl.GDBExitedEvent || e instanceof InferiorExitedDMEvent) { - return IModelDelta.CONTENT; - } else if (e instanceof GDBStartedEvent) { - return IModelDelta.EXPAND; - } else if (e instanceof InferiorStartedDMEvent) { - return IModelDelta.EXPAND | IModelDelta.SELECT; - } if(e instanceof IStartedDMEvent || e instanceof IExitedDMEvent) { - return IModelDelta.CONTENT; - } - return IModelDelta.NO_CHANGE; - } + @Override + public int getDeltaFlags(Object e) { + if (e instanceof GDBControl.GDBExitedEvent) { + return IModelDelta.CONTENT; + } else if (e instanceof GDBControl.GDBStartedEvent) { + return IModelDelta.EXPAND; + } + return super.getDeltaFlags(e); + } - public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) { - if(e instanceof IRunControl.IContainerResumedDMEvent || - e instanceof IRunControl.IContainerSuspendedDMEvent) - { - parentDelta.addNode(createVMContext(((IDMEvent)e).getDMContext()), IModelDelta.CONTENT); - } else if (e instanceof GDBControl.GDBExitedEvent || e instanceof InferiorExitedDMEvent) { - // Note: we must process the inferior started/exited events before the thread's - // started/exited events otherwise the inferior's handlers would never be called. - parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); - } else if (e instanceof GDBStartedEvent) { - parentDelta.addNode(createVMContext(((IDMEvent)e).getDMContext()), IModelDelta.EXPAND); - } else if (e instanceof InferiorStartedDMEvent) { - parentDelta.addNode(createVMContext(((IDMEvent)e).getDMContext()), IModelDelta.EXPAND | IModelDelta.SELECT); - } else if (e instanceof IStartedDMEvent || e instanceof IExitedDMEvent) { - IContainerDMContext containerCtx = DMContexts.getAncestorOfType(((IDMEvent)e).getDMContext(), IContainerDMContext.class); - if (containerCtx != null) { - parentDelta.addNode(createVMContext(containerCtx), IModelDelta.CONTENT); - } - } + @Override + public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) { + if (e instanceof GDBControl.GDBExitedEvent) { + parentDelta.setFlags(parentDelta.getFlags() | IModelDelta.CONTENT); + } else if (e instanceof GDBControl.GDBStartedEvent) { + parentDelta.addNode(createVMContext(((IDMEvent)e).getDMContext()), IModelDelta.EXPAND); + } else { + super.buildDelta(e, parentDelta, nodeOffset, requestMonitor); + return; + } + requestMonitor.done(); + } - requestMonitor.done(); - } - /* * (non-Javadoc) * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) @@ -190,7 +153,7 @@ public class ContainerVMNode extends AbstractDMVMNode final GDBRunControl runControl = getServicesTracker().getService(GDBRunControl.class); if ( runControl != null ) { runControl.getProcessData( - procDmc, + procDmc, new ViewerDataRequestMonitor(runControl.getExecutor(), request) { @Override protected void handleCompleted() { @@ -242,7 +205,7 @@ public class ContainerVMNode extends AbstractDMVMNode final GDBRunControl runControl = getServicesTracker().getService(GDBRunControl.class); if ( runControl != null ) { runControl.getProcessData( - procDmc, + procDmc, new ViewerDataRequestMonitor(runControl.getExecutor(), request) { @Override protected void handleCompleted() { 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 d0332e01ac7..8768c491693 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Wind River Systems and others. + * Copyright (c) 2006, 2008 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 @@ -11,202 +11,38 @@ *******************************************************************************/ package org.eclipse.dd.gdb.internal.ui.viewmodel.launch; -import java.util.List; -import java.util.concurrent.RejectedExecutionException; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.dd.dsf.concurrent.DataRequestMonitor; -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.internal.provisional.ui.viewmodel.launch.AbstractThreadVMNode; 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.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.IExecutionDMData; -import org.eclipse.dd.dsf.debug.service.IRunControl.IResumedDMEvent; -import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent; import org.eclipse.dd.dsf.debug.service.IRunControl.StateChangeReason; -import org.eclipse.dd.dsf.debug.service.StepQueueManager.ISteppingTimedOutEvent; -import org.eclipse.dd.dsf.internal.ui.DsfUIPlugin; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.dsf.ui.concurrent.ViewerDataRequestMonitor; -import org.eclipse.dd.dsf.ui.viewmodel.IVMContext; -import org.eclipse.dd.dsf.ui.viewmodel.ModelProxyInstalledEvent; -import org.eclipse.dd.dsf.ui.viewmodel.VMChildrenUpdate; -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.AbstractDMVMProvider; import org.eclipse.dd.dsf.ui.viewmodel.datamodel.IDMVMContext; import org.eclipse.dd.gdb.internal.provisional.service.GDBRunControl; import org.eclipse.dd.gdb.internal.provisional.service.GDBRunControl.GDBThreadData; import org.eclipse.dd.mi.service.IMIExecutionDMContext; -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.IElementLabelProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest; import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.ui.IMemento; @SuppressWarnings("restriction") -public class ThreadVMNode extends AbstractDMVMNode +public class ThreadVMNode extends AbstractThreadVMNode implements IElementLabelProvider, IElementMementoProvider { public ThreadVMNode(AbstractDMVMProvider provider, DsfSession session) { - super(provider, session, IExecutionDMContext.class); + super(provider, session); } + @Override - protected void updateElementsInSessionThread(final IChildrenUpdate update) { - IRunControl runControl = getServicesTracker().getService(IRunControl.class); - final IContainerDMContext contDmc = findDmcInPath(update.getViewerInput(), update.getElementPath(), IContainerDMContext.class); - if (runControl == null || contDmc == null) { - handleFailedUpdate(update); - return; - } - - runControl.getExecutionContexts(contDmc, - new ViewerDataRequestMonitor(getSession().getExecutor(), update){ - @Override - public void handleCompleted() { - if (!isSuccess()) { - handleFailedUpdate(update); - return; - } - fillUpdateWithVMCs(update, getData()); - update.done(); - } - }); - } - - - public void update(final ILabelUpdate[] updates) { - try { - getSession().getExecutor().execute(new DsfRunnable() { - public void run() { - updateLabelInSessionThread(updates); - }}); - } catch (RejectedExecutionException e) { - for (ILabelUpdate update : updates) { - handleFailedUpdate(update); - } - } - } - - @Override - public void getContextsForEvent(VMDelta parentDelta, Object e, final DataRequestMonitor rm) { - if(e instanceof IContainerResumedDMEvent) { - IExecutionDMContext[] triggerContexts = ((IContainerResumedDMEvent)e).getTriggeringContexts(); - if (triggerContexts.length != 0) { - rm.setData(new IVMContext[] { createVMContext(triggerContexts[0]) }); - rm.done(); - return; - } - } else if(e instanceof IContainerSuspendedDMEvent) { - IExecutionDMContext[] triggerContexts = ((IContainerSuspendedDMEvent)e).getTriggeringContexts(); - if (triggerContexts.length != 0) { - rm.setData(new IVMContext[] { createVMContext(triggerContexts[0]) }); - rm.done(); - return; - } - } else if (e instanceof ISteppingTimedOutEvent && - ((ISteppingTimedOutEvent)e).getDMContext() instanceof IContainerDMContext) - { - // The timed out event occured on a container and not on a thread. Do not - // return a context for this event, which will force the view model to generate - // a delta for all the threads. - rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "", null)); //$NON-NLS-1$ - rm.done(); - } else if (e instanceof ModelProxyInstalledEvent) { - getThreadVMCForModelProxyInstallEvent( - parentDelta, - new DataRequestMonitor(getExecutor(), rm) { - @Override - protected void handleCompleted() { - if (isSuccess()) { - rm.setData(new IVMContext[] { getData().fVMContext }); - } else { - rm.setData(new IVMContext[0]); - } - rm.done(); - } - }); - return; - } - super.getContextsForEvent(parentDelta, e, rm); - } - - private static class VMContextInfo { - final IVMContext fVMContext; - final int fIndex; - final boolean fIsSuspended; - VMContextInfo(IVMContext vmContext, int index, boolean isSuspended) { - fVMContext = vmContext; - fIndex = index; - fIsSuspended = isSuspended; - } - } - - private void getThreadVMCForModelProxyInstallEvent(VMDelta parentDelta, final DataRequestMonitor rm) { - getVMProvider().updateNode(this, new VMChildrenUpdate( - parentDelta, getVMProvider().getPresentationContext(), -1, -1, - new DataRequestMonitor>(getExecutor(), rm) { - @Override - protected void handleSuccess() { - try { - getSession().getExecutor().execute(new DsfRunnable() { - public void run() { - final GDBRunControl runControl = getServicesTracker().getService(GDBRunControl.class); - if (runControl != null) { - int vmcIdx = -1; - int suspendedVmcIdx = -1; - - for (int i = 0; i < getData().size(); i++) { - if (getData().get(i) instanceof IDMVMContext) { - IDMVMContext vmc = (IDMVMContext)getData().get(i); - IExecutionDMContext execDmc = DMContexts.getAncestorOfType( - vmc.getDMContext(), IExecutionDMContext.class); - if (execDmc != null) { - vmcIdx = vmcIdx < 0 ? i : vmcIdx; - if (runControl.isSuspended(execDmc)) { - suspendedVmcIdx = suspendedVmcIdx < 0 ? i : suspendedVmcIdx; - } - } - } - } - if (suspendedVmcIdx >= 0) { - rm.setData(new VMContextInfo( - (IVMContext)getData().get(suspendedVmcIdx), suspendedVmcIdx, true)); - } else if (vmcIdx >= 0) { - rm.setData(new VMContextInfo((IVMContext)getData().get(vmcIdx), vmcIdx, false)); - } else { - rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.REQUEST_FAILED, "No threads available", null)); //$NON-NLS-1$ - } - rm.done(); - } else { - rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.REQUEST_FAILED, "No threads available", null)); //$NON-NLS-1$ - rm.done(); - } - } - }); - } catch (RejectedExecutionException e) { - rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "", null)); //$NON-NLS-1$ - rm.done(); - } - } - })); - } - protected void updateLabelInSessionThread(ILabelUpdate[] updates) { for (final ILabelUpdate update : updates) { final GDBRunControl runControl = getServicesTracker().getService(GDBRunControl.class); @@ -226,8 +62,8 @@ public class ThreadVMNode extends AbstractDMVMNode update.setImageDescriptor(DebugUITools.getImageDescriptor(imageKey), 0); // Find the Reason for the State - runControl.getExecutionData(dmc, - new ViewerDataRequestMonitor(getSession().getExecutor(), update) { + runControl.getExecutionData(dmc, + new ViewerDataRequestMonitor(getSession().getExecutor(), update) { @Override public void handleCompleted(){ if (!isSuccess()) { @@ -235,7 +71,7 @@ public class ThreadVMNode extends AbstractDMVMNode return; } - // We're in a new dispatch cycle, and we have to check whether the + // We're in a new dispatch cycle, and we have to check whether the // service reference is still valid. final GDBRunControl runControl = getServicesTracker().getService(GDBRunControl.class); if ( runControl == null ) { @@ -247,8 +83,8 @@ public class ThreadVMNode extends AbstractDMVMNode // Retrieve the rest of the thread information runControl.getThreadData( - dmc, - new ViewerDataRequestMonitor(getSession().getExecutor(), update) { + dmc, + new ViewerDataRequestMonitor(getSession().getExecutor(), update) { @Override public void handleCompleted() { if (!isSuccess()) { @@ -282,63 +118,15 @@ public class ThreadVMNode extends AbstractDMVMNode } } - public int getDeltaFlags(Object e) { - if(e instanceof IResumedDMEvent || e instanceof ISuspendedDMEvent) { - return IModelDelta.CONTENT; - } - if (e instanceof ModelProxyInstalledEvent) { - return IModelDelta.SELECT | IModelDelta.EXPAND; - } - return IModelDelta.NO_CHANGE; + private String produceThreadElementName(String viewName, IMIExecutionDMContext execCtx) { + return "Thread." + execCtx.getThreadId(); //$NON-NLS-1$ } - public void buildDelta(Object e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor rm) { - if(e instanceof IContainerResumedDMEvent) { - IExecutionDMContext[] triggeringContexts = ((IContainerResumedDMEvent)e).getTriggeringContexts(); - if (triggeringContexts.length != 0) { - parentDelta.addNode(createVMContext(triggeringContexts[0]), IModelDelta.CONTENT); - } - rm.done(); - } else if (e instanceof IContainerSuspendedDMEvent) { - 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) { - parentDelta.addNode(createVMContext(((IDMEvent)e).getDMContext()), IModelDelta.CONTENT); - rm.done(); - } else if (e instanceof ModelProxyInstalledEvent) { - getThreadVMCForModelProxyInstallEvent( - parentDelta, - new DataRequestMonitor(getExecutor(), rm) { - @Override - protected void handleCompleted() { - if (isSuccess()) { - parentDelta.addNode( - getData().fVMContext, nodeOffset + getData().fIndex, - IModelDelta.EXPAND | (getData().fIsSuspended ? 0 : IModelDelta.SELECT)); - } - rm.done(); - } - }); - } else { - - rm.done(); - } - } + private static final String MEMENTO_NAME = "THREAD_MEMENTO_NAME"; //$NON-NLS-1$ /* - * (non-Javadoc) * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#compareElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementCompareRequest[]) */ - - private String produceThreadElementName( String viewName , IMIExecutionDMContext execCtx ) { - return "Thread." + execCtx.getThreadId(); //$NON-NLS-1$ - } - - private final String MEMENTO_NAME = "THREAD_MEMENTO_NAME"; //$NON-NLS-1$ - public void compareElements(IElementCompareRequest[] requests) { for ( IElementCompareRequest request : requests ) { @@ -356,7 +144,7 @@ public class ThreadVMNode extends AbstractDMVMNode String elementName = produceThreadElementName( request.getPresentationContext().getId(), (IMIExecutionDMContext) dmc ); request.setEqual( elementName.equals( mementoName ) ); - } + } } } request.done(); @@ -364,7 +152,6 @@ public class ThreadVMNode extends AbstractDMVMNode } /* - * (non-Javadoc) * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider#encodeElements(org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoRequest[]) */ public void encodeElements(IElementMementoRequest[] requests) { @@ -382,9 +169,10 @@ public class ThreadVMNode extends AbstractDMVMNode String elementName = produceThreadElementName( request.getPresentationContext().getId(), (IMIExecutionDMContext) dmc ); memento.putString(MEMENTO_NAME, elementName); - } + } } request.done(); } } + }