mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-13 19:25:38 +02:00
[228703] comment #6 - Cleanup of Breakpoints Hit feature
This commit is contained in:
parent
d6c4fd9d5f
commit
e65973c9cc
4 changed files with 44 additions and 23 deletions
|
@ -21,6 +21,7 @@ import org.eclipse.cdt.dsf.concurrent.Sequence.Step;
|
||||||
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
||||||
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
import org.eclipse.cdt.dsf.datamodel.IDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IBreakpoints;
|
import org.eclipse.cdt.dsf.debug.service.IBreakpoints;
|
||||||
|
import org.eclipse.cdt.dsf.debug.service.IBreakpointsExtension;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
|
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
|
||||||
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
||||||
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
|
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
|
||||||
|
@ -74,6 +75,7 @@ public class GDBBreakpoints_7_0 extends MIBreakpoints
|
||||||
|
|
||||||
// Register this service
|
// Register this service
|
||||||
register(new String[] { IBreakpoints.class.getName(),
|
register(new String[] { IBreakpoints.class.getName(),
|
||||||
|
IBreakpointsExtension.class.getName(),
|
||||||
MIBreakpoints.class.getName(),
|
MIBreakpoints.class.getName(),
|
||||||
GDBBreakpoints_7_0.class.getName() },
|
GDBBreakpoints_7_0.class.getName() },
|
||||||
new Hashtable<String, String>());
|
new Hashtable<String, String>());
|
||||||
|
|
|
@ -160,12 +160,12 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
|
||||||
private static class BreakpointHitEvent extends SuspendedEvent
|
private static class BreakpointHitEvent extends SuspendedEvent
|
||||||
implements IBreakpointHitDMEvent
|
implements IBreakpointHitDMEvent
|
||||||
{
|
{
|
||||||
final private MIBreakpointDMContext[] fBreakpoints;
|
final private IBreakpointDMContext[] fBreakpoints;
|
||||||
|
|
||||||
BreakpointHitEvent(IExecutionDMContext ctx, MIStoppedEvent miInfo, MIBreakpointDMContext bpCtx) {
|
BreakpointHitEvent(IExecutionDMContext ctx, MIBreakpointHitEvent miInfo, IBreakpointDMContext bpCtx) {
|
||||||
super(ctx, miInfo);
|
super(ctx, miInfo);
|
||||||
|
|
||||||
fBreakpoints = new MIBreakpointDMContext[] { bpCtx };
|
fBreakpoints = new IBreakpointDMContext[] { bpCtx };
|
||||||
}
|
}
|
||||||
|
|
||||||
public IBreakpointDMContext[] getBreakpoints() {
|
public IBreakpointDMContext[] getBreakpoints() {
|
||||||
|
@ -1089,21 +1089,20 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IDMEvent<?> event = null;
|
||||||
MIBreakpointDMContext bp = null;
|
MIBreakpointDMContext bp = null;
|
||||||
if (e instanceof MIBreakpointHitEvent) {
|
if (e instanceof MIBreakpointHitEvent) {
|
||||||
int bpId = ((MIBreakpointHitEvent)e).getNumber();
|
int bpId = ((MIBreakpointHitEvent)e).getNumber();
|
||||||
IBreakpointsTargetDMContext bpsTarget = DMContexts.getAncestorOfType(e.getDMContext(), IBreakpointsTargetDMContext.class);
|
IBreakpointsTargetDMContext bpsTarget = DMContexts.getAncestorOfType(e.getDMContext(), IBreakpointsTargetDMContext.class);
|
||||||
if (bpsTarget != null && bpId >= 0) {
|
if (bpsTarget != null && bpId >= 0) {
|
||||||
bp = new MIBreakpointDMContext(getSession().getId(), new IDMContext[] {bpsTarget}, bpId);
|
bp = new MIBreakpointDMContext(getSession().getId(), new IDMContext[] {bpsTarget}, bpId);
|
||||||
|
event = new BreakpointHitEvent(e.getDMContext(), (MIBreakpointHitEvent)e, bp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (event == null) {
|
||||||
IDMEvent<?> event = null;
|
|
||||||
if (bp != null) {
|
|
||||||
event = new BreakpointHitEvent(e.getDMContext(), e, bp);
|
|
||||||
} else {
|
|
||||||
event = new SuspendedEvent(e.getDMContext(), e);
|
event = new SuspendedEvent(e.getDMContext(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
getSession().dispatchEvent(event, getProperties());
|
getSession().dispatchEvent(event, getProperties());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,9 +11,11 @@
|
||||||
|
|
||||||
package org.eclipse.cdt.dsf.mi.service;
|
package org.eclipse.cdt.dsf.mi.service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
|
||||||
|
@ -497,6 +499,18 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints, I
|
||||||
*/
|
*/
|
||||||
public void getExecutionContextBreakpoints(IExecutionDMContext ctx, DataRequestMonitor<IBreakpointDMContext[]> rm) {
|
public void getExecutionContextBreakpoints(IExecutionDMContext ctx, DataRequestMonitor<IBreakpointDMContext[]> rm) {
|
||||||
IBreakpointDMContext[] bps = fBreakpointHitMap.get(ctx);
|
IBreakpointDMContext[] bps = fBreakpointHitMap.get(ctx);
|
||||||
|
if (bps == null && ctx instanceof IContainerDMContext) {
|
||||||
|
List<IBreakpointDMContext> bpsList = new ArrayList<IBreakpointDMContext>(1);
|
||||||
|
for (Map.Entry<IExecutionDMContext, IBreakpointDMContext[]> entry : fBreakpointHitMap.entrySet()) {
|
||||||
|
|
||||||
|
if (DMContexts.isAncestorOf(entry.getKey(), ctx)) {
|
||||||
|
for (IBreakpointDMContext bp : entry.getValue()) {
|
||||||
|
bpsList.add(bp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bps = bpsList.toArray(new IBreakpointDMContext[bpsList.size()]);
|
||||||
|
}
|
||||||
rm.setData(bps != null ? bps : new IBreakpointDMContext[0]);
|
rm.setData(bps != null ? bps : new IBreakpointDMContext[0]);
|
||||||
rm.done();
|
rm.done();
|
||||||
}
|
}
|
||||||
|
@ -1151,9 +1165,12 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints, I
|
||||||
public void eventDispatched(IBreakpointHitDMEvent e) {
|
public void eventDispatched(IBreakpointHitDMEvent e) {
|
||||||
if (e instanceof IContainerSuspendedDMEvent) {
|
if (e instanceof IContainerSuspendedDMEvent) {
|
||||||
IExecutionDMContext[] triggeringContexts = ((IContainerSuspendedDMEvent)e).getTriggeringContexts();
|
IExecutionDMContext[] triggeringContexts = ((IContainerSuspendedDMEvent)e).getTriggeringContexts();
|
||||||
|
if (triggeringContexts != null) {
|
||||||
for (IExecutionDMContext ctx : triggeringContexts) {
|
for (IExecutionDMContext ctx : triggeringContexts) {
|
||||||
fBreakpointHitMap.put(ctx, e.getBreakpoints());
|
fBreakpointHitMap.put(ctx, e.getBreakpoints());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fBreakpointHitMap.put(e.getDMContext(), e.getBreakpoints());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fBreakpointHitMap.put(e.getDMContext(), e.getBreakpoints());
|
fBreakpointHitMap.put(e.getDMContext(), e.getBreakpoints());
|
||||||
|
@ -1167,7 +1184,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints, I
|
||||||
@DsfServiceEventHandler
|
@DsfServiceEventHandler
|
||||||
public void eventDispatched(IResumedDMEvent e) {
|
public void eventDispatched(IResumedDMEvent e) {
|
||||||
if (e instanceof IContainerResumedDMEvent) {
|
if (e instanceof IContainerResumedDMEvent) {
|
||||||
clearBreakpointHitForContainer(((IContainerResumedDMEvent)e).getDMContext());
|
clearBreakpointHitForContainer((IContainerDMContext)((IContainerResumedDMEvent)e).getDMContext());
|
||||||
} else {
|
} else {
|
||||||
fBreakpointHitMap.remove(e.getDMContext());
|
fBreakpointHitMap.remove(e.getDMContext());
|
||||||
}
|
}
|
||||||
|
@ -1181,13 +1198,13 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints, I
|
||||||
@DsfServiceEventHandler
|
@DsfServiceEventHandler
|
||||||
public void eventDispatched(IExitedDMEvent e) {
|
public void eventDispatched(IExitedDMEvent e) {
|
||||||
if (e.getDMContext() instanceof IContainerDMContext) {
|
if (e.getDMContext() instanceof IContainerDMContext) {
|
||||||
clearBreakpointHitForContainer(e.getDMContext());
|
clearBreakpointHitForContainer((IContainerDMContext)e.getDMContext());
|
||||||
} else {
|
} else {
|
||||||
fBreakpointHitMap.remove(e.getDMContext());
|
fBreakpointHitMap.remove(e.getDMContext());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void clearBreakpointHitForContainer(IDMContext container) {
|
private void clearBreakpointHitForContainer(IContainerDMContext container) {
|
||||||
for (Iterator<Map.Entry<IExecutionDMContext, IBreakpointDMContext[]>> itr = fBreakpointHitMap.entrySet().iterator(); itr.hasNext();) {
|
for (Iterator<Map.Entry<IExecutionDMContext, IBreakpointDMContext[]>> itr = fBreakpointHitMap.entrySet().iterator(); itr.hasNext();) {
|
||||||
if (DMContexts.isAncestorOf(itr.next().getKey(), container)) {
|
if (DMContexts.isAncestorOf(itr.next().getKey(), container)) {
|
||||||
itr.remove();
|
itr.remove();
|
||||||
|
|
|
@ -197,12 +197,12 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
|
||||||
protected static class BreakpointHitEvent extends SuspendedEvent
|
protected static class BreakpointHitEvent extends SuspendedEvent
|
||||||
implements IBreakpointHitDMEvent
|
implements IBreakpointHitDMEvent
|
||||||
{
|
{
|
||||||
final private MIBreakpointDMContext[] fBreakpoints;
|
final private IBreakpointDMContext[] fBreakpoints;
|
||||||
|
|
||||||
BreakpointHitEvent(IExecutionDMContext ctx, MIStoppedEvent miInfo, MIBreakpointDMContext bpCtx) {
|
BreakpointHitEvent(IExecutionDMContext ctx, MIBreakpointHitEvent miInfo, IBreakpointDMContext bpCtx) {
|
||||||
super(ctx, miInfo);
|
super(ctx, miInfo);
|
||||||
|
|
||||||
fBreakpoints = new MIBreakpointDMContext[] { bpCtx };
|
fBreakpoints = new IBreakpointDMContext[] { bpCtx };
|
||||||
}
|
}
|
||||||
|
|
||||||
public IBreakpointDMContext[] getBreakpoints() {
|
public IBreakpointDMContext[] getBreakpoints() {
|
||||||
|
@ -237,7 +237,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
|
||||||
{
|
{
|
||||||
final private MIBreakpointDMContext[] fBreakpoints;
|
final private MIBreakpointDMContext[] fBreakpoints;
|
||||||
|
|
||||||
ContainerBreakpointHitEvent(IContainerDMContext containerDmc, MIStoppedEvent miInfo, IExecutionDMContext triggeringDmc, MIBreakpointDMContext bpCtx) {
|
ContainerBreakpointHitEvent(IContainerDMContext containerDmc, MIBreakpointHitEvent miInfo, IExecutionDMContext triggeringDmc, MIBreakpointDMContext bpCtx) {
|
||||||
super(containerDmc, miInfo, triggeringDmc);
|
super(containerDmc, miInfo, triggeringDmc);
|
||||||
|
|
||||||
fBreakpoints = new MIBreakpointDMContext[] { bpCtx };
|
fBreakpoints = new MIBreakpointDMContext[] { bpCtx };
|
||||||
|
@ -436,14 +436,15 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MIBreakpointDMContext bp = null;
|
MIBreakpointDMContext _bp = null;
|
||||||
if (e instanceof MIBreakpointHitEvent) {
|
if (e instanceof MIBreakpointHitEvent) {
|
||||||
int bpId = ((MIBreakpointHitEvent)e).getNumber();
|
int bpId = ((MIBreakpointHitEvent)e).getNumber();
|
||||||
IBreakpointsTargetDMContext bpsTarget = DMContexts.getAncestorOfType(e.getDMContext(), IBreakpointsTargetDMContext.class);
|
IBreakpointsTargetDMContext bpsTarget = DMContexts.getAncestorOfType(e.getDMContext(), IBreakpointsTargetDMContext.class);
|
||||||
if (bpsTarget != null && bpId >= 0) {
|
if (bpsTarget != null && bpId >= 0) {
|
||||||
bp = new MIBreakpointDMContext(getSession().getId(), new IDMContext[] {bpsTarget}, bpId);
|
_bp = new MIBreakpointDMContext(getSession().getId(), new IDMContext[] {bpsTarget}, bpId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final MIBreakpointDMContext bp = _bp;
|
||||||
|
|
||||||
IDMEvent<?> event = null;
|
IDMEvent<?> event = null;
|
||||||
// Find the container context, which is used in multi-threaded debugging.
|
// Find the container context, which is used in multi-threaded debugging.
|
||||||
|
@ -464,20 +465,22 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
|
||||||
if (isSuccess() && getData().getCurrentThread() != null) {
|
if (isSuccess() && getData().getCurrentThread() != null) {
|
||||||
triggeringCtx2 = createMIExecutionContext(containerDmc, getData().getCurrentThread());
|
triggeringCtx2 = createMIExecutionContext(containerDmc, getData().getCurrentThread());
|
||||||
}
|
}
|
||||||
IDMEvent<?> event2 = new ContainerSuspendedEvent(containerDmc, e, triggeringCtx2);
|
IDMEvent<?> event2 = bp != null
|
||||||
|
? new ContainerBreakpointHitEvent(containerDmc, (MIBreakpointHitEvent)e, triggeringCtx2, bp)
|
||||||
|
: new ContainerSuspendedEvent(containerDmc, e, triggeringCtx2);
|
||||||
getSession().dispatchEvent(event2, getProperties());
|
getSession().dispatchEvent(event2, getProperties());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (bp != null) {
|
if (bp != null) {
|
||||||
event = new ContainerBreakpointHitEvent(containerDmc, e, triggeringCtx, bp);
|
event = new ContainerBreakpointHitEvent(containerDmc, (MIBreakpointHitEvent)e, triggeringCtx, bp);
|
||||||
} else {
|
} else {
|
||||||
event = new ContainerSuspendedEvent(containerDmc, e, triggeringCtx);
|
event = new ContainerSuspendedEvent(containerDmc, e, triggeringCtx);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (bp != null) {
|
if (bp != null) {
|
||||||
event = new BreakpointHitEvent(e.getDMContext(), e, bp);
|
event = new BreakpointHitEvent(e.getDMContext(), (MIBreakpointHitEvent)e, bp);
|
||||||
} else {
|
} else {
|
||||||
event = new SuspendedEvent(e.getDMContext(), e);
|
event = new SuspendedEvent(e.getDMContext(), e);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue