Make instream be per UI

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

	* cli/cli-script.c (execute_user_command, read_next_line)
	(read_next_line): Adjust to per-UI instream.
	* event-top.c (stdin_event_handler, command_handler)
	(handle_line_of_input, command_line_handler)
	(gdb_readline_no_editing_callback, async_sigterm_handler)
	(gdb_setup_readline): Likewise.
	* inflow.c: Include top.h.
	(gdb_has_a_terminal, child_terminal_init_with_pgrp)
	(gdb_save_tty_state, child_terminal_inferior)
	(child_terminal_ours_1, copy_terminal_info): Use the main UI.
	(initialize_stdin_serial): Adjust to per-UI instream.
	* main.c (captured_command_loop, captured_main): Adjust to per-UI
	instream.
	* mi/mi-interp.c (mi_execute_command_wrapper): Likewise.
	* python/python.c (python_interactive_command): Likewise.
	* terminal.h (struct ui): Forward declare.
	(initialize_stdin_serial): Add struct ui parameter.
	* top.c (instream): Delete.
	(do_restore_instream_cleanup, read_command_file, dont_repeat)
	(gdb_readline_no_editing, command_line_input)
	(input_from_terminal_p, gdb_init): Adjust to per-UI instream.
	* top.h (struct ui) <instream>: New field.
	(instream): Delete declaration.
	(quit): Adjust to per-UI instream.

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

	* gdb.gdb/selftest.exp (do_steps_and_nexts): Add new regexp.
This commit is contained in:
Pedro Alves 2016-06-21 01:11:46 +01:00
parent 7c36c34e4c
commit f38d3ad186
11 changed files with 107 additions and 42 deletions

View File

@ -1,3 +1,38 @@
2016-06-21 Pedro Alves <palves@redhat.com>
* cli/cli-script.c (execute_user_command, read_next_line)
(read_next_line): Adjust to per-UI instream.
* event-top.c (stdin_event_handler, command_handler)
(handle_line_of_input, command_line_handler)
(gdb_readline_no_editing_callback, async_sigterm_handler)
(gdb_setup_readline): Likewise.
* inflow.c: Include top.h.
(gdb_has_a_terminal, child_terminal_init_with_pgrp)
(gdb_save_tty_state, child_terminal_inferior)
(child_terminal_ours_1, copy_terminal_info): Use the main UI.
(initialize_stdin_serial): Adjust to per-UI instream.
* main.c (captured_command_loop, captured_main): Adjust to per-UI
instream.
* mi/mi-interp.c (mi_execute_command_wrapper): Likewise.
* python/python.c (python_interactive_command): Likewise.
* terminal.h (struct ui): Forward declare.
(initialize_stdin_serial): Add struct ui parameter.
* top.c (instream): Delete.
(do_restore_instream_cleanup, read_command_file, dont_repeat)
(gdb_readline_no_editing, command_line_input)
(input_from_terminal_p, gdb_init): Adjust to per-UI instream.
* top.h (struct ui) <instream>: New field.
(instream): Delete declaration.
(quit): Adjust to per-UI instream.
2016-06-21 Pedro Alves <palves@redhat.com>
* event-loop.c: Include top.h.
(invoke_async_signal_handlers): Switch to the main UI.
* event-top.c (main_ui_): Update comment.
(main_ui): New global.
* top.h (main_ui): Declare.
2016-06-21 Pedro Alves <palves@redhat.com>
* cli/cli-interp.c (cli_interp): Delete.

View File

@ -352,6 +352,7 @@ do_restore_user_call_depth (void * call_depth)
void
execute_user_command (struct cmd_list_element *c, char *args)
{
struct ui *ui = current_ui;
struct command_line *cmdlines;
struct cleanup *old_chain;
enum command_control_type ret;
@ -372,8 +373,8 @@ execute_user_command (struct cmd_list_element *c, char *args)
/* Set the instream to 0, indicating execution of a
user-defined function. */
make_cleanup (do_restore_instream_cleanup, instream);
instream = (FILE *) 0;
make_cleanup (do_restore_instream_cleanup, ui->instream);
ui->instream = NULL;
/* Also set the global in_user_command, so that NULL instream is
not confused with Insight. */
@ -931,6 +932,7 @@ realloc_body_list (struct command_line *command, int new_length)
static char *
read_next_line (void)
{
struct ui *ui = current_ui;
char *prompt_ptr, control_prompt[256];
int i = 0;
@ -938,7 +940,8 @@ read_next_line (void)
error (_("Control nesting too deep!"));
/* Set a prompt based on the nesting of the control commands. */
if (instream == stdin || (instream == 0 && deprecated_readline_hook != NULL))
if (ui->instream == stdin
|| (ui->instream == 0 && deprecated_readline_hook != NULL))
{
for (i = 0; i < control_level; i++)
control_prompt[i] = ' ';
@ -949,7 +952,7 @@ read_next_line (void)
else
prompt_ptr = NULL;
return command_line_input (prompt_ptr, instream == stdin, "commands");
return command_line_input (prompt_ptr, ui->instream == stdin, "commands");
}
/* Process one input line. If the command is an "end", return such an

View File

@ -510,7 +510,7 @@ stdin_event_handler (int error, gdb_client_data client_data)
printf_unfiltered (_("error detected on stdin\n"));
delete_file_handler (input_fd);
/* If stdin died, we may as well kill gdb. */
quit_command ((char *) 0, stdin == instream);
quit_command ((char *) 0, stdin == ui->instream);
}
else
{
@ -566,10 +566,11 @@ async_disable_stdin (void)
void
command_handler (char *command)
{
struct ui *ui = current_ui;
struct cleanup *stat_chain;
char *c;
if (instream == stdin)
if (ui->instream == stdin)
reinitialize_more_filter ();
stat_chain = make_command_stats_cleanup (1);
@ -579,7 +580,7 @@ command_handler (char *command)
;
if (c[0] != '#')
{
execute_command (command, instream == stdin);
execute_command (command, ui->instream == stdin);
/* Do any commands attached to breakpoint we stopped at. */
bpstat_do_actions ();
@ -646,6 +647,7 @@ char *
handle_line_of_input (struct buffer *cmd_line_buffer,
char *rl, int repeat, char *annotation_suffix)
{
struct ui *ui = current_ui;
char *p1;
char *cmd;
@ -660,7 +662,7 @@ handle_line_of_input (struct buffer *cmd_line_buffer,
command, but leave ownership of memory to the buffer . */
cmd_line_buffer->used_size = 0;
if (annotation_level > 1 && instream == stdin)
if (annotation_level > 1 && ui->instream == stdin)
{
printf_unfiltered (("\n\032\032post-"));
puts_unfiltered (annotation_suffix);
@ -677,8 +679,8 @@ handle_line_of_input (struct buffer *cmd_line_buffer,
}
/* Do history expansion if that is wished. */
if (history_expansion_p && instream == stdin
&& ISATTY (instream))
if (history_expansion_p && ui->instream == stdin
&& ISATTY (ui->instream))
{
char *history_value;
int expanded;
@ -748,9 +750,11 @@ void
command_line_handler (char *rl)
{
struct buffer *line_buffer = get_command_line_buffer ();
struct ui *ui = current_ui;
char *cmd;
cmd = handle_line_of_input (line_buffer, rl, instream == stdin, "prompt");
cmd = handle_line_of_input (line_buffer, rl, ui->instream == stdin,
"prompt");
if (cmd == (char *) EOF)
{
/* stdin closed. The connection with the terminal is gone.
@ -758,7 +762,7 @@ command_line_handler (char *rl)
hung up but GDB is still alive. In such a case, we just quit
gdb killing the inferior program too. */
printf_unfiltered ("quit\n");
execute_command ("quit", stdin == instream);
execute_command ("quit", stdin == ui->instream);
}
else if (cmd == NULL)
{
@ -793,9 +797,9 @@ gdb_readline_no_editing_callback (gdb_client_data client_data)
stream after '\n'. If we buffer the input and fgetc drains the
stream, getting stuff beyond the newline as well, a select, done
afterwards will not trigger. */
if (!done_once && !ISATTY (instream))
if (!done_once && !ISATTY (ui->instream))
{
setbuf (instream, NULL);
setbuf (ui->instream, NULL);
done_once = 1;
}
@ -811,7 +815,7 @@ gdb_readline_no_editing_callback (gdb_client_data client_data)
{
/* Read from stdin if we are executing a user defined command.
This is the right thing for prompt_for_continue, at least. */
c = fgetc (instream ? instream : stdin);
c = fgetc (ui->instream ? ui->instream : stdin);
if (c == EOF)
{
@ -1059,7 +1063,7 @@ interruptible_select (int n,
static void
async_sigterm_handler (gdb_client_data arg)
{
quit_force (NULL, stdin == instream);
quit_force (NULL, stdin == current_ui->instream);
}
/* See defs.h. */
@ -1241,7 +1245,7 @@ gdb_setup_readline (void)
/* If the input stream is connected to a terminal, turn on
editing. */
if (ISATTY (instream))
if (ISATTY (ui->instream))
{
/* Tell gdb that we will be using the readline library. This
could be overwritten by a command in .gdbinit like 'set
@ -1264,11 +1268,11 @@ gdb_setup_readline (void)
ui->input_handler = command_line_handler;
/* Tell readline to use the same input stream that gdb uses. */
rl_instream = instream;
rl_instream = ui->instream;
/* Get a file descriptor for the input stream, so that we can
register it with the event loop. */
input_fd = fileno (instream);
input_fd = fileno (ui->instream);
/* Now we need to create the event sources for the input file
descriptor. */

View File

@ -309,6 +309,8 @@ setup_alternate_signal_stack (void)
static int
captured_command_loop (void *data)
{
struct ui *ui = current_ui;
/* Top-level execution commands can be run in the background from
here on. */
current_ui->async = 1;
@ -326,7 +328,7 @@ captured_command_loop (void *data)
error) we try to quit. If the quit is aborted, catch_errors()
which called this catch the signal and restart the command
loop. */
quit_command (NULL, instream == stdin);
quit_command (NULL, ui->instream == stdin);
return 1;
}
@ -435,6 +437,7 @@ DEF_VEC_O (cmdarg_s);
static int
captured_main (void *data)
{
struct ui *ui = current_ui;
struct captured_main_args *context = (struct captured_main_args *) data;
int argc = context->argc;
char **argv = context->argv;
@ -504,7 +507,7 @@ captured_main (void *data)
ndir = 0;
saved_command_line = (char *) xstrdup ("");
instream = stdin;
ui->instream = stdin;
#ifdef __MINGW32__
/* Ensure stderr is unbuffered. A Cygwin pty or pipe is implemented

View File

@ -284,7 +284,9 @@ mi_interp_query_hook (const char *ctlstr, va_list ap)
static void
mi_execute_command_wrapper (const char *cmd)
{
mi_execute_command (cmd, stdin == instream);
struct ui *ui = current_ui;
mi_execute_command (cmd, stdin == ui->instream);
}
/* Observer for the synchronous_command_done notification. */

View File

@ -318,6 +318,7 @@ eval_python_command (const char *command)
static void
python_interactive_command (char *arg, int from_tty)
{
struct ui *ui = current_ui;
struct cleanup *cleanup;
int err;
@ -341,7 +342,7 @@ python_interactive_command (char *arg, int from_tty)
}
else
{
err = PyRun_InteractiveLoop (instream, "<stdin>");
err = PyRun_InteractiveLoop (ui->instream, "<stdin>");
dont_repeat ();
}

View File

@ -1,3 +1,7 @@
2016-06-21 Pedro Alves <palves@redhat.com>
* gdb.gdb/selftest.exp (do_steps_and_nexts): Add new regexp.
2016-06-21 Pedro Alves <palves@redhat.com>
* gdb.ada/mi_catch_ex.exp (continue_to_exception): New procedure.

View File

@ -205,6 +205,10 @@ proc do_steps_and_nexts {} {
set description "step over gdb_stderr initialization"
set command "step"
}
-re "ui = current_ui.*$gdb_prompt $" {
set description "step over top_level initialization"
set command "step"
}
-re ".*main.c.*No such file or directory.*$gdb_prompt $" {
setup_xfail "rs6000-*-aix3*"
fail "must be able to list source lines"

View File

@ -123,13 +123,6 @@ show_confirm (struct ui_file *file, int from_tty,
value);
}
/* stdio stream that command input is being read from. Set to stdin
normally. Set by source_command to the file we are sourcing. Set
to NULL if we are executing a user-defined command or interacting
via a GUI. */
FILE *instream;
/* Flag to indicate whether a user defined command is currently running. */
int in_user_command;
@ -286,23 +279,26 @@ quit_cover (void)
void
do_restore_instream_cleanup (void *stream)
{
struct ui *ui = current_ui;
/* Restore the previous input stream. */
instream = (FILE *) stream;
ui->instream = (FILE *) stream;
}
/* Read commands from STREAM. */
void
read_command_file (FILE *stream)
{
struct ui *ui = current_ui;
struct cleanup *cleanups;
cleanups = make_cleanup (do_restore_instream_cleanup, instream);
instream = stream;
cleanups = make_cleanup (do_restore_instream_cleanup, ui->instream);
ui->instream = stream;
/* Read commands from `instream' and execute them until end of file
or error reading instream. */
while (instream != NULL && !feof (instream))
while (ui->instream != NULL && !feof (ui->instream))
{
char *command;
@ -568,13 +564,15 @@ static int suppress_dont_repeat = 0;
void
dont_repeat (void)
{
struct ui *ui = current_ui;
if (suppress_dont_repeat || server_command)
return;
/* If we aren't reading from standard input, we are saving the last
thing read from stdin in line and don't want to delete it. Null
lines won't repeat here in any case. */
if (instream == stdin)
if (ui->instream == stdin)
*saved_command_line = 0;
}
@ -603,9 +601,10 @@ static char *
gdb_readline_no_editing (const char *prompt)
{
struct buffer line_buffer;
struct ui *ui = current_ui;
/* Read from stdin if we are executing a user defined command. This
is the right thing for prompt_for_continue, at least. */
FILE *stream = instream != NULL ? instream : stdin;
FILE *stream = ui->instream != NULL ? ui->instream : stdin;
int fd = fileno (stream);
buffer_init (&line_buffer);
@ -1047,6 +1046,7 @@ command_line_input (const char *prompt_arg, int repeat, char *annotation_suffix)
{
static struct buffer cmd_line_buffer;
static int cmd_line_buffer_initialized;
struct ui *ui = current_ui;
const char *prompt = prompt_arg;
char *cmd;
@ -1054,7 +1054,7 @@ command_line_input (const char *prompt_arg, int repeat, char *annotation_suffix)
if (annotation_suffix == NULL)
annotation_suffix = "";
if (annotation_level > 1 && instream == stdin)
if (annotation_level > 1 && ui->instream == stdin)
{
char *local_prompt;
@ -1100,7 +1100,7 @@ command_line_input (const char *prompt_arg, int repeat, char *annotation_suffix)
if (source_file_name != NULL)
++source_line_number;
if (annotation_level > 1 && instream == stdin)
if (annotation_level > 1 && ui->instream == stdin)
{
puts_unfiltered ("\n\032\032pre-");
puts_unfiltered (annotation_suffix);
@ -1511,16 +1511,18 @@ quit_force (char *args, int from_tty)
int
input_from_terminal_p (void)
{
struct ui *ui = current_ui;
if (batch_flag)
return 0;
if (gdb_has_a_terminal () && instream == stdin)
if (gdb_has_a_terminal () && ui->instream == stdin)
return 1;
/* If INSTREAM is unset, and we are not in a user command, we
must be in Insight. That's like having a terminal, for our
purposes. */
if (instream == NULL && !in_user_command)
if (ui->instream == NULL && !in_user_command)
return 1;
return 0;

View File

@ -68,6 +68,12 @@ struct ui
"start" -ex "next"') are processed. */
int async;
/* stdio stream that command input is being read from. Set to stdin
normally. Set by source_command to the file we are sourcing.
Set to NULL if we are executing a user-defined command or
interacting via a GUI. */
FILE *instream;
/* The fields below that start with "m_" are "private". They're
meant to be accessed through wrapper macros that make them look
like globals. */
@ -121,7 +127,6 @@ extern void switch_thru_all_uis_next (struct switch_thru_all_uis *state);
/* From top.c. */
extern char *saved_command_line;
extern FILE *instream;
extern int in_user_command;
extern int confirm;
extern char gdb_dirbuf[1024];

View File

@ -1047,10 +1047,12 @@ print_sys_errmsg (const char *string, int errcode)
void
quit (void)
{
struct ui *ui = current_ui;
if (sync_quit_force_run)
{
sync_quit_force_run = 0;
quit_force (NULL, stdin == instream);
quit_force (NULL, stdin == ui->instream);
}
#ifdef __MSDOS__