diff options
-rw-r--r-- | gdb/ChangeLog | 24 | ||||
-rw-r--r-- | gdb/event-top.c | 33 | ||||
-rw-r--r-- | gdb/event-top.h | 1 | ||||
-rw-r--r-- | gdb/linux-nat.c | 2 | ||||
-rw-r--r-- | gdb/main.c | 1 | ||||
-rw-r--r-- | gdb/remote.c | 2 | ||||
-rw-r--r-- | gdb/target.c | 16 | ||||
-rw-r--r-- | gdb/top.h | 4 |
8 files changed, 59 insertions, 24 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c1ebfe9..680e6e5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,29 @@ 2016-06-21 Pedro Alves <palves@redhat.com> + * event-top.c (input_fd): Delete. + (stdin_event_handler): Switch to the UI whose input descriptor got + the event. Adjust to per-UI input_fd. + (gdb_setup_readline): Don't set the input_fd global. Adjust to + per-UI input_fd. + (gdb_disable_readline): Adjust to per-UI input_fd. + * event-top.h (input_fd): Delete declaration. + * linux-nat.c (linux_nat_terminal_inferior): Don't remove input_fd + from the event-loop here. + (linux_nat_terminal_ours): Don't register input_fd in the + event-loop here. + * main.c (captured_main): Adjust to per-UI input_fd. + * remote.c (remote_terminal_inferior): Don't remove input_fd from + the event-loop here. + (remote_terminal_ours): Don't register input_fd in the event-loop + here. + * target.c: Include top.h and event-top.h. + (target_terminal_inferior): Remove input_fd from the event-loop + here. + (target_terminal_ours): Register input_fd in the event-loop. + * top.h (struct ui) <input_fd>: New field. + +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) diff --git a/gdb/event-top.c b/gdb/event-top.c index 3e2f778..1d36b81 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -94,10 +94,6 @@ int async_command_editing_p; asynchronous execution command. */ int exec_done_display_p = 0; -/* This is the file descriptor for the input stream that GDB uses to - read commands from. */ -int input_fd; - /* Used by the stdin event handler to compensate for missed stdin events. Setting this to a non-zero value inside an stdin callback makes the callback run again. */ @@ -503,12 +499,16 @@ get_command_line_buffer (void) void stdin_event_handler (int error, gdb_client_data client_data) { - struct ui *ui = current_ui; + struct ui *ui = (struct ui *) client_data; + + /* Switch to the UI whose input descriptor woke up the event + loop. */ + current_ui = ui; if (error) { printf_unfiltered (_("error detected on stdin\n")); - delete_file_handler (input_fd); + delete_file_handler (ui->input_fd); /* If stdin died, we may as well kill gdb. */ quit_command ((char *) 0, stdin == ui->instream); } @@ -1270,18 +1270,11 @@ gdb_setup_readline (void) /* Tell readline to use the same input stream that gdb uses. */ 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 (ui->instream); - - /* Now we need to create the event sources for the input file - descriptor. */ - /* At this point in time, this is the only event source that we - register with the even loop. Another source is going to be the - target program (inferior), but that must be registered only when - it actually exists (I.e. after we say 'run' or after we connect - to a remote target. */ - add_file_handler (input_fd, stdin_event_handler, 0); + /* Now create the event source for this UI's input file descriptor. + Another source is going to be the target program (inferior), but + that must be registered only when it actually exists (I.e. after + we say 'run' or after we connect to a remote target. */ + add_file_handler (ui->input_fd, stdin_event_handler, ui); } /* Disable command input through the standard CLI channels. Used in @@ -1290,6 +1283,8 @@ gdb_setup_readline (void) void gdb_disable_readline (void) { + struct ui *ui = current_ui; + /* FIXME - It is too heavyweight to delete and remake these every time you run an interpreter that needs readline. It is probably better to have the interpreters cache these, which in turn means @@ -1304,5 +1299,5 @@ gdb_disable_readline (void) #endif gdb_rl_callback_handler_remove (); - delete_file_handler (input_fd); + delete_file_handler (ui->input_fd); } diff --git a/gdb/event-top.h b/gdb/event-top.h index 04956a5..4fe7737 100644 --- a/gdb/event-top.h +++ b/gdb/event-top.h @@ -57,7 +57,6 @@ extern void async_enable_stdin (void); extern int async_command_editing_p; extern int exec_done_display_p; extern struct prompts the_prompts; -extern int input_fd; extern void (*after_char_processing_hook) (void); extern int call_stdin_event_handler_again_p; extern void gdb_readline_no_editing_callback (void *client_data); diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index e6d525f..fd2df5f 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -4415,7 +4415,6 @@ linux_nat_terminal_inferior (struct target_ops *self) if (!async_terminal_is_ours) return; - delete_file_handler (input_fd); async_terminal_is_ours = 0; set_sigint_trap (); } @@ -4441,7 +4440,6 @@ linux_nat_terminal_ours (struct target_ops *self) return; clear_sigint_trap (); - add_file_handler (input_fd, stdin_event_handler, 0); async_terminal_is_ours = 1; } @@ -508,6 +508,7 @@ captured_main (void *data) saved_command_line = (char *) xstrdup (""); ui->instream = stdin; + ui->input_fd = fileno (stdin); #ifdef __MINGW32__ /* Ensure stderr is unbuffered. A Cygwin pty or pipe is implemented diff --git a/gdb/remote.c b/gdb/remote.c index 1f0d67c..501f3c6 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -5924,7 +5924,6 @@ remote_terminal_inferior (struct target_ops *self) can go away. */ if (!remote_async_terminal_ours_p) return; - delete_file_handler (input_fd); remote_async_terminal_ours_p = 0; /* NOTE: At this point we could also register our selves as the recipient of all input. Any characters typed could then be @@ -5937,7 +5936,6 @@ remote_terminal_ours (struct target_ops *self) /* See FIXME in remote_terminal_inferior. */ if (remote_async_terminal_ours_p) return; - add_file_handler (input_fd, stdin_event_handler, 0); remote_async_terminal_ours_p = 1; } diff --git a/gdb/target.c b/gdb/target.c index c0ce46d..b53074a 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -43,6 +43,8 @@ #include "agent.h" #include "auxv.h" #include "target-debug.h" +#include "top.h" +#include "event-top.h" static void target_info (char *, int); @@ -477,6 +479,8 @@ target_terminal_is_ours (void) void target_terminal_inferior (void) { + struct ui *ui = current_ui; + /* A background resume (``run&'') should leave GDB in control of the terminal. Use target_can_async_p, not target_is_async_p, since at this point the target is not async yet. However, if sync_execution @@ -484,6 +488,11 @@ target_terminal_inferior (void) if (target_can_async_p () && !sync_execution) return; + /* Always delete the current UI's input file handler, regardless of + terminal_state, because terminal_state is only valid for the main + UI. */ + delete_file_handler (ui->input_fd); + if (terminal_state == terminal_is_inferior) return; @@ -503,6 +512,13 @@ target_terminal_inferior (void) void target_terminal_ours (void) { + struct ui *ui = current_ui; + + /* Always add the current UI's input file handler, regardless of + terminal_state, because terminal_state is only valid for the main + UI. */ + add_file_handler (ui->input_fd, stdin_event_handler, ui); + if (terminal_state == terminal_is_ours) return; @@ -74,6 +74,10 @@ struct ui interacting via a GUI. */ FILE *instream; + /* The file descriptor for the input stream, so that we can register + it with the event loop. */ + int input_fd; + /* The fields below that start with "m_" are "private". They're meant to be accessed through wrapper macros that make them look like globals. */ |