diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/build.properties b/plugins/org.eclipse.dd.dsf.debug.ui/build.properties
index 4a2586141ff..65c7e05604b 100644
--- a/plugins/org.eclipse.dd.dsf.debug.ui/build.properties
+++ b/plugins/org.eclipse.dd.dsf.debug.ui/build.properties
@@ -3,4 +3,5 @@ output.. = bin/
bin.includes = META-INF/,\
plugin.xml,\
about.html,\
- .
+ .,\
+ icons/
diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/icons/refresh.gif b/plugins/org.eclipse.dd.dsf.debug.ui/icons/refresh.gif
new file mode 100644
index 00000000000..b6b8dc6836d
Binary files /dev/null and b/plugins/org.eclipse.dd.dsf.debug.ui/icons/refresh.gif differ
diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/plugin.xml b/plugins/org.eclipse.dd.dsf.debug.ui/plugin.xml
index ec8c6e8158e..3c72cc6419c 100644
--- a/plugins/org.eclipse.dd.dsf.debug.ui/plugin.xml
+++ b/plugins/org.eclipse.dd.dsf.debug.ui/plugin.xml
@@ -50,6 +50,157 @@
verticalRulerPreferenceValue="true">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/expression/ExpressionVMProvider.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/expression/ExpressionVMProvider.java
index 0356fc87ca3..6f569e19447 100644
--- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/expression/ExpressionVMProvider.java
+++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/expression/ExpressionVMProvider.java
@@ -24,7 +24,7 @@ import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
import org.eclipse.dd.dsf.ui.viewmodel.IVMContext;
import org.eclipse.dd.dsf.ui.viewmodel.IVMLayoutNode;
import org.eclipse.dd.dsf.ui.viewmodel.IVMRootLayoutNode;
-import org.eclipse.dd.dsf.ui.viewmodel.dm.AbstractDMVMProvider;
+import org.eclipse.dd.dsf.ui.viewmodel.dm.AbstractDMVMProviderWithCache;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IExpressionsListener;
import org.eclipse.debug.core.model.IExpression;
@@ -35,7 +35,7 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationCont
*
*/
@SuppressWarnings("restriction")
-public class ExpressionVMProvider extends AbstractDMVMProvider
+public class ExpressionVMProvider extends AbstractDMVMProviderWithCache
implements IExpressionsListener, IFormattedValuePreferenceStore
{
private String fDefaultFormatId = IFormattedValues.HEX_FORMAT;
diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterBitFieldLayoutNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterBitFieldLayoutNode.java
index aef1233c561..a028a2589c3 100644
--- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterBitFieldLayoutNode.java
+++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/ui/viewmodel/register/RegisterBitFieldLayoutNode.java
@@ -43,6 +43,7 @@ import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMProvider;
import org.eclipse.dd.dsf.ui.viewmodel.IVMContext;
import org.eclipse.dd.dsf.ui.viewmodel.VMDelta;
import org.eclipse.dd.dsf.ui.viewmodel.dm.AbstractDMVMLayoutNode;
+import org.eclipse.dd.dsf.ui.viewmodel.update.VMCacheManager;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IDebugTarget;
@@ -236,8 +237,9 @@ public class RegisterBitFieldLayoutNode extends AbstractExpressionLayoutNode(getSession().getExecutor(), null) {
@Override
public void handleCompleted() {
@@ -259,7 +261,8 @@ public class RegisterBitFieldLayoutNode extends AbstractExpressionLayoutNode(getSession().getExecutor(), null) {
@Override
@@ -341,7 +345,8 @@ public class RegisterBitFieldLayoutNode extends AbstractExpressionLayoutNode
@@ -231,25 +234,37 @@ public class RegisterLayoutNode extends AbstractExpressionLayoutNode(getSession().getExecutor(), null) {
- @Override
- public void handleCompleted() {
- if (!getStatus().isOK()) {
- handleFailedUpdate(update);
- return;
- }
-
- /*
- * Fill the label/column with the properly formatted data value.
- */
- update.setLabel(getData().getFormattedValue(), labelIndex);
- update.done();
- }
- }
+ VMCacheManager.getVMCacheManager().getCache(RegisterLayoutNode.this.getVMProvider().getPresentationContext())
+ .getModelData(regService,
+ valueDmc,
+ new DataRequestMonitor(getSession().getExecutor(), null) {
+ @Override
+ public void handleCompleted() {
+ if (!getStatus().isOK()) {
+ handleFailedUpdate(update);
+ return;
+ }
+
+ /*
+ * Fill the label/column with the properly formatted data value.
+ */
+ update.setLabel(getData().getFormattedValue(), labelIndex);
+
+ // color based on change history
+ FormattedValueDMData oldData = (FormattedValueDMData) VMCacheManager.getVMCacheManager()
+ .getCache(RegisterLayoutNode.this.getVMProvider().getPresentationContext())
+ .getArchivedModelData(valueDmc);
+ if(oldData != null && oldData.getFormattedValue().equals(getData().getFormattedValue()))
+ update.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK).getRGB(), labelIndex);
+ else
+ update.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_RED).getRGB(), labelIndex);
+
+ update.done();
+ }
+ },
+ getSession().getExecutor()
);
}
}
@@ -270,9 +285,10 @@ public class RegisterLayoutNode extends AbstractExpressionLayoutNode(getSession().getExecutor(), null) {
+ VMCacheManager.getVMCacheManager().getCache(update.getPresentationContext())
+ .getModelData((IDMService)getServicesTracker().getService(null, dmc.getServiceFilter()),
+ dmc,
+ new DataRequestMonitor(getSession().getExecutor(), null) {
@Override
protected void handleCompleted() {
/*
@@ -332,7 +348,8 @@ public class RegisterLayoutNode extends AbstractExpressionLayoutNode(getSession().getExecutor(), null) {
@Override
protected void handleCompleted() {
@@ -221,7 +223,8 @@ public class VariableLocalsLayoutNode extends AbstractExpressionLayoutNode(getSession().getExecutor(), null) {
@Override
@@ -309,7 +313,8 @@ public class VariableLocalsLayoutNode extends AbstractExpressionLayoutNode(getSession().getExecutor(), null) {
@Override
@@ -123,7 +125,8 @@ public class VariableSubExpressionsLayoutNode extends AbstractDMVMLayoutNode(getSession().getExecutor(), null) {
@Override
public void handleCompleted() {
@@ -211,7 +215,8 @@ public class VariableSubExpressionsLayoutNode extends AbstractDMVMLayoutNode extends Abstract
final IDMContext dmc = findDmcInPath(update.getElementPath(), fDMCClassType);
if (!checkDmc(dmc, update) || !checkService(null, dmc.getServiceFilter(), update)) return;
- ((IDMService)getServicesTracker().getService(null, dmc.getServiceFilter())).getModelData(
- dmc,
+ VMCacheManager.getVMCacheManager().getCache(update.getPresentationContext())
+ .getModelData((IDMService)getServicesTracker().getService(null, dmc.getServiceFilter()),
+ dmc,
new DataRequestMonitor(getSession().getExecutor(), null) {
@Override
protected void handleCompleted() {
@@ -350,7 +352,8 @@ abstract public class AbstractDMVMLayoutNode extends Abstract
}
update.done();
}
- });
+ },
+ getExecutor());
}
}
diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/dm/AbstractDMVMProviderWithCache.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/dm/AbstractDMVMProviderWithCache.java
new file mode 100644
index 00000000000..058ac9b90bb
--- /dev/null
+++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/dm/AbstractDMVMProviderWithCache.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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:
+ * Ted R Williams (Wind River Systems, Inc.) - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.dd.dsf.ui.viewmodel.dm;
+
+import org.eclipse.dd.dsf.datamodel.IDMEvent;
+import org.eclipse.dd.dsf.service.DsfSession;
+import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter;
+import org.eclipse.dd.dsf.ui.viewmodel.update.VMCacheManager;
+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.IHasChildrenUpdate;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
+import org.eclipse.dd.dsf.service.DsfServiceEventHandler;
+
+public abstract class AbstractDMVMProviderWithCache extends AbstractDMVMProvider
+ implements VMCacheManager.CacheListener
+{
+ @DsfServiceEventHandler
+ public void eventDispatched(IDMEvent> event) {
+ VMCacheManager.getVMCacheManager().getCache(getPresentationContext()).handleEvent(event);
+ super.eventDispatched(event);
+ }
+
+ public void cacheFlushed(Object context) {
+ if(getPresentationContext().equals(context))
+ getModelProxy().fireModelChanged(new ModelDelta(this.getRootLayoutNode().getRootObject(),IModelDelta.CONTENT));
+ }
+
+ public AbstractDMVMProviderWithCache(AbstractVMAdapter adapter, IPresentationContext presentationContext, DsfSession session) {
+ super(adapter, presentationContext, session);
+
+ VMCacheManager.getVMCacheManager().addCacheListener(getPresentationContext(), this);
+ }
+
+ public void update(IHasChildrenUpdate[] updates) {
+ super.update(VMCacheManager.getVMCacheManager().getCache(getPresentationContext()).update(updates));
+ }
+
+ public void update(IChildrenCountUpdate[] updates) {
+ super.update(VMCacheManager.getVMCacheManager().getCache(getPresentationContext()).update(updates));
+ }
+
+ public void update(final IChildrenUpdate[] updates) {
+ super.update(VMCacheManager.getVMCacheManager().getCache(getPresentationContext()).update(updates));
+ }
+
+ public void dispose()
+ {
+ VMCacheManager.getVMCacheManager().removeCacheListener(getPresentationContext(), this);
+ super.dispose();
+ }
+}
diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/VMCache.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/VMCache.java
new file mode 100644
index 00000000000..57fa567b57e
--- /dev/null
+++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/update/VMCache.java
@@ -0,0 +1,315 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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:
+ * Ted R Williams (Wind River Systems, Inc.) - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.dd.dsf.ui.viewmodel.update;
+
+import java.util.HashMap;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.dd.dsf.concurrent.DsfExecutor;
+import org.eclipse.dd.dsf.datamodel.IDMContext;
+import org.eclipse.dd.dsf.datamodel.IDMData;
+import org.eclipse.dd.dsf.datamodel.IDMEvent;
+import org.eclipse.dd.dsf.datamodel.IDMService;
+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.IHasChildrenUpdate;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
+import org.eclipse.jface.viewers.TreePath;
+
+public abstract class VMCache
+{
+ protected HashMap