aboutsummaryrefslogtreecommitdiff
path: root/gdb/event-top.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2016-06-21 01:11:44 +0100
committerPedro Alves <palves@redhat.com>2016-06-21 01:11:44 +0100
commita74e1786ac24d4ef1ce8a92a1ab06c727a462881 (patch)
tree0029ac9cc3ec060349bb6d98a56423db4df820dd /gdb/event-top.c
parent45db7c09c37c9aceb3a7e149a6577388fc566432 (diff)
downloadgdb-a74e1786ac24d4ef1ce8a92a1ab06c727a462881.zip
gdb-a74e1786ac24d4ef1ce8a92a1ab06c727a462881.tar.gz
gdb-a74e1786ac24d4ef1ce8a92a1ab06c727a462881.tar.bz2
Introduce "struct ui"
This is a step towards supporting multiple consoles/MIs, each on its own stdio streams / terminal. See intro comment in top.h. (I've had trouble picking a name for this object. I've started out with "struct console" originally. But then this is about MI as well, and there's "interpreter-exec console", which is specifically about the CLI... So I changed to "struct terminal", but, then we have a terminal object that works when the input is not a terminal as well ... Then I sort of gave up and renamed it to "struct top_level". But it then gets horribly confusing when we talk about the "top level interpreter that's running on the current top level". In the end, I realized we're already sort of calling this "ui", in struct ui_out, struct ui_file, and a few coments here and there.) gdb/ChangeLog: 2016-06-21 Pedro Alves <palves@redhat.com> * event-top.c: Update readline-related comments. (input_handler, call_readline): Delete globals. (gdb_rl_callback_handler): Call the current UI's input_handler method. (change_line_handler): Adjust to set current UI's properties instead of globals. (current_ui_, current_ui): New globals. (get_command_line_buffer): Rewrite to refer to the current UI. (stdin_event_handler): Adjust to call the call_readline method of the current UI. (gdb_readline_no_editing_callback): Adjust to call the current UI's input_handler method. (gdb_setup_readline): Adjust to set current UI's properties instead of globals. * event-top.h (call_readline, input_handler): Delete declarations. * mi/mi-interp.c (mi_interpreter_resume): Adjust to set current UI's properties instead of globals. * top.c (gdb_readline_wrapper_cleanup): Adjust to set current UI's properties instead of globals. (gdb_readline_wrapper): Adjust to call and set current UI's methods instead of globals. * top.h: Include buffer.h and event-loop.h. (struct ui): New struct. (current_ui): New declaration.
Diffstat (limited to 'gdb/event-top.c')
-rw-r--r--gdb/event-top.c74
1 files changed, 29 insertions, 45 deletions
diff --git a/gdb/event-top.c b/gdb/event-top.c
index f43fd0a..664543c 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -75,28 +75,10 @@ static void async_stop_sig (gdb_client_data);
#endif
static void async_sigterm_handler (gdb_client_data arg);
-/* Readline offers an alternate interface, via callback
- functions. These are all included in the file callback.c in the
- readline distribution. This file provides (mainly) a function, which
- the event loop uses as callback (i.e. event handler) whenever an event
- is detected on the standard input file descriptor.
- readline_callback_read_char is called (by the GDB event loop) whenever
- there is a new character ready on the input stream. This function
- incrementally builds a buffer internal to readline where it
- accumulates the line read up to the point of invocation. In the
- special case in which the character read is newline, the function
- invokes a GDB supplied callback routine, which does the processing of
- a full command line. This latter routine is the asynchronous analog
- of the old command_line_input in gdb. Instead of invoking (and waiting
- for) readline to read the command line and pass it back to
- command_loop for processing, the new command_line_handler function has
- the command line already available as its parameter. INPUT_HANDLER is
- to be set to the function that readline will invoke when a complete
- line of input is ready. CALL_READLINE is to be set to the function
- that readline offers as callback to the event_loop. */
-
-void (*input_handler) (char *);
-void (*call_readline) (gdb_client_data);
+/* Instead of invoking (and waiting for) readline to read the command
+ line and pass it back for processing, we use readline's alternate
+ interface, via callback functions, so that the event loop can react
+ to other event sources while we wait for input. */
/* Important variables for the event loop. */
@@ -217,10 +199,11 @@ static void
gdb_rl_callback_handler (char *rl)
{
struct gdb_exception gdb_rl_expt = exception_none;
+ struct ui *ui = current_ui;
TRY
{
- input_handler (rl);
+ ui->input_handler (rl);
}
CATCH (ex, RETURN_MASK_ALL)
{
@@ -261,6 +244,8 @@ cli_command_loop (void *data)
static void
change_line_handler (void)
{
+ struct ui *ui = current_ui;
+
/* NOTE: this operates on input_fd, not instream. If we are reading
commands from a file, instream will point to the file. However in
async mode, we always read commands from a file with editing
@@ -270,18 +255,18 @@ change_line_handler (void)
if (async_command_editing_p)
{
/* Turn on editing by using readline. */
- call_readline = gdb_rl_callback_read_char_wrapper;
- input_handler = command_line_handler;
+ ui->call_readline = gdb_rl_callback_read_char_wrapper;
+ ui->input_handler = command_line_handler;
}
else
{
/* Turn off editing by using gdb_readline_no_editing_callback. */
gdb_rl_callback_handler_remove ();
- call_readline = gdb_readline_no_editing_callback;
+ ui->call_readline = gdb_readline_no_editing_callback;
/* Set up the command handler as well, in case we are called as
first thing from .gdbinit. */
- input_handler = command_line_handler;
+ ui->input_handler = command_line_handler;
}
}
@@ -452,22 +437,16 @@ top_level_prompt (void)
return xstrdup (prompt);
}
-/* Get a pointer to the command line buffer. This is used to
+static struct ui current_ui_;
+struct ui *current_ui = &current_ui_;
+
+/* Get a pointer to the current UI's line buffer. This is used to
construct a whole line of input from partial input. */
static struct buffer *
get_command_line_buffer (void)
{
- static struct buffer line_buffer;
- static int line_buffer_initialized;
-
- if (!line_buffer_initialized)
- {
- buffer_init (&line_buffer);
- line_buffer_initialized = 1;
- }
-
- return &line_buffer;
+ return &current_ui->line_buffer;
}
/* When there is an event ready on the stdin file descriptor, instead
@@ -478,6 +457,8 @@ get_command_line_buffer (void)
void
stdin_event_handler (int error, gdb_client_data client_data)
{
+ struct ui *ui = current_ui;
+
if (error)
{
printf_unfiltered (_("error detected on stdin\n"));
@@ -499,7 +480,7 @@ stdin_event_handler (int error, gdb_client_data client_data)
do
{
call_stdin_event_handler_again_p = 0;
- (*call_readline) (client_data);
+ ui->call_readline (client_data);
} while (call_stdin_event_handler_again_p != 0);
}
}
@@ -756,6 +737,7 @@ gdb_readline_no_editing_callback (gdb_client_data client_data)
char *result;
struct buffer line_buffer;
static int done_once = 0;
+ struct ui *ui = current_ui;
buffer_init (&line_buffer);
@@ -795,7 +777,7 @@ gdb_readline_no_editing_callback (gdb_client_data client_data)
break;
}
xfree (buffer_finish (&line_buffer));
- (*input_handler) (0);
+ ui->input_handler (NULL);
return;
}
@@ -812,7 +794,7 @@ gdb_readline_no_editing_callback (gdb_client_data client_data)
buffer_grow_char (&line_buffer, '\0');
result = buffer_finish (&line_buffer);
- (*input_handler) (result);
+ ui->input_handler (result);
}
@@ -1198,6 +1180,8 @@ set_async_editing_command (char *args, int from_tty,
void
gdb_setup_readline (void)
{
+ struct ui *ui = current_ui;
+
/* This function is a noop for the sync case. The assumption is
that the sync setup is ALL done in gdb_init, and we would only
mess it up here. The sync stuff should really go away over
@@ -1220,19 +1204,19 @@ gdb_setup_readline (void)
/* When a character is detected on instream by select or poll,
readline will be invoked via this callback function. */
- call_readline = gdb_rl_callback_read_char_wrapper;
+ ui->call_readline = gdb_rl_callback_read_char_wrapper;
}
else
{
async_command_editing_p = 0;
- call_readline = gdb_readline_no_editing_callback;
+ ui->call_readline = gdb_readline_no_editing_callback;
}
/* When readline has read an end-of-line character, it passes the
complete line to gdb for processing; command_line_handler is the
function that does this. */
- input_handler = command_line_handler;
-
+ ui->input_handler = command_line_handler;
+
/* Tell readline to use the same input stream that gdb uses. */
rl_instream = instream;