diff options
author | Eugene Tarassov | 2012-05-31 23:11:00 +0000 |
---|---|---|
committer | Eugene Tarassov | 2012-05-31 23:11:00 +0000 |
commit | 1dca5b25ae1b456cc4994e50cb08c96272aef6c1 (patch) | |
tree | cfea00c23547a2b561442ceaa75a58d8393ca050 | |
parent | 9835086989b8098e1b4177d8cbd5d1ae8ca44a97 (diff) | |
download | org.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
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() { |