Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlvaro Sanchez-Leon2013-12-05 20:20:44 +0000
committerMarc Khouzam2014-01-15 14:06:21 +0000
commitf1639f8a859821bd2767f1ca7decc8eff3fa3d18 (patch)
tree695eefa3dff60bdeeebc2444e93a7bdadfdac723 /dsf/org.eclipse.cdt.dsf
parent54a0b2dd06a48c470bd210a5b98296240218b888 (diff)
downloadorg.eclipse.cdt-f1639f8a859821bd2767f1ca7decc8eff3fa3d18.tar.gz
org.eclipse.cdt-f1639f8a859821bd2767f1ca7decc8eff3fa3d18.tar.xz
org.eclipse.cdt-f1639f8a859821bd2767f1ca7decc8eff3fa3d18.zip
Bug 250323 - Each memory context needs a different memory retrieval
Change-Id: I7874d84e5831aeb36be508a5b6b83c1623fcc5ab Signed-off-by: Alvaro Sanchez-Leon <alvsan09@gmail.com> Reviewed-on: https://git.eclipse.org/r/19453 Reviewed-by: Mikhail Khodjaiants <mikhailkhod@googlemail.com> IP-Clean: Mikhail Khodjaiants <mikhailkhod@googlemail.com> Tested-by: Mikhail Khodjaiants <mikhailkhod@googlemail.com> Tested-by: Hudson CI Reviewed-by: Marc Khouzam <marc.khouzam@ericsson.com> IP-Clean: Marc Khouzam <marc.khouzam@ericsson.com> Tested-by: Marc Khouzam <marc.khouzam@ericsson.com>
Diffstat (limited to 'dsf/org.eclipse.cdt.dsf')
-rw-r--r--dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF2
-rw-r--r--dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/IMemoryBlockRetrievalManager.java44
-rw-r--r--dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/MemoryBlockRetrievalFactory.java55
-rw-r--r--dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/MemoryBlockRetrievalManager.java141
4 files changed, 241 insertions, 1 deletions
diff --git a/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF b/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF
index 62acb0a310a..5016ab01357 100644
--- a/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF
+++ b/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF
@@ -14,7 +14,7 @@ Require-Bundle: org.eclipse.core.runtime,
Bundle-ActivationPolicy: lazy
Export-Package: org.eclipse.cdt.dsf.concurrent,
org.eclipse.cdt.dsf.datamodel,
- org.eclipse.cdt.dsf.debug.internal.provisional.model;x-friends:="org.eclipse.cdt.dsf.ui",
+ org.eclipse.cdt.dsf.debug.internal.provisional.model;x-friends:="org.eclipse.cdt.dsf.ui, org.eclipse.cdt.dsf.gdb",
org.eclipse.cdt.dsf.debug.internal.provisional.service;x-internal:=true,
org.eclipse.cdt.dsf.debug.model,
org.eclipse.cdt.dsf.debug.service,
diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/IMemoryBlockRetrievalManager.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/IMemoryBlockRetrievalManager.java
new file mode 100644
index 00000000000..97d911b5abd
--- /dev/null
+++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/IMemoryBlockRetrievalManager.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Ericsson 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:
+ * Alvaro Sanchez-Leon (Ericsson AB) - Each memory context needs a different MemoryRetrieval (Bug 250323)
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.debug.internal.provisional.model;
+
+import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
+
+/**
+ * <p>It's expected to have one IMemoryBlockRetrievalManager per session which instantiates and keeps the mapping between IMemoryDMContext and its
+ * corresponding IMemoryBlockRetrieval. </p>
+ *
+ * <p>One IMemoryDMContext represents a hierarchy of elements that share the same memory e.g A process, thread and frame in Linux,
+ * One session is capable of having multiple IMemoryContext e.g. Debugging multiple programs under the same session</p>
+ *
+ * <p>An IMemoryBlockRetrieval helps to retrieve memory blocks from the same memory and therefore it is expected to have a one to one
+ * relationship with an IMemoryDMContext</p>
+ *
+ * <p>Functionality detecting changes to different memory context elements can resolve the corresponding IMemoryBlockRetrieval via this API.</p>
+ *
+ */
+public interface IMemoryBlockRetrievalManager {
+ /**
+ * A method to resolve the specific IMemoryBlockRetrieval associated to the IMemoryDMContext of the given IDMContext
+ *
+ * @param dmc - A context which either itself or one of its parents is an IMemoryDMContext
+ * @return - The IMemoryBlockRetrieval associated to the IMemoryDMContext resolved from the given dmc
+ */
+ public IMemoryBlockRetrieval getMemoryBlockRetrieval(IDMContext dmc);
+
+ /**
+ * Shall be called when this manager is no longer needed
+ * Any required clean up needs to be performed so this class can be
+ * garbage collected.
+ */
+ public void dispose();
+}
diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/MemoryBlockRetrievalFactory.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/MemoryBlockRetrievalFactory.java
new file mode 100644
index 00000000000..d4c51de1e3f
--- /dev/null
+++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/MemoryBlockRetrievalFactory.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Ericsson 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:
+ * Alvaro Sanchez-Leon (Ericsson AB) - Each memory context needs a different MemoryRetrieval (Bug 250323)
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.debug.internal.provisional.model;
+
+import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
+
+/**
+ * A common MemoryBlockRetrievalFactory across debug sessions
+ * which resolves (adapts) an element context to its corresponding
+ * IMemoryBlockRetrieval via the session's IMemoryBlockRetrievalManager
+ *
+ * (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.provisional.model.IMemoryBlockRetrievalManager
+ *
+ */
+public class MemoryBlockRetrievalFactory implements IAdapterFactory {
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public Object getAdapter(Object adaptableObject, Class adapterType) {
+ IMemoryBlockRetrieval memRetrieval = null;
+
+ if (adaptableObject instanceof IDMContext) {
+ if (adapterType.equals(IMemoryBlockRetrieval.class)) {
+ IAdaptable adaptable = (IAdaptable) adaptableObject;
+ //Retrieve the session's Memory Block Retrieval Manager
+ IMemoryBlockRetrievalManager retrievalManager = ((IMemoryBlockRetrievalManager) adaptable
+ .getAdapter(IMemoryBlockRetrievalManager.class));
+ if (retrievalManager != null) {
+ //resolve the specific Memory Block Retrieval associated to the memory context of adaptableObject
+ memRetrieval = retrievalManager.getMemoryBlockRetrieval((IDMContext) adaptableObject);
+ }
+ }
+ }
+
+ return memRetrieval;
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public Class[] getAdapterList() {
+ return new Class[] { IMemoryBlockRetrieval.class };
+ }
+}
diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/MemoryBlockRetrievalManager.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/MemoryBlockRetrievalManager.java
new file mode 100644
index 00000000000..2a3e60b26fb
--- /dev/null
+++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/internal/provisional/model/MemoryBlockRetrievalManager.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Ericsson 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:
+ * Alvaro Sanchez-Leon (Ericsson AB) - Each memory context needs a different MemoryRetrieval (Bug 250323)
+ *******************************************************************************/
+package org.eclipse.cdt.dsf.debug.internal.provisional.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.cdt.dsf.datamodel.DMContexts;
+import org.eclipse.cdt.dsf.datamodel.IDMContext;
+import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlockRetrieval;
+import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.IExitedDMEvent;
+import org.eclipse.cdt.dsf.debug.service.IRunControl.IStartedDMEvent;
+import org.eclipse.cdt.dsf.internal.DsfPlugin;
+import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
+import org.eclipse.cdt.dsf.service.DsfSession;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.DebugEvent;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.IMemoryBlockManager;
+import org.eclipse.debug.core.model.IMemoryBlock;
+import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
+
+/* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.provisional.model.IMemoryBlockRetrievalManager
+ */
+public class MemoryBlockRetrievalManager implements IMemoryBlockRetrievalManager {
+
+ private final String fModelId;
+ private final DsfSession fSession;
+ private final ILaunchConfiguration fLaunchConfig;
+ private final Map<IMemoryDMContext, IMemoryBlockRetrieval> fMapMemDMCToBlockRetrieval = new HashMap<IMemoryDMContext, IMemoryBlockRetrieval>();
+
+ /**
+ * Constructor
+ */
+ public MemoryBlockRetrievalManager(String modelId, ILaunchConfiguration config, DsfSession session) {
+ fModelId = modelId;
+ fSession = session;
+ fLaunchConfig = config;
+ }
+
+ @DsfServiceEventHandler
+ public void eventDispatched(IStartedDMEvent event) {
+ // If a new memory context is starting, create its memory retrieval instance
+ if (event.getDMContext() instanceof IMemoryDMContext) {
+ IMemoryDMContext memDmc = (IMemoryDMContext) event.getDMContext();
+ if (!fMapMemDMCToBlockRetrieval.containsKey(memDmc)) {
+ // We need a new memory retrieval for this new memory context
+ IMemoryBlockRetrieval memRetrieval = null;
+ try {
+ memRetrieval = createMemoryBlockRetrieval(fModelId, fLaunchConfig, fSession);
+ } catch (DebugException e) {
+ DsfPlugin.getDefault().getLog().log(e.getStatus());
+ return;
+ }
+
+ if (memRetrieval != null) {
+ if (memRetrieval instanceof DsfMemoryBlockRetrieval) {
+ ((DsfMemoryBlockRetrieval) memRetrieval).initialize(memDmc);
+ }
+
+ fMapMemDMCToBlockRetrieval.put(memDmc, memRetrieval);
+ }
+ }
+ }
+ }
+
+ @DsfServiceEventHandler
+ public void eventDispatched(IExitedDMEvent event) {
+ // If a memory context is exiting, save expressions and clean its used resources
+ if (event.getDMContext() instanceof IMemoryDMContext) {
+ IMemoryDMContext memDmc = (IMemoryDMContext) event.getDMContext();
+ // Remove entry if it exists
+ final IMemoryBlockRetrieval retrieval = fMapMemDMCToBlockRetrieval.remove(memDmc);
+ if (retrieval != null) {
+ if (retrieval instanceof DsfMemoryBlockRetrieval) {
+ ((DsfMemoryBlockRetrieval) retrieval).saveMemoryBlocks();
+ }
+ // Fire a terminate event for the memory retrieval object so
+ // that the hosting memory views can clean up. See 255120 and
+ // 283586
+ DebugPlugin.getDefault().fireDebugEventSet(
+ new DebugEvent[] { new DebugEvent(retrieval, DebugEvent.TERMINATE) });
+
+ Job removeJob = new Job("Removing memory blocks") { //$NON-NLS-1$
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IMemoryBlockManager mbm = DebugPlugin.getDefault().getMemoryBlockManager();
+ IMemoryBlock[] deletedMemoryBlocks = mbm.getMemoryBlocks(retrieval);
+ mbm.removeMemoryBlocks(deletedMemoryBlocks);
+ return Status.OK_STATUS;
+ }
+ };
+ removeJob.schedule();
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.provisional.model.IMemoryBlockRetrievalManager#getMemoryBlockRetrieval(org.eclipse.cdt.dsf.datamodel.IDMContext)
+ */
+ @Override
+ public IMemoryBlockRetrieval getMemoryBlockRetrieval(IDMContext dmc) {
+ IMemoryBlockRetrieval memRetrieval = null;
+ IMemoryDMContext memDmc = DMContexts.getAncestorOfType(dmc, IMemoryDMContext.class);
+ if (memDmc != null) {
+ memRetrieval = fMapMemDMCToBlockRetrieval.get(memDmc);
+ }
+
+ return memRetrieval;
+ }
+
+ protected IMemoryBlockRetrieval createMemoryBlockRetrieval(String model, ILaunchConfiguration config,
+ DsfSession session) throws DebugException {
+ return new DsfMemoryBlockRetrieval(model, config, session);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.dsf.debug.internal.provisional.model.IMemoryBlockRetrievalManager#dispose()
+ */
+ @Override
+ public void dispose() {
+ // release resources / references
+ fMapMemDMCToBlockRetrieval.clear();
+ }
+}

Back to the top