From patchwork Mon Mar 21 15:20:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 11436 Received: (qmail 123050 invoked by alias); 21 Mar 2016 15:27:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 123030 invoked by uid 89); 21 Mar 2016 15:27:51 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=59, 7, 597, systemlevel, system-level X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Mon, 21 Mar 2016 15:27:47 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 39264711CB for ; Mon, 21 Mar 2016 15:21:27 +0000 (UTC) Received: from cascais.lan (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u2LFLGPb019569 for ; Mon, 21 Mar 2016 11:21:26 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH v2 09/25] Make outstream be per UI Date: Mon, 21 Mar 2016 15:20:59 +0000 Message-Id: <1458573675-15478-10-git-send-email-palves@redhat.com> In-Reply-To: <1458573675-15478-1-git-send-email-palves@redhat.com> References: <1458573675-15478-1-git-send-email-palves@redhat.com> 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/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 ++-- 6 files changed, 18 insertions(+), 8 deletions(-) diff --git a/gdb/event-top.c b/gdb/event-top.c index c7dba5a..ea1e32e 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -1011,8 +1011,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 8ba86fc..3e5d870 100644 --- a/gdb/exceptions.c +++ b/gdb/exceptions.c @@ -26,6 +26,7 @@ #include "ui-out.h" #include "serial.h" #include "gdbthread.h" +#include "top.h" void prepare_to_throw_exception (void) @@ -37,6 +38,7 @@ prepare_to_throw_exception (void) static void print_flush (void) { + struct ui *ui = current_ui; struct serial *gdb_stdout_serial; if (deprecated_error_begin_hook) @@ -59,7 +61,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 eee9a8b..d070b4d 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -506,7 +506,11 @@ captured_main (void *data) clear_quit_flag (); saved_command_line = (char *) xstrdup (""); + ui->instream = stdin; + ui->outstream = stdout; + ui->errstream = stderr; + ui->input_fd = fileno (stdin); #ifdef __MINGW32__ @@ -516,7 +520,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 beeb723..2c4c9f1 100644 --- a/gdb/top.h +++ b/gdb/top.h @@ -72,6 +72,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 c86994d..d72e161 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. */