From 398f01e873b597835bac75a341c7d6f91de3fb0a Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Tue, 26 Feb 2008 14:37:12 +0000 Subject: [PATCH] Fix for bug 214550. All variable objects are marked out-of-date on a MemoryChangedEvent --- .../dd/mi/service/ExpressionService.java | 4 ++-- .../dd/mi/service/MIVariableManager.java | 23 +++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/ExpressionService.java b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/ExpressionService.java index 9fb5aec2dcc..75223e4474a 100644 --- a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/ExpressionService.java +++ b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/ExpressionService.java @@ -892,7 +892,7 @@ public class ExpressionService extends AbstractDsfService implements IExpression @DsfServiceEventHandler public void eventDispatched(IMemoryChangedEvent e) { fExpressionCache.reset(); - // We must also deal with our MIVariableManager since it - // caches variable values, which may now have changed + // MIVariableManager separately traps this event } + } diff --git a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIVariableManager.java b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIVariableManager.java index 3227e81206f..a8cb20bf35d 100644 --- a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIVariableManager.java +++ b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIVariableManager.java @@ -33,6 +33,7 @@ import org.eclipse.dd.dsf.debug.service.IStack; import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMContext; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.dd.dsf.debug.service.IFormattedValues.FormattedValueDMData; +import org.eclipse.dd.dsf.debug.service.IMemory.IMemoryChangedEvent; import org.eclipse.dd.dsf.debug.service.IStack.IFrameDMContext; import org.eclipse.dd.dsf.debug.service.command.ICommand; import org.eclipse.dd.dsf.debug.service.command.ICommandControl; @@ -1629,6 +1630,13 @@ public class MIVariableManager extends AbstractDsfService implements ICommandCon return MIPlugin.getBundleContext(); } + private void markAllOutOfDate() { + MIRootVariableObject root; + while ((root = updatedRootList.poll()) != null) { + root.markAsOutOfDate(); + } + } + @DsfServiceEventHandler public void eventDispatched(IRunControl.IResumedDMEvent e) { // Program has resumed, all variable objects need to be updated. @@ -1636,13 +1644,20 @@ public class MIVariableManager extends AbstractDsfService implements ICommandCon // to deal with those. Also, to optimize this operation, we have // a list of all roots that have been updated, so we only have to // set those to needing to be updated. - MIRootVariableObject root; - while ((root = updatedRootList.poll()) != null) { - root.markAsOutOfDate(); - } + markAllOutOfDate(); } @DsfServiceEventHandler public void eventDispatched(IRunControl.ISuspendedDMEvent e) { } + + @DsfServiceEventHandler + public void eventDispatched(IMemoryChangedEvent e) { + // Some memory has changed. We currently do not know the address + // of each of our variable objects, so there is no way to know + // which one is affected. Mark them all as out of date. + // The views will fully refresh on a MemoryChangedEvent + markAllOutOfDate(); + } + }