diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java index 61184df3544..551923c5954 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java @@ -24,16 +24,23 @@ import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlock; import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlockRetrieval; import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext; import org.eclipse.cdt.dsf.debug.service.IMemorySpaces; +import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; +import org.eclipse.cdt.dsf.debug.service.IRunControl.IExitedDMEvent; +import org.eclipse.cdt.dsf.debug.service.IRunControl.IStartedDMEvent; import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; +import org.eclipse.cdt.dsf.service.DsfServiceEventHandler; import org.eclipse.cdt.dsf.service.DsfServices; import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; +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.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.IMemoryBlockExtension; import org.osgi.framework.BundleContext; @@ -381,4 +388,35 @@ public class GdbMemoryBlockRetrieval extends DsfMemoryBlockRetrieval implements } return false; } + + @DsfServiceEventHandler + public void eventDispatched(IStartedDMEvent event) { + if (event.getDMContext() instanceof IContainerDMContext) { + IMemoryDMContext memoryDmc = DMContexts.getAncestorOfType(event.getDMContext(), IMemoryDMContext.class); + if (memoryDmc != null) { + initialize(memoryDmc); + } + } + } + + @DsfServiceEventHandler + public void eventDispatched(IExitedDMEvent event) { + if (event.getDMContext() instanceof IContainerDMContext) { + IMemoryDMContext memoryDmc = DMContexts.getAncestorOfType(event.getDMContext(), IMemoryDMContext.class); + if (memoryDmc != null) { + saveMemoryBlocks(); + 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(GdbMemoryBlockRetrieval.this); + mbm.removeMemoryBlocks(deletedMemoryBlocks); + return Status.OK_STATUS; + } + }; + removeJob.schedule(); + } + } + } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java index 192323456f4..6fa04beb738 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/launching/GdbLaunch.java @@ -32,16 +32,11 @@ import org.eclipse.cdt.dsf.concurrent.ThreadSafeAndProhibitedFromDsfExecutor; import org.eclipse.cdt.dsf.debug.model.DsfLaunch; import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlockRetrieval; import org.eclipse.cdt.dsf.debug.service.IDsfDebugServicesFactory; -import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext; -import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; -import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlShutdownDMEvent; import org.eclipse.cdt.dsf.gdb.IGdbDebugConstants; import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; import org.eclipse.cdt.dsf.gdb.internal.memory.GdbMemoryBlockRetrieval; import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl; -import org.eclipse.cdt.dsf.mi.service.IMIProcesses; -import org.eclipse.cdt.dsf.mi.service.MIProcesses; import org.eclipse.cdt.dsf.mi.service.command.AbstractCLIProcess; import org.eclipse.cdt.dsf.service.DsfServiceEventHandler; import org.eclipse.cdt.dsf.service.DsfServicesTracker; @@ -132,17 +127,10 @@ public class GdbLaunch extends DsfLaunch fExecutor.submit( new Callable() { @Override public Object call() throws CoreException { - ICommandControlService commandControl = fTracker.getService(ICommandControlService.class); - IMIProcesses procService = fTracker.getService(IMIProcesses.class); - if (commandControl != null && procService != null) { - fMemRetrieval = new GdbMemoryBlockRetrieval( - GdbLaunchDelegate.GDB_DEBUG_MODEL_ID, getLaunchConfiguration(), fSession); - fSession.registerModelAdapter(IMemoryBlockRetrieval.class, fMemRetrieval); - - IProcessDMContext procDmc = procService.createProcessContext(commandControl.getContext(), MIProcesses.UNKNOWN_PROCESS_ID); - IMemoryDMContext memoryDmc = (IMemoryDMContext)procService.createContainerContext(procDmc, MIProcesses.UNIQUE_GROUP_ID); - fMemRetrieval.initialize(memoryDmc); - } + fMemRetrieval = new GdbMemoryBlockRetrieval( + GdbLaunchDelegate.GDB_DEBUG_MODEL_ID, getLaunchConfiguration(), fSession); + fSession.registerModelAdapter(IMemoryBlockRetrieval.class, fMemRetrieval); + fSession.addServiceEventListener(fMemRetrieval, null); return null; } }).get(); @@ -253,6 +241,9 @@ public class GdbLaunch extends DsfLaunch new RequestMonitor(fSession.getExecutor(), rm) { @Override public void handleCompleted() { + if (fMemRetrieval != null) + fSession.removeServiceEventListener(fMemRetrieval); + fSession.removeServiceEventListener(GdbLaunch.this); if (!isSuccess()) { GdbPlugin.getDefault().getLog().log(new MultiStatus( @@ -268,8 +259,6 @@ public class GdbLaunch extends DsfLaunch // launch with an invalid gdbserver // Bug 368597 if (fMemRetrieval != null) { - // DsfMemoryBlockRetrieval.saveMemoryBlocks(); - fMemRetrieval.saveMemoryBlocks(); // Fire a terminate event for the memory retrieval object so // that the hosting memory views can clean up. See 255120 and