+ if (!non_stop)
+ {
+ /* Unregister the inferior from the event loop. This is done
+ so that when the inferior is not running we don't get
+ distracted by spurious inferior output. */
+ if (target_has_execution)
+ target_async (NULL, 0);
+ }
+
+ /* Do all continuations associated with the whole inferior (not
+ a particular thread). */
+ if (!ptid_equal (inferior_ptid, null_ptid))
+ do_all_inferior_continuations (0);
+
+ /* 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. 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. */
+ if (non_stop
+ && target_has_execution
+ && !ptid_equal (inferior_ptid, null_ptid))
+ do_all_intermediate_continuations_thread (inferior_thread (), 0);
+ else
+ 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. */
+ if (non_stop
+ && target_has_execution
+ && !ptid_equal (inferior_ptid, null_ptid))
+ do_all_continuations_thread (inferior_thread (), 0);
+ else
+ do_all_continuations (0);
+
+ /* When running a command list (from a user command, say), these
+ are only run when the command list is all done. */
+ if (interpreter_async)
+ {
+ volatile struct gdb_exception e;
+
+ check_frame_language_change ();
+
+ /* 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)
+ {
+ bpstat_do_actions ();
+ }
+ exception_print (gdb_stderr, e);
+ }