From f6a71430110843a3106310f5987bbe16cbbc1a8e Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Fri, 6 Sep 2013 15:06:47 -0400 Subject: [PATCH] Bug 416571 - [run control] Run-to-line gets aborted when setting a breakpoint during the run-to-line Change-Id: Id9182266c6b2ad9795ed18d3ddad900e4bd9b480 Signed-off-by: Marc Khouzam Reviewed-on: https://git.eclipse.org/r/16170 --- .../cdt/dsf/gdb/service/GDBRunControl.java | 13 ++++++++++++- .../dsf/gdb/service/GDBRunControl_7_0_NS.java | 17 ++++++++++------- .../cdt/dsf/mi/service/MIRunControl.java | 6 ++++-- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java index 002d7cc8a8f..b2bb4d019d1 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBRunControl.java @@ -50,6 +50,7 @@ import org.eclipse.cdt.dsf.mi.service.command.events.MIBreakpointHitEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIInferiorExitEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIRunningEvent; +import org.eclipse.cdt.dsf.mi.service.command.events.MISignalEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIStoppedEvent; import org.eclipse.cdt.dsf.mi.service.command.events.MIThreadExitEvent; import org.eclipse.cdt.dsf.mi.service.command.output.MIBreakInsertInfo; @@ -384,7 +385,17 @@ public class GDBRunControl extends MIRunControl { @Override @DsfServiceEventHandler public void eventDispatched(final MIStoppedEvent e) { - if (processRunToLineStoppedEvent(e)) { + // A disabled signal event is due to interrupting the target + // to set a breakpoint. This can happen during a run-to-line + // or step-into operation, so we need to check it first. + if (fDisableNextSignalEvent && e instanceof MISignalEvent) { + fDisableNextSignalEvent = false; + fSilencedSignalEvent = e; + // We don't broadcast this stopped event + return; + } + + if (processRunToLineStoppedEvent(e)) { // If RunToLine is not completed return; } 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 42cf51abf7f..ff3c6a446ad 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 @@ -1549,6 +1549,16 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo */ @DsfServiceEventHandler public void eventDispatched(final MIStoppedEvent e) { + // A disabled signal event is due to interrupting the target + // to set a breakpoint. This can happen during a run-to-line + // or step-into operation, so we need to check it first. + IMIExecutionDMContext threadDmc = DMContexts.getAncestorOfType(e.getDMContext(), IMIExecutionDMContext.class); + if (e instanceof MISignalEvent && fDisableNextSignalEventDmcSet.remove(threadDmc)) { + fSilencedSignalEventMap.put(threadDmc, e); + // Don't broadcast the stopped event + return; + } + if (processRunToLineStoppedEvent(e)) { // If RunToLine is not completed return; @@ -1561,13 +1571,6 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo } private void broadcastStop(final MIStoppedEvent e) { - IMIExecutionDMContext threadDmc = DMContexts.getAncestorOfType(e.getDMContext(), IMIExecutionDMContext.class); - if (e instanceof MISignalEvent && fDisableNextSignalEventDmcSet.remove(threadDmc)) { - fSilencedSignalEventMap.put(threadDmc, e); - // Don't broadcast the stopped event - return; - } - IDMEvent event = null; MIBreakpointDMContext bp = null; if (e instanceof MIBreakpointHitEvent) { 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 71c39729009..1485b45e880 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 @@ -406,13 +406,15 @@ public class MIRunControl extends AbstractDsfService implements IMIRunControl, I protected boolean fDisableNextRunningEvent; /** * Indicates that the next MISignal (MIStopped) event should be silenced. + * @since 4.3 */ - private boolean fDisableNextSignalEvent; + protected boolean fDisableNextSignalEvent; /** * Stores the silenced MIStopped event in case we need to use it * for a failure. + * @since 4.3 */ - private MIStoppedEvent fSilencedSignalEvent; + protected MIStoppedEvent fSilencedSignalEvent; private static final int FAKE_THREAD_ID = 0;