1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

[245297] - [non-stop][cache] Caching may not be possible in non-stop mode

This commit is contained in:
Pawel Piech 2008-08-27 21:43:59 +00:00
parent 4bd72a218e
commit 9384592322
9 changed files with 137 additions and 5 deletions

View file

@ -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.
}
}
}

View file

@ -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.
}
}
}

View file

@ -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.
}
}
}

View file

@ -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 <code>null</code> to flush
* the entire cache.
*/
public void flushCache(IDMContext context);
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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();
}
}

View file

@ -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<IMemoryDMContext>
implements IMemoryChangedEvent
@ -906,4 +907,7 @@ public class MIMemory extends AbstractDsfService implements IMemory {
}
public void flushCache(IDMContext context) {
fMemoryCache.reset();
}
}

View file

@ -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);
}
}