From 9384592322131b99991617aea4d7e897d770ce74 Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Wed, 27 Aug 2008 21:43:59 +0000 Subject: [PATCH] [245297] - [non-stop][cache] Caching may not be possible in non-stop mode --- .../expression/ExpressionVMProvider.java | 30 +++++++++++++++++++ .../register/RegisterVMProvider.java | 26 ++++++++++++++++ .../variable/VariableVMProvider.java | 25 ++++++++++++++++ .../dd/dsf/debug/service/ICachingService.java | 27 +++++++++++++++++ .../examples/pda/service/PDAExpressions.java | 6 +++- .../dd/examples/pda/service/PDARegisters.java | 7 ++++- .../dd/mi/service/ExpressionService.java | 7 ++++- .../org/eclipse/dd/mi/service/MIMemory.java | 6 +++- .../eclipse/dd/mi/service/MIRegisters.java | 8 ++++- 9 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/ICachingService.java diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProvider.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProvider.java index 781ca22b736..bb310cb6df0 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProvider.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionVMProvider.java @@ -13,7 +13,9 @@ package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.expression; import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.RejectedExecutionException; +import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.FormattedValuePreferenceStore; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.IFormattedValuePreferenceStore; @@ -24,7 +26,12 @@ import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register.SyncR import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.BreakpointHitUpdatePolicy; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.variable.SyncVariableDataAccess; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.variable.VariableVMNode; +import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; +import org.eclipse.dd.dsf.debug.service.ICachingService; +import org.eclipse.dd.dsf.debug.service.IExpressions; +import org.eclipse.dd.dsf.debug.service.IRegisters; import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent; +import org.eclipse.dd.dsf.service.DsfServicesTracker; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter; import org.eclipse.dd.dsf.ui.viewmodel.DefaultVMContentProviderStrategy; @@ -344,4 +351,27 @@ public class ExpressionVMProvider extends AbstractDMVMProvider // events. return newEvent instanceof ISuspendedDMEvent; } + + @Override + public void refresh() { + super.refresh(); + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + DsfServicesTracker tracker = new DsfServicesTracker(DsfDebugUIPlugin.getBundleContext(), getSession().getId()); + IExpressions expressionsService = tracker.getService(IExpressions.class); + if (expressionsService instanceof ICachingService) { + ((ICachingService)expressionsService).flushCache(null); + } + IRegisters registerService = tracker.getService(IRegisters.class); + if (registerService instanceof ICachingService) { + ((ICachingService)registerService).flushCache(null); + } + tracker.dispose(); + } + }); + } catch (RejectedExecutionException e) { + // Session disposed, ignore. + } + } } diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterVMProvider.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterVMProvider.java index bbb8b2aa20f..873cdb850d7 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterVMProvider.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/register/RegisterVMProvider.java @@ -10,12 +10,19 @@ *******************************************************************************/ package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.register; +import java.util.concurrent.RejectedExecutionException; + +import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.datamodel.DMContexts; import org.eclipse.dd.dsf.datamodel.IDMContext; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.FormattedValuePreferenceStore; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.BreakpointHitUpdatePolicy; +import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; +import org.eclipse.dd.dsf.debug.service.ICachingService; +import org.eclipse.dd.dsf.debug.service.IRegisters; import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext; import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent; +import org.eclipse.dd.dsf.service.DsfServicesTracker; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter; import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMContext; @@ -227,4 +234,23 @@ public class RegisterVMProvider extends AbstractDMVMProvider return fDMContext.hashCode(); } } + + @Override + public void refresh() { + super.refresh(); + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + DsfServicesTracker tracker = new DsfServicesTracker(DsfDebugUIPlugin.getBundleContext(), getSession().getId()); + IRegisters registerService = tracker.getService(IRegisters.class); + if (registerService instanceof ICachingService) { + ((ICachingService)registerService).flushCache(null); + } + tracker.dispose(); + } + }); + } catch (RejectedExecutionException e) { + // Session disposed, ignore. + } + } } diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/variable/VariableVMProvider.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/variable/VariableVMProvider.java index 1c8a39510f7..f6e97995be9 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/variable/VariableVMProvider.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/variable/VariableVMProvider.java @@ -10,9 +10,16 @@ *******************************************************************************/ package org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.variable; +import java.util.concurrent.RejectedExecutionException; + +import org.eclipse.dd.dsf.concurrent.DsfRunnable; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.numberformat.FormattedValuePreferenceStore; import org.eclipse.dd.dsf.debug.internal.provisional.ui.viewmodel.update.BreakpointHitUpdatePolicy; +import org.eclipse.dd.dsf.debug.internal.ui.DsfDebugUIPlugin; +import org.eclipse.dd.dsf.debug.service.ICachingService; +import org.eclipse.dd.dsf.debug.service.IExpressions; import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent; +import org.eclipse.dd.dsf.service.DsfServicesTracker; import org.eclipse.dd.dsf.service.DsfSession; import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMAdapter; import org.eclipse.dd.dsf.ui.viewmodel.IRootVMNode; @@ -93,4 +100,22 @@ public class VariableVMProvider extends AbstractDMVMProvider return newEvent instanceof ISuspendedDMEvent; } + @Override + public void refresh() { + super.refresh(); + try { + getSession().getExecutor().execute(new DsfRunnable() { + public void run() { + DsfServicesTracker tracker = new DsfServicesTracker(DsfDebugUIPlugin.getBundleContext(), getSession().getId()); + IExpressions expressionsService = tracker.getService(IExpressions.class); + if (expressionsService instanceof ICachingService) { + ((ICachingService)expressionsService).flushCache(null); + } + tracker.dispose(); + } + }); + } catch (RejectedExecutionException e) { + // Session disposed, ignore. + } + } } diff --git a/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/ICachingService.java b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/ICachingService.java new file mode 100644 index 00000000000..2d6c6ec9d60 --- /dev/null +++ b/plugins/org.eclipse.dd.dsf.debug/src/org/eclipse/dd/dsf/debug/service/ICachingService.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2008 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.dd.dsf.debug.service; + +import org.eclipse.dd.dsf.datamodel.IDMContext; + +/** + * Interface for services which use an internal cache for data. + */ +public interface ICachingService { + + /** + * Clears the service cache entries which have the given context in their + * hierachy. + * @param context Root context to flush. May be null to flush + * the entire cache. + */ + public void flushCache(IDMContext context); +} diff --git a/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDAExpressions.java b/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDAExpressions.java index fe2dd1d4543..0deac984758 100644 --- a/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDAExpressions.java +++ b/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDAExpressions.java @@ -20,6 +20,7 @@ import org.eclipse.dd.dsf.datamodel.AbstractDMContext; import org.eclipse.dd.dsf.datamodel.AbstractDMEvent; import org.eclipse.dd.dsf.datamodel.DMContexts; import org.eclipse.dd.dsf.datamodel.IDMContext; +import org.eclipse.dd.dsf.debug.service.ICachingService; import org.eclipse.dd.dsf.debug.service.IExpressions; import org.eclipse.dd.dsf.debug.service.IRegisters.IRegisterDMContext; import org.eclipse.dd.dsf.debug.service.IRunControl.IResumedDMEvent; @@ -41,7 +42,7 @@ import org.osgi.framework.BundleContext; /** * */ -public class PDAExpressions extends AbstractDsfService implements IExpressions { +public class PDAExpressions extends AbstractDsfService implements ICachingService, IExpressions { @Immutable private static class ExpressionDMContext extends AbstractDMContext implements IExpressionDMContext { @@ -540,4 +541,7 @@ public class PDAExpressions extends AbstractDsfService implements IExpressions { fCommandCache.reset(DMContexts.getAncestorOfType(e.getDMContext(), PDAThreadDMContext.class)); } + public void flushCache(IDMContext context) { + fCommandCache.reset(context); + } } diff --git a/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARegisters.java b/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARegisters.java index 287f6517c88..232f2900ca2 100644 --- a/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARegisters.java +++ b/plugins/org.eclipse.dd.examples.pda/src/org/eclipse/dd/examples/pda/service/PDARegisters.java @@ -20,6 +20,7 @@ import org.eclipse.dd.dsf.datamodel.AbstractDMContext; import org.eclipse.dd.dsf.datamodel.AbstractDMEvent; import org.eclipse.dd.dsf.datamodel.DMContexts; import org.eclipse.dd.dsf.datamodel.IDMContext; +import org.eclipse.dd.dsf.debug.service.ICachingService; import org.eclipse.dd.dsf.debug.service.IRegisters; import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMContext; @@ -41,7 +42,7 @@ import org.osgi.framework.BundleContext; * */ public class PDARegisters extends AbstractDsfService - implements IRegisters, IEventListener + implements IRegisters, IEventListener, ICachingService { private static class RegisterGroupDMContext extends AbstractDMContext implements IRegisterGroupDMContext { @@ -548,4 +549,8 @@ public class PDARegisters extends AbstractDsfService fNamesCache.reset(); } } + + public void flushCache(IDMContext context) { + fExpressions.flushCache(context); + } } 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 1081b6c1a54..da2996c269b 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 @@ -27,6 +27,7 @@ import org.eclipse.dd.dsf.datamodel.AbstractDMContext; import org.eclipse.dd.dsf.datamodel.AbstractDMEvent; import org.eclipse.dd.dsf.datamodel.DMContexts; import org.eclipse.dd.dsf.datamodel.IDMContext; +import org.eclipse.dd.dsf.debug.service.ICachingService; import org.eclipse.dd.dsf.debug.service.IExpressions; import org.eclipse.dd.dsf.debug.service.IFormattedValues; import org.eclipse.dd.dsf.debug.service.IRunControl; @@ -59,7 +60,7 @@ import org.osgi.framework.BundleContext; * This class implements a debugger expression evaluator as a DSF service. The * primary interface that clients of this class should use is IExpressions. */ -public class ExpressionService extends AbstractDsfService implements IExpressions { +public class ExpressionService extends AbstractDsfService implements IExpressions, ICachingService { /** * This class represents the two expressions that characterize an Expression Context. @@ -912,4 +913,8 @@ public class ExpressionService extends AbstractDsfService implements IExpression // MIVariableManager separately traps this event } + public void flushCache(IDMContext context) { + fExpressionCache.reset(); + } + } 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 0b5400752c6..6390573eae2 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 @@ -28,6 +28,7 @@ import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.AbstractDMEvent; import org.eclipse.dd.dsf.datamodel.DMContexts; import org.eclipse.dd.dsf.datamodel.IDMContext; +import org.eclipse.dd.dsf.debug.service.ICachingService; import org.eclipse.dd.dsf.debug.service.IExpressions; import org.eclipse.dd.dsf.debug.service.IMemory; import org.eclipse.dd.dsf.debug.service.IRunControl; @@ -51,7 +52,7 @@ import org.osgi.framework.BundleContext; /** * Memory service implementation */ -public class MIMemory extends AbstractDsfService implements IMemory { +public class MIMemory extends AbstractDsfService implements IMemory, ICachingService { public class MemoryChangedEvent extends AbstractDMEvent implements IMemoryChangedEvent @@ -906,4 +907,7 @@ public class MIMemory extends AbstractDsfService implements IMemory { } + public void flushCache(IDMContext context) { + fMemoryCache.reset(); + } } 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 282885d82ab..e72d6baa6d0 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 @@ -20,6 +20,7 @@ import org.eclipse.dd.dsf.concurrent.RequestMonitor; import org.eclipse.dd.dsf.datamodel.AbstractDMContext; import org.eclipse.dd.dsf.datamodel.DMContexts; import org.eclipse.dd.dsf.datamodel.IDMContext; +import org.eclipse.dd.dsf.debug.service.ICachingService; import org.eclipse.dd.dsf.debug.service.IRegisters; import org.eclipse.dd.dsf.debug.service.IRunControl; import org.eclipse.dd.dsf.debug.service.IExpressions.IExpressionDMContext; @@ -53,7 +54,7 @@ import org.osgi.framework.BundleContext; * always be consistent with the events. */ -public class MIRegisters extends AbstractDsfService implements IRegisters { +public class MIRegisters extends AbstractDsfService implements IRegisters, ICachingService { private static final String BLANK_STRING = ""; //$NON-NLS-1$ /* * Support class used to construct Register Group DMCs. @@ -621,4 +622,9 @@ public class MIRegisters extends AbstractDsfService implements IRegisters { rm.setStatus(new Status(IStatus.ERROR, MIPlugin.PLUGIN_ID, NOT_SUPPORTED, "Finding a Register Group context not supported", null)); //$NON-NLS-1$ rm.done(); } + + public void flushCache(IDMContext context) { + fRegisterNameCache.reset(context); + fRegisterValueCache.reset(context); + } }