Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Tarassov2012-05-31 23:11:00 +0000
committerEugene Tarassov2012-05-31 23:11:00 +0000
commit1dca5b25ae1b456cc4994e50cb08c96272aef6c1 (patch)
treecfea00c23547a2b561442ceaa75a58d8393ca050 /plugins
parent9835086989b8098e1b4177d8cbd5d1ae8ca44a97 (diff)
downloadorg.eclipse.tcf-1dca5b25ae1b456cc4994e50cb08c96272aef6c1.tar.gz
org.eclipse.tcf-1dca5b25ae1b456cc4994e50cb08c96272aef6c1.tar.xz
org.eclipse.tcf-1dca5b25ae1b456cc4994e50cb08c96272aef6c1.zip
Bug 381009 - Memory view doesn't display modified data
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFMemoryBlockRetrieval.java90
-rw-r--r--plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFModelProxy.java2
2 files changed, 85 insertions, 7 deletions
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFMemoryBlockRetrieval.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFMemoryBlockRetrieval.java
index b82c30028..5dec355f2 100644
--- a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFMemoryBlockRetrieval.java
+++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFMemoryBlockRetrieval.java
@@ -11,14 +11,12 @@
package org.eclipse.tcf.internal.debug.ui.model;
import java.math.BigInteger;
-import java.util.ArrayList;
import java.util.HashSet;
+import java.util.LinkedList;
import java.util.Set;
import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IMemoryBlock;
@@ -26,6 +24,15 @@ import org.eclipse.debug.core.model.IMemoryBlockExtension;
import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
import org.eclipse.debug.core.model.IMemoryBlockRetrievalExtension;
import org.eclipse.debug.core.model.MemoryByte;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
+import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.graphics.Device;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.tcf.internal.debug.model.ITCFConstants;
import org.eclipse.tcf.internal.debug.model.TCFLaunch;
import org.eclipse.tcf.internal.debug.ui.Activator;
@@ -46,6 +53,7 @@ class TCFMemoryBlockRetrieval implements IMemoryBlockRetrievalExtension {
private final TCFNodeExecContext exec_ctx;
private final HashSet<MemoryBlock> mem_blocks = new HashSet<MemoryBlock>();
+ private final LinkedList<ModelProxy> model_proxies = new LinkedList<ModelProxy>();
private static class MemData {
final BigInteger addr;
@@ -61,7 +69,7 @@ class TCFMemoryBlockRetrieval implements IMemoryBlockRetrievalExtension {
}
}
- private class MemoryBlock extends PlatformObject implements IMemoryBlockExtension {
+ private class MemoryBlock extends PlatformObject implements IMemoryBlockExtension, IModelProxyFactory {
private final String expression;
private final long length;
@@ -457,6 +465,11 @@ class TCFMemoryBlockRetrieval implements IMemoryBlockRetrievalExtension {
return ITCFConstants.ID_TCF_DEBUG_MODEL;
}
+ public IModelProxy createModelProxy(Object element, IPresentationContext context) {
+ assert element == this;
+ return new ModelProxy(this, context.getWindow().getShell().getDisplay());
+ }
+
@Override
@SuppressWarnings("rawtypes")
public Object getAdapter(Class adapter) {
@@ -466,6 +479,67 @@ class TCFMemoryBlockRetrieval implements IMemoryBlockRetrievalExtension {
}
}
+ private class ModelProxy extends AbstractModelProxy implements Runnable {
+
+ final MemoryBlock mem_block;
+ final Display display;
+
+ ModelDelta delta;
+
+ public ModelProxy(MemoryBlock mem_block, Display display) {
+ this.mem_block = mem_block;
+ this.display = display;
+ }
+
+ @Override
+ public void installed(Viewer viewer) {
+ synchronized (model_proxies) {
+ if (isDisposed()) return;
+ setInstalled(true);
+ super.installed(viewer);
+ model_proxies.add(this);
+ }
+ }
+
+ @Override
+ public void dispose() {
+ synchronized (model_proxies) {
+ if (isDisposed()) return;
+ model_proxies.remove(this);
+ super.dispose();
+ }
+ }
+
+ void onMemoryChanged(boolean suspended) {
+ assert Protocol.isDispatchThread();
+ int flags = IModelDelta.CONTENT;
+ if (suspended) flags |= IModelDelta.STATE;
+ if (delta != null) {
+ delta.setFlags(delta.getFlags() | flags);
+ }
+ else {
+ delta = new ModelDelta(mem_block, flags);
+ Protocol.invokeLater(this);
+ }
+ }
+
+ public void run() {
+ // Note: double posting is neccesery to avoid deadlocks
+ assert Protocol.isDispatchThread();
+ final ModelDelta d = delta;
+ delta = null;
+ synchronized (Device.class) {
+ if (!display.isDisposed()) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ fireModelChanged(d);
+ }
+ });
+ }
+ }
+ }
+ }
+
TCFMemoryBlockRetrieval(TCFNodeExecContext exec_ctx) {
this.exec_ctx = exec_ctx;
}
@@ -497,12 +571,14 @@ class TCFMemoryBlockRetrieval implements IMemoryBlockRetrievalExtension {
void onMemoryChanged(boolean suspended) {
assert Protocol.isDispatchThread();
if (mem_blocks.size() == 0) return;
- ArrayList<DebugEvent> list = new ArrayList<DebugEvent>();
for (MemoryBlock b : mem_blocks) {
if (suspended) b.mem_prev = b.mem_last;
b.mem_data = null;
- list.add(new DebugEvent(b, DebugEvent.CHANGE, DebugEvent.CONTENT));
}
- DebugPlugin.getDefault().fireDebugEventSet(list.toArray(new DebugEvent[list.size()]));
+ synchronized (model_proxies) {
+ for (ModelProxy p : model_proxies) {
+ p.onMemoryChanged(suspended);
+ }
+ }
}
}
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFModelProxy.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFModelProxy.java
index c00e19adc..28bd010ca 100644
--- a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFModelProxy.java
+++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFModelProxy.java
@@ -193,6 +193,7 @@ public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Ru
display = model.getDisplay();
}
+ @Override
public void installed(Viewer viewer) {
if (isDisposed()) return;
super.installed(viewer);
@@ -210,6 +211,7 @@ public class TCFModelProxy extends AbstractModelProxy implements IModelProxy, Ru
});
}
+ @Override
public void dispose() {
if (isDisposed()) return;
Protocol.invokeAndWait(new Runnable() {

Back to the top