diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java index f8a052ad295..1a5db0f232e 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java @@ -29,6 +29,7 @@ import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor; import org.eclipse.cdt.dsf.concurrent.ImmediateRequestMonitor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.concurrent.Sequence; +import org.eclipse.cdt.dsf.datamodel.AbstractDMEvent; import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext; @@ -36,6 +37,8 @@ import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext; import org.eclipse.cdt.dsf.debug.service.IMultiDetach; import org.eclipse.cdt.dsf.debug.service.IMultiTerminate; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; +import org.eclipse.cdt.dsf.debug.service.IRunControl.ICreatedDMEvent; +import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IExitedDMEvent; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext; import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants; @@ -51,6 +54,7 @@ import org.eclipse.cdt.dsf.mi.service.IMIRunControl.MIRunMode; import org.eclipse.cdt.dsf.mi.service.MIBreakpointsManager; import org.eclipse.cdt.dsf.mi.service.MIProcesses; import org.eclipse.cdt.dsf.mi.service.command.CommandFactory; +import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadGroupAddedEvent; import org.eclipse.cdt.dsf.mi.service.command.output.MIAddInferiorInfo; import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo; import org.eclipse.cdt.dsf.service.DsfServiceEventHandler; @@ -131,6 +135,18 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 implements IMultiTerminat } } + /** + * Event indicating that a container (gdb inferior) has been created, but is not yet running. + * @since 5.1 + */ + protected static class ContainerCreatedDMEvent extends AbstractDMEvent + implements ICreatedDMEvent + { + public ContainerCreatedDMEvent(IContainerDMContext context) { + super(context); + } + } + /** * The first thread-group id used by GDB. * GDB starts up with certain things already setup, and we need @@ -199,6 +215,12 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 implements IMultiTerminat fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory(); fBackend = getServicesTracker().getService(IGDBBackend.class); + // We know we missed the very first =thread-group-added event + // because GDB sends it as soon as it starts, but we are not + // ready to receive it at that time. We send it now instead. + IMIContainerDMContext initialContainer = createContainerContextFromGroupId(fCommandControl.getContext(), INITIAL_THREAD_GROUP_ID); + getSession().dispatchEvent(new ContainerCreatedDMEvent(initialContainer), getProperties()); + requestMonitor.done(); } @@ -667,6 +689,16 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 implements IMultiTerminat }); } + /** + * @since 5.1 + */ + @DsfServiceEventHandler + public void eventDispatched(MIThreadGroupAddedEvent e) { + IProcessDMContext procDmc = e.getDMContext(); + IMIContainerDMContext containerDmc = e.getGroupId() != null ? createContainerContext(procDmc, e.getGroupId()) : null; + getSession().dispatchEvent(new ContainerCreatedDMEvent(containerDmc), getProperties()); + } + /** @since 4.0 */ @DsfServiceEventHandler @Override diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor_7_0.java index d179514749d..be1a194f16f 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/MIRunControlEventProcessor_7_0.java @@ -52,6 +52,7 @@ import org.eclipse.cdt.dsf.mi.service.command.events.MISteppingRangeEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIStoppedEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadCreatedEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadExitEvent; +import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadGroupAddedEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadGroupCreatedEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadGroupExitedEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIWatchpointScopeEvent; @@ -217,8 +218,31 @@ public class MIRunControlEventProcessor_7_0 fCommandControl.getSession().dispatchEvent(event, fCommandControl.getProperties()); } - } else if ("thread-group-created".equals(miEvent) || "thread-group-started".equals(miEvent)) { //$NON-NLS-1$ //$NON-NLS-2$ + } else if ("thread-group-added".equals(miEvent)) { //$NON-NLS-1$ + // With GDB >= 7.2 + String groupId = null; + + MIResult[] results = exec.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + MIValue val = results[i].getMIValue(); + if (var.equals("id")) { //$NON-NLS-1$ + if (val instanceof MIConst) { + groupId = ((MIConst) val).getString().trim(); + } + } + } + IMIProcesses procService = fServicesTracker.getService(IMIProcesses.class); + if (procService != null) { + // When a thread-group is first added, there is no process and therefore no pid, so we use UNKNOWN_PROCESS_ID + IProcessDMContext processDmc = procService.createProcessContext(fCommandControl.getContext(), MIProcesses.UNKNOWN_PROCESS_ID); + MIEvent event = new MIThreadGroupAddedEvent(processDmc, exec.getToken(), groupId); + fCommandControl.getSession().dispatchEvent(event, fCommandControl.getProperties()); + } + } else if ("thread-group-created".equals(miEvent) || "thread-group-started".equals(miEvent)) { //$NON-NLS-1$ //$NON-NLS-2$ + // =thread-group-created was used for GDB 7.0 and 7.1, + // but then became =thread-group-started starting with GDB 7.2 String groupId = null; String pId = null; diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/events/MIThreadGroupAddedEvent.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/events/MIThreadGroupAddedEvent.java new file mode 100644 index 00000000000..e5acb7d1862 --- /dev/null +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/events/MIThreadGroupAddedEvent.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2016 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 + *******************************************************************************/ +package org.eclipse.cdt.dsf.mi.service.command.events; + +import org.eclipse.cdt.dsf.concurrent.Immutable; +import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; + +/** + * =thread-group-added,id="i1" + * + * This can only be detected by gdb/mi with GDB >= 7.2. + * @since 5.1 + */ +@Immutable +public class MIThreadGroupAddedEvent extends MIEvent { + + final private String fGroupId; + + public MIThreadGroupAddedEvent(IProcessDMContext ctx, int token, String groupId) { + super(ctx, token, null); + fGroupId = groupId; + } + + public String getGroupId() { return fGroupId; } +} diff --git a/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF b/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF index 9b98557f9b7..6f521704eb1 100644 --- a/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF +++ b/dsf/org.eclipse.cdt.dsf/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-SymbolicName: org.eclipse.cdt.dsf;singleton:=true -Bundle-Version: 2.7.0.qualifier +Bundle-Version: 2.8.0.qualifier Bundle-Activator: org.eclipse.cdt.dsf.internal.DsfPlugin Bundle-Localization: plugin Require-Bundle: org.eclipse.core.runtime, diff --git a/dsf/org.eclipse.cdt.dsf/pom.xml b/dsf/org.eclipse.cdt.dsf/pom.xml index 296ade40834..a48a44ea9fe 100644 --- a/dsf/org.eclipse.cdt.dsf/pom.xml +++ b/dsf/org.eclipse.cdt.dsf/pom.xml @@ -11,7 +11,7 @@ ../../pom.xml - 2.7.0-SNAPSHOT + 2.8.0-SNAPSHOT org.eclipse.cdt.dsf eclipse-plugin diff --git a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/service/IRunControl.java b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/service/IRunControl.java index ecfa5dee682..b41f5bb4bb2 100644 --- a/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/service/IRunControl.java +++ b/dsf/org.eclipse.cdt.dsf/src/org/eclipse/cdt/dsf/debug/service/IRunControl.java @@ -87,7 +87,14 @@ public interface IRunControl extends IDsfService */ IExecutionDMContext[] getTriggeringContexts(); } - + + /** + * Indicates that a new execution context was created but may not have + * started execution yet. + * @since 2.8 + */ + public interface ICreatedDMEvent extends IDMEvent {} + /** * Indicates that a new execution context was started. */