Re: continuations and breakpoint commands

Pedro Alves
2008-05-06T18:50:01Z

[-- Attachment #1: Type: text/plain, Size: 607 bytes --]

A Friday 02 May 2008 16:38:26, Daniel Jacobowitz wrote:
> On Tue, Apr 29, 2008 at 10:21:52PM +0100, Pedro Alves wrote:
> > 2008-04-29 Pedro Alves <pedro@codesourcery.com>
> >
> > * inf-loop.c (inferior_event_handler): Run all continuations and
> > print any language change before running the breakpoint commands.
>
> Looks OK, unless it needs to be reworked after the discussion we're
> currently having about what happens to other continuations.

Since we are not going to add per-thread continuations in all-stop mode
after all, I've checked this in, after another round of testing.

--
Pedro Alves

[-- Attachment #2: fix_commands.exp.diff --]
[-- Type: text/x-diff, Size: 2416 bytes --]

2008-05-06 Pedro Alves <pedro@codesourcery.com>

* inf-loop.c (inferior_event_handler): Run all continuations and
print any language change before running the breakpoint commands.

---
gdb/inf-loop.c | 33 +++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)

Index: src/gdb/inf-loop.c
===================================================================
--- src.orig/gdb/inf-loop.c 2008-05-06 19:23:15.000000000 +0100
+++ src/gdb/inf-loop.c 2008-05-06 19:23:52.000000000 +0100
@@ -92,30 +92,35 @@ inferior_event_handler (enum inferior_ev
was_sync = sync_execution;
async_enable_stdin ();

- /* If there's an error doing breakpoint commands, we don't
- want to throw -- continuation might still do something. */
- TRY_CATCH (e, RETURN_MASK_ALL)
- {
- bpstat_do_actions (&stop_bpstat);
- }
/* If we were doing a multi-step (eg: step n, next n), but it
got interrupted by a breakpoint, still do the pending
continuations. The continuation itself is responsible for
- distinguishing the cases. */
+ distinguishing the cases. The continuations are allowed to
+ touch the inferior memory, e.g. to remove breakpoints, so run
+ them before running breakpoint commands, which may resume the
+ target. */
do_all_intermediate_continuations (0);

+ /* Always finish the previous command before running any
+ breakpoint commands. Any stop cancels the previous command.
+ E.g. a "finish" or "step-n" command interrupted by an
+ unrelated breakpoint is canceled. */
do_all_continuations (0);

- if (current_language != expected_language)
+ if (current_language != expected_language
+ && language_mode == language_mode_auto)
+ language_info (1); /* Print what changed. */
+
+ /* Don't propagate breakpoint commands errors. Either we're
+ stopping or some command resumes the inferior. The user will
+ be informed. */
+ TRY_CATCH (e, RETURN_MASK_ALL)
{
- if (language_mode == language_mode_auto)
- {
- language_info (1); /* Print what changed. */
- }
+ bpstat_do_actions (&stop_bpstat);
}

- /* If the continuation did not start the target again,
- prepare for interation with the user. */
+ /* If no breakpoint command resumed the inferior, prepare for
+ interaction with the user. */
if (!target_executing)
{
if (was_sync)