From 694ec099d2fca9e7d47848e8a7fc40ea3aa47a32 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 21 Jun 2016 01:11:47 +0100 Subject: [PATCH] Make out and error streams be per UI stderr_fileopen () references stderr directly, which doesn't work when we have a separate UI with its own stderr-like stream. So this also adds a "errstream" to "struct ui", and plumbs stderr_fileopen to take a stream parameter. gdb/ChangeLog: 2016-06-21 Pedro Alves * event-top.c (gdb_setup_readline): Pass the UI's outstream and errstream to stdout_fileopen and stderr_fileopen. * exceptions.c: Include top.h. (print_flush): Open the current UI's outstream file descriptor, instead of hardcoding file descriptor 1. * main.c (captured_main): Save the main UI's out and error streams. Adjust stderr_fileopen call. * top.h (struct ui) : New fields. * ui-file.c (stderr_fileopen): Add stream parameter. Use it instead of stderr. * ui-file.h (stderr_fileopen): Add stream parameter and update comment. --- gdb/ChangeLog | 15 +++++++++++++++ gdb/event-top.c | 4 ++-- gdb/exceptions.c | 4 +++- gdb/main.c | 6 +++++- gdb/top.h | 4 ++++ gdb/ui-file.c | 4 ++-- gdb/ui-file.h | 4 ++-- 7 files changed, 33 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 680e6e5..3edb6dc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,20 @@ 2016-06-21 Pedro Alves + * event-top.c (gdb_setup_readline): Pass the UI's outstream and + errstream to stdout_fileopen and stderr_fileopen. + * exceptions.c: Include top.h. + (print_flush): Open the current UI's outstream file descriptor, + instead of hardcoding file descriptor 1. + * main.c (captured_main): Save the main UI's out and error + streams. Adjust stderr_fileopen call. + * top.h (struct ui) : New fields. + * ui-file.c (stderr_fileopen): Add stream parameter. Use it + instead of stderr. + * ui-file.h (stderr_fileopen): Add stream parameter and update + comment. + +2016-06-21 Pedro Alves + * 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. diff --git a/gdb/event-top.c b/gdb/event-top.c index 1d36b81..08eb89d 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -1237,8 +1237,8 @@ gdb_setup_readline (void) mess it up here. The sync stuff should really go away over time. */ if (!batch_silent) - gdb_stdout = stdio_fileopen (stdout); - gdb_stderr = stderr_fileopen (); + gdb_stdout = stdio_fileopen (ui->outstream); + gdb_stderr = stderr_fileopen (ui->errstream); gdb_stdlog = gdb_stderr; /* for moment */ gdb_stdtarg = gdb_stderr; /* for moment */ gdb_stdtargerr = gdb_stderr; /* for moment */ diff --git a/gdb/exceptions.c b/gdb/exceptions.c index 0e60050..9a10f66 100644 --- a/gdb/exceptions.c +++ b/gdb/exceptions.c @@ -26,10 +26,12 @@ #include "ui-out.h" #include "serial.h" #include "gdbthread.h" +#include "top.h" static void print_flush (void) { + struct ui *ui = current_ui; struct serial *gdb_stdout_serial; struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); @@ -56,7 +58,7 @@ print_flush (void) gdb_flush (gdb_stderr); /* 3. The system-level buffer. */ - gdb_stdout_serial = serial_fdopen (1); + gdb_stdout_serial = serial_fdopen (fileno (ui->outstream)); if (gdb_stdout_serial) { serial_drain_output (gdb_stdout_serial); diff --git a/gdb/main.c b/gdb/main.c index 87bf05a..dd700df 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -507,7 +507,11 @@ captured_main (void *data) ndir = 0; saved_command_line = (char *) xstrdup (""); + ui->instream = stdin; + ui->outstream = stdout; + ui->errstream = stderr; + ui->input_fd = fileno (stdin); #ifdef __MINGW32__ @@ -517,7 +521,7 @@ captured_main (void *data) #endif gdb_stdout = stdio_fileopen (stdout); - gdb_stderr = stderr_fileopen (); + gdb_stderr = stderr_fileopen (stderr); gdb_stdlog = gdb_stderr; /* for moment */ gdb_stdtarg = gdb_stderr; /* for moment */ diff --git a/gdb/top.h b/gdb/top.h index 8990277..e544514 100644 --- a/gdb/top.h +++ b/gdb/top.h @@ -73,6 +73,10 @@ struct ui Set to NULL if we are executing a user-defined command or interacting via a GUI. */ FILE *instream; + /* Standard output stream. */ + FILE *outstream; + /* Standard error stream. */ + FILE *errstream; /* The file descriptor for the input stream, so that we can register it with the event loop. */ diff --git a/gdb/ui-file.c b/gdb/ui-file.c index 4260710..a977f89 100644 --- a/gdb/ui-file.c +++ b/gdb/ui-file.c @@ -681,9 +681,9 @@ stderr_file_fputs (const char *linebuffer, struct ui_file *file) #endif struct ui_file * -stderr_fileopen (void) +stderr_fileopen (FILE *stream) { - struct ui_file *ui_file = stdio_fileopen (stderr); + struct ui_file *ui_file = stdio_fileopen (stream); #ifdef __MINGW32__ /* There is no real line-buffering on Windows, see diff --git a/gdb/ui-file.h b/gdb/ui-file.h index a6ec135..f6df572 100644 --- a/gdb/ui-file.h +++ b/gdb/ui-file.h @@ -135,8 +135,8 @@ extern struct ui_file *mem_fileopen (void); /* Open/create a STDIO based UI_FILE using the already open FILE. */ extern struct ui_file *stdio_fileopen (FILE *file); -/* Create a ui_file from stderr. */ -extern struct ui_file *stderr_fileopen (void); +/* Likewise, for stderr-like streams. */ +extern struct ui_file *stderr_fileopen (FILE *file); /* Open NAME returning an STDIO based UI_FILE. */ -- 2.7.4