1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 01:15:29 +02:00

[228703] comment #6 - Cleanup of Breakpoints Hit feature

This commit is contained in:
Pawel Piech 2010-03-10 00:25:56 +00:00
parent d6c4fd9d5f
commit e65973c9cc
4 changed files with 44 additions and 23 deletions

View file

@ -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.IDMContext;
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.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
@ -74,6 +75,7 @@ public class GDBBreakpoints_7_0 extends MIBreakpoints
// Register this service
register(new String[] { IBreakpoints.class.getName(),
IBreakpointsExtension.class.getName(),
MIBreakpoints.class.getName(),
GDBBreakpoints_7_0.class.getName() },
new Hashtable<String, String>());

View file

@ -160,12 +160,12 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
private static class BreakpointHitEvent extends SuspendedEvent
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);
fBreakpoints = new MIBreakpointDMContext[] { bpCtx };
fBreakpoints = new IBreakpointDMContext[] { bpCtx };
}
public IBreakpointDMContext[] getBreakpoints() {
@ -1089,21 +1089,20 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
return;
}
IDMEvent<?> event = null;
MIBreakpointDMContext bp = null;
if (e instanceof MIBreakpointHitEvent) {
int bpId = ((MIBreakpointHitEvent)e).getNumber();
IBreakpointsTargetDMContext bpsTarget = DMContexts.getAncestorOfType(e.getDMContext(), IBreakpointsTargetDMContext.class);
if (bpsTarget != null && bpId >= 0) {
bp = new MIBreakpointDMContext(getSession().getId(), new IDMContext[] {bpsTarget}, bpId);
event = new BreakpointHitEvent(e.getDMContext(), (MIBreakpointHitEvent)e, bp);
}
}
IDMEvent<?> event = null;
if (bp != null) {
event = new BreakpointHitEvent(e.getDMContext(), e, bp);
} else {
if (event == null) {
event = new SuspendedEvent(e.getDMContext(), e);
}
getSession().dispatchEvent(event, getProperties());
}

View file

@ -11,9 +11,11 @@
package org.eclipse.cdt.dsf.mi.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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) {
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.done();
}
@ -1151,9 +1165,12 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints, I
public void eventDispatched(IBreakpointHitDMEvent e) {
if (e instanceof IContainerSuspendedDMEvent) {
IExecutionDMContext[] triggeringContexts = ((IContainerSuspendedDMEvent)e).getTriggeringContexts();
for (IExecutionDMContext ctx : triggeringContexts) {
fBreakpointHitMap.put(ctx, e.getBreakpoints());
if (triggeringContexts != null) {
for (IExecutionDMContext ctx : triggeringContexts) {
fBreakpointHitMap.put(ctx, e.getBreakpoints());
}
} else {
fBreakpointHitMap.put(e.getDMContext(), e.getBreakpoints());
}
} else {
fBreakpointHitMap.put(e.getDMContext(), e.getBreakpoints());
@ -1167,7 +1184,7 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints, I
@DsfServiceEventHandler
public void eventDispatched(IResumedDMEvent e) {
if (e instanceof IContainerResumedDMEvent) {
clearBreakpointHitForContainer(((IContainerResumedDMEvent)e).getDMContext());
clearBreakpointHitForContainer((IContainerDMContext)((IContainerResumedDMEvent)e).getDMContext());
} else {
fBreakpointHitMap.remove(e.getDMContext());
}
@ -1181,13 +1198,13 @@ public class MIBreakpoints extends AbstractDsfService implements IBreakpoints, I
@DsfServiceEventHandler
public void eventDispatched(IExitedDMEvent e) {
if (e.getDMContext() instanceof IContainerDMContext) {
clearBreakpointHitForContainer(e.getDMContext());
clearBreakpointHitForContainer((IContainerDMContext)e.getDMContext());
} else {
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();) {
if (DMContexts.isAncestorOf(itr.next().getKey(), container)) {
itr.remove();

View file

@ -197,12 +197,12 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
protected static class BreakpointHitEvent extends SuspendedEvent
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);
fBreakpoints = new MIBreakpointDMContext[] { bpCtx };
fBreakpoints = new IBreakpointDMContext[] { bpCtx };
}
public IBreakpointDMContext[] getBreakpoints() {
@ -237,7 +237,7 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
{
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);
fBreakpoints = new MIBreakpointDMContext[] { bpCtx };
@ -436,14 +436,15 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I
return;
}
MIBreakpointDMContext bp = null;
MIBreakpointDMContext _bp = null;
if (e instanceof MIBreakpointHitEvent) {
int bpId = ((MIBreakpointHitEvent)e).getNumber();
IBreakpointsTargetDMContext bpsTarget = DMContexts.getAncestorOfType(e.getDMContext(), IBreakpointsTargetDMContext.class);
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;
// 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) {
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());
}
});
return;
}
if (bp != null) {
event = new ContainerBreakpointHitEvent(containerDmc, e, triggeringCtx, bp);
event = new ContainerBreakpointHitEvent(containerDmc, (MIBreakpointHitEvent)e, triggeringCtx, bp);
} else {
event = new ContainerSuspendedEvent(containerDmc, e, triggeringCtx);
}
} else {
if (bp != null) {
event = new BreakpointHitEvent(e.getDMContext(), e, bp);
event = new BreakpointHitEvent(e.getDMContext(), (MIBreakpointHitEvent)e, bp);
} else {
event = new SuspendedEvent(e.getDMContext(), e);
}