From e90dbc258a9467e7a2bbc3db2688814894d4cc27 Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Mon, 16 Jun 2008 18:27:01 +0000 Subject: [PATCH] [237235] - [commands] CommandCache.isTargetAvailable/setContextAvailable don't work correctly with non-stop multithreading. --- .../dd/dsf/debug/service/command/CommandCache.java | 14 +++++++------- .../eclipse/dd/mi/service/ExpressionService.java | 5 ++++- .../src/org/eclipse/dd/mi/service/MIMemory.java | 7 +++++-- .../src/org/eclipse/dd/mi/service/MIRegisters.java | 6 +++++- .../org/eclipse/dd/mi/service/MIRunControl.java | 7 ++++--- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/command/CommandCache.java b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/command/CommandCache.java index ef063efecf3..6c0cf3d1b44 100644 --- a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/command/CommandCache.java +++ b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/command/CommandCache.java @@ -146,7 +146,7 @@ public class CommandCache implements ICommandListener * created. When the coalesced commands completes the results will be decomposed * when back into individual results from this command. */ - private Set fUnavailableContexts = new HashSet(); + private Set fAvailableContexts = new HashSet(); private Map> fCachedContexts = new HashMap>(); @@ -444,11 +444,11 @@ public class CommandCache implements ICommandListener * TODO */ public void setContextAvailable(IDMContext context, boolean isAvailable) { - if (!isAvailable) { - fUnavailableContexts.add(context); + if (isAvailable) { + fAvailableContexts.add(context); } else { - fUnavailableContexts.remove(context); - for (Iterator itr = fUnavailableContexts.iterator(); itr.hasNext();) { + fAvailableContexts.remove(context); + for (Iterator itr = fAvailableContexts.iterator(); itr.hasNext();) { if (DMContexts.isAncestorOf(itr.next(), context)) { itr.remove(); } @@ -461,9 +461,9 @@ public class CommandCache implements ICommandListener * @see #setContextAvailable(IDMContext, boolean) */ public boolean isTargetAvailable(IDMContext context) { - for (IDMContext availableContext : fUnavailableContexts) { + for (IDMContext availableContext : fAvailableContexts) { if (context.equals(availableContext) || DMContexts.isAncestorOf(context, availableContext)) { - return false; + return true; } } return true; 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 18155f3db71..a0b717b442b 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 @@ -40,6 +40,7 @@ import org.eclipse.dd.dsf.service.AbstractDsfService; import org.eclipse.dd.dsf.service.DsfServiceEventHandler; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.mi.internal.MIPlugin; +import org.eclipse.dd.mi.service.command.AbstractMIControl; import org.eclipse.dd.mi.service.command.commands.ExprMetaGetAttributes; import org.eclipse.dd.mi.service.command.commands.ExprMetaGetChildCount; import org.eclipse.dd.mi.service.command.commands.ExprMetaGetChildren; @@ -453,7 +454,9 @@ public class ExpressionService extends AbstractDsfService implements IExpression // Create the meta command cache which will use the variable manager // to actually send MI commands to the back-end fExpressionCache = new CommandCache(getSession(), varManager); - + AbstractMIControl miControl = getServicesTracker().getService(AbstractMIControl.class); + fExpressionCache.setContextAvailable(miControl.getControlDMContext(), true); + requestMonitor.done(); } diff --git a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIMemory.java b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIMemory.java index 78699ee6303..1136b1c728a 100644 --- a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIMemory.java +++ b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIMemory.java @@ -35,12 +35,12 @@ import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMAddress; import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMContext; import org.eclipse.dd.dsf.debug.service.IRunControl.StateChangeReason; import org.eclipse.dd.dsf.debug.service.command.CommandCache; -import org.eclipse.dd.dsf.debug.service.command.ICommandControl; import org.eclipse.dd.dsf.service.AbstractDsfService; import org.eclipse.dd.dsf.service.DsfServiceEventHandler; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.mi.internal.MIPlugin; import org.eclipse.dd.mi.service.ExpressionService.ExpressionChangedEvent; +import org.eclipse.dd.mi.service.command.AbstractMIControl; import org.eclipse.dd.mi.service.command.commands.MIDataReadMemory; import org.eclipse.dd.mi.service.command.commands.MIDataWriteMemory; import org.eclipse.dd.mi.service.command.output.MIDataReadMemoryInfo; @@ -437,7 +437,10 @@ public class MIMemory extends AbstractDsfService implements IMemory { public MIMemoryCache() { // Create the command cache - fCommandCache = new CommandCache(getSession(), getServicesTracker().getService(ICommandControl.class)); + AbstractMIControl miControl = getServicesTracker().getService(AbstractMIControl.class); + fCommandCache = new CommandCache(getSession(), miControl); + fCommandCache.setContextAvailable(miControl.getControlDMContext(), true); + // Create the memory block cache fMemoryBlockList = new SortedMemoryBlockList(); } diff --git a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRegisters.java b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRegisters.java index 4a1a8801591..532229644a4 100644 --- a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRegisters.java +++ b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRegisters.java @@ -32,6 +32,7 @@ import org.eclipse.dd.dsf.service.AbstractDsfService; import org.eclipse.dd.dsf.service.DsfServiceEventHandler; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.mi.internal.MIPlugin; +import org.eclipse.dd.mi.service.command.AbstractMIControl; import org.eclipse.dd.mi.service.command.commands.MIDataListRegisterNames; import org.eclipse.dd.mi.service.command.commands.MIDataListRegisterValues; import org.eclipse.dd.mi.service.command.output.MIDataListRegisterNamesInfo; @@ -170,8 +171,11 @@ public class MIRegisters extends AbstractDsfService implements IRegisters { /* * Create the lower level register cache. */ - fRegisterValueCache = new CommandCache(getSession(), getServicesTracker().getService(ICommandControl.class)); + AbstractMIControl miControl = getServicesTracker().getService(AbstractMIControl.class); + fRegisterValueCache = new CommandCache(getSession(), miControl); + fRegisterValueCache.setContextAvailable(miControl.getControlDMContext(), true); fRegisterNameCache = new CommandCache(getSession(), getServicesTracker().getService(ICommandControl.class)); + fRegisterNameCache.setContextAvailable(miControl.getControlDMContext(), true); /* * Sign up so we see events. We use these events to decide how to manage diff --git a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRunControl.java b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRunControl.java index 21e9c24b7c1..ed43f92efd0 100644 --- a/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRunControl.java +++ b/plugins/org.eclipse.dd.mi/src/org/eclipse/dd/mi/service/MIRunControl.java @@ -24,11 +24,11 @@ import org.eclipse.dd.dsf.datamodel.IDMEvent; import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IStack.IFrameDMContext; import org.eclipse.dd.dsf.debug.service.command.CommandCache; -import org.eclipse.dd.dsf.debug.service.command.ICommandControl; import org.eclipse.dd.dsf.service.AbstractDsfService; import org.eclipse.dd.dsf.service.DsfServiceEventHandler; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.mi.internal.MIPlugin; +import org.eclipse.dd.mi.service.command.AbstractMIControl; import org.eclipse.dd.mi.service.command.commands.MIExecContinue; import org.eclipse.dd.mi.service.command.commands.MIExecFinish; import org.eclipse.dd.mi.service.command.commands.MIExecInterrupt; @@ -257,7 +257,7 @@ public class MIRunControl extends AbstractDsfService implements IRunControl } } - private ICommandControl fConnection; + private AbstractMIControl fConnection; private CommandCache fMICommandCache; // state flags @@ -286,8 +286,9 @@ public class MIRunControl extends AbstractDsfService implements IRunControl } private void doInitialize(final RequestMonitor rm) { - fConnection = getServicesTracker().getService(ICommandControl.class); + fConnection = getServicesTracker().getService(AbstractMIControl.class); fMICommandCache = new CommandCache(getSession(), fConnection); + fMICommandCache.setContextAvailable(fConnection.getControlDMContext(), true); getSession().addServiceEventListener(this, null); //register(new String[]{IRunControl.class.getName(), MIRunControl.class.getName()}, new Hashtable());