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:
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.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>());
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue