New function should_print_stop_to_console

There's code in the MI interpreter that decides whether a stop should
be sent to MI's console stream.  Move this check to the CLI
interpreter code, so that we can reuse it in both the CLI and TUI
interpreters.

gdb/ChangeLog:
2016-06-21  Pedro Alves  <palves@redhat.com>

	* cli/cli-interp.c: Include gdbthread.h and thread-fsm.h.
	(should_print_stop_to_console): New function, factored out from
	mi_on_normal_stop_1.
	* cli/cli-interp.h (should_print_stop_to_console): Declare.
	* mi/mi-interp.c (mi_on_normal_stop_1): Use
	should_print_stop_to_console.  Pass it the current UI's console
	interpreter.
	* mi/mi-main.c (captured_mi_execute_command): Use the
	INTERP_CONSOLE symbol rather than explicit "console".
This commit is contained in:
Pedro Alves 2016-06-21 01:11:52 +01:00
parent a8836c9358
commit 26cde2cc30
5 changed files with 56 additions and 24 deletions

View File

@ -1,3 +1,15 @@
2016-06-21 Pedro Alves <palves@redhat.com>
* cli/cli-interp.c: Include gdbthread.h and thread-fsm.h.
(should_print_stop_to_console): New function, factored out from
mi_on_normal_stop_1.
* cli/cli-interp.h (should_print_stop_to_console): Declare.
* mi/mi-interp.c (mi_on_normal_stop_1): Use
should_print_stop_to_console. Pass it the current UI's console
interpreter.
* mi/mi-main.c (captured_mi_execute_command): Use the
INTERP_CONSOLE symbol rather than explicit "console".
2016-06-21 Pedro Alves <palves@redhat.com>
* infcmd.c (prepare_execution_command): Use

View File

@ -27,6 +27,8 @@
#include "event-top.h"
#include "infrun.h"
#include "observer.h"
#include "gdbthread.h"
#include "thread-fsm.h"
/* The console interpreter. */
struct cli_interp
@ -51,6 +53,38 @@ static struct gdb_exception safe_execute_command (struct ui_out *uiout,
char *command,
int from_tty);
/* See cli-interp.h.
Breakpoint hits should always be mirrored to a console. Deciding
what to mirror to a console wrt to breakpoints and random stops
gets messy real fast. E.g., say "s" trips on a breakpoint. We'd
clearly want to mirror the event to the console in this case. But
what about more complicated cases like "s&; thread n; s&", and one
of those steps spawning a new thread, and that thread hitting a
breakpoint? It's impossible in general to track whether the thread
had any relation to the commands that had been executed. So we
just simplify and always mirror breakpoints and random events to
all consoles.
OTOH, we should print the source line to the console when stepping
or other similar commands, iff the step was started by that console
(or in MI's case, by a console command), but not if it was started
with MI's -exec-step or similar. */
int
should_print_stop_to_console (struct interp *console_interp,
struct thread_info *tp)
{
if ((bpstat_what (tp->control.stop_bpstat).main_action
== BPSTAT_WHAT_STOP_NOISY)
|| !(tp->thread_fsm != NULL
&& thread_fsm_finished_p (tp->thread_fsm))
|| (tp->control.command_interp != NULL
&& tp->control.command_interp == console_interp))
return 1;
return 0;
}
/* Observers for several run control events. If the interpreter is
quiet (i.e., another interpreter is being run with
interpreter-exec), print nothing. */

View File

@ -24,4 +24,9 @@ extern int cli_interpreter_supports_command_editing (struct interp *interp);
extern void cli_interpreter_pre_command_loop (struct interp *self);
/* Returns true if the current stop should be printed to
CONSOLE_INTERP. */
extern int should_print_stop_to_console (struct interp *interp,
struct thread_info *tp);
#endif

View File

@ -38,6 +38,7 @@
#include "tracepoint.h"
#include "cli-out.h"
#include "thread-fsm.h"
#include "cli/cli-interp.h"
/* These are the interpreter setup, etc. functions for the MI
interpreter. */
@ -686,6 +687,7 @@ mi_on_normal_stop_1 (struct bpstats *bs, int print_frame)
{
struct thread_info *tp;
int core;
struct interp *console_interp;
tp = inferior_thread ();
@ -700,31 +702,10 @@ mi_on_normal_stop_1 (struct bpstats *bs, int print_frame)
}
print_stop_event (mi_uiout);
/* Breakpoint hits should always be mirrored to the console.
Deciding what to mirror to the console wrt to breakpoints and
random stops gets messy real fast. E.g., say "s" trips on a
breakpoint. We'd clearly want to mirror the event to the
console in this case. But what about more complicated cases
like "s&; thread n; s&", and one of those steps spawning a
new thread, and that thread hitting a breakpoint? It's
impossible in general to track whether the thread had any
relation to the commands that had been executed. So we just
simplify and always mirror breakpoints and random events to
the console.
OTOH, we should print the source line to the console when
stepping or other similar commands, iff the step was started
by a console command, but not if it was started with
-exec-step or similar. */
if ((bpstat_what (tp->control.stop_bpstat).main_action
== BPSTAT_WHAT_STOP_NOISY)
|| !(tp->thread_fsm != NULL
&& thread_fsm_finished_p (tp->thread_fsm))
|| (tp->control.command_interp != NULL
&& tp->control.command_interp != top_level_interpreter ()))
console_interp = interp_lookup (current_ui, INTERP_CONSOLE);
if (should_print_stop_to_console (console_interp, tp))
print_stop_event (mi->cli_uiout);
tp = inferior_thread ();
ui_out_field_int (mi_uiout, "thread-id", tp->global_num);
if (non_stop)
{

View File

@ -2042,7 +2042,7 @@ captured_mi_execute_command (struct ui_out *uiout, struct mi_parse *context)
/* Echo the command on the console. */
fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
/* Call the "console" interpreter. */
argv[0] = "console";
argv[0] = INTERP_CONSOLE;
argv[1] = context->command;
mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);