From e65973c9cc0786f4ebdcf3c019a3910bf470471a Mon Sep 17 00:00:00 2001 From: Pawel Piech Date: Wed, 10 Mar 2010 00:25:56 +0000 Subject: [PATCH] [228703] comment #6 - Cleanup of Breakpoints Hit feature --- .../dsf/gdb/service/GDBBreakpoints_7_0.java | 2 ++ .../dsf/gdb/service/GDBRunControl_7_0_NS.java | 15 +++++----- .../cdt/dsf/mi/service/MIBreakpoints.java | 29 +++++++++++++++---- .../cdt/dsf/mi/service/MIRunControl.java | 21 ++++++++------ 4 files changed, 44 insertions(+), 23 deletions(-) diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBBreakpoints_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBBreakpoints_7_0.java index f821fcaf993..6c715220092 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBBreakpoints_7_0.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBBreakpoints_7_0.java @@ -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()); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java index 39157e3078e..c44b98c7699 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl_7_0_NS.java @@ -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()); } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIBreakpoints.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIBreakpoints.java index c2334b917e0..67488267450 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIBreakpoints.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIBreakpoints.java @@ -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 rm) { IBreakpointDMContext[] bps = fBreakpointHitMap.get(ctx); + if (bps == null && ctx instanceof IContainerDMContext) { + List bpsList = new ArrayList(1); + for (Map.Entry 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> itr = fBreakpointHitMap.entrySet().iterator(); itr.hasNext();) { if (DMContexts.isAncestorOf(itr.next().getKey(), container)) { itr.remove(); diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java index cb96e6084fe..fd003dee42e 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIRunControl.java @@ -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); }