From patchwork Mon Mar 21 15:21:12 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 11430 Received: (qmail 93960 invoked by alias); 21 Mar 2016 15:21:54 -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 93897 invoked by uid 89); 21 Mar 2016 15:21:53 -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=566, 1608, Ensure, 569 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:21:40 +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 CA192A3B5F for ; Mon, 21 Mar 2016 15:21:38 +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 u2LFLGPo019569 for ; Mon, 21 Mar 2016 11:21:38 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH v2 22/25] Make main_ui be heap allocated Date: Mon, 21 Mar 2016 15:21:12 +0000 Message-Id: <1458573675-15478-23-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> This is preparation for being able to create more than one UI object. The change to gdb_main to stop using catch_errors is necessary because catch_errors references current_uiout, which expands to current_ui->m_current_ui, which would crash because current_ui is not initialized yet at that point. It didn't trigger earlier in the series because before this patch, main_ui/current_ui always start out non-NULL. --- gdb/event-top.c | 7 +++---- gdb/main.c | 27 ++++++++++++--------------- gdb/top.c | 37 +++++++++++++++++++++++++++++++++++++ gdb/top.h | 5 +++++ 4 files changed, 57 insertions(+), 19 deletions(-) diff --git a/gdb/event-top.c b/gdb/event-top.c index 436edf7..69f6be7 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -362,11 +362,10 @@ top_level_prompt (void) return xstrdup (prompt); } -static struct ui main_ui_; -struct ui *main_ui = &main_ui_; -struct ui *current_ui = &main_ui_; -struct ui *ui_list = &main_ui_; +struct ui *main_ui; +struct ui *current_ui; +struct ui *ui_list; void restore_ui_cleanup (void *data) diff --git a/gdb/main.c b/gdb/main.c index e107f60..95578e4 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -441,7 +441,6 @@ 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; @@ -513,26 +512,15 @@ 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); - - ui->prompt_state = PROMPT_NEEDED; - #ifdef __MINGW32__ /* Ensure stderr is unbuffered. A Cygwin pty or pipe is implemented as a Windows pipe, and Windows buffers on pipes. */ setvbuf (stderr, NULL, _IONBF, BUFSIZ); #endif - gdb_stdout = stdio_fileopen (stdout); - gdb_stderr = stderr_fileopen (stderr); + main_ui = new_ui (stdin, stdout, stderr); + current_ui = main_ui; - gdb_stdlog = gdb_stderr; /* for moment */ - gdb_stdtarg = gdb_stderr; /* for moment */ - gdb_stdin = stdio_fileopen (stdin); gdb_stdtargerr = gdb_stderr; /* for moment */ gdb_stdtargin = gdb_stdin; /* for moment */ @@ -1173,7 +1161,16 @@ captured_main (void *data) int gdb_main (struct captured_main_args *args) { - catch_errors (captured_main, args, "", RETURN_MASK_ALL); + TRY + { + captured_main (args); + } + CATCH (ex, RETURN_MASK_ALL) + { + exception_print (gdb_stderr, ex); + } + END_CATCH + /* The only way to end up here is by an error (normal exit is handled by quit_force()), hence always return an error status. */ return 1; diff --git a/gdb/top.c b/gdb/top.c index 2941dbd..12064bc 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -245,6 +245,43 @@ void (*deprecated_call_command_hook) (struct cmd_list_element * c, void (*deprecated_context_hook) (int id); +static int highest_ui_num; + +struct ui * +new_ui (FILE *instream, FILE *outstream, FILE *errstream) +{ + struct ui *ui; + + ui = XCNEW (struct ui); + + ui->num = ++highest_ui_num; + ui->instream = instream; + ui->outstream = outstream; + ui->errstream = errstream; + + ui->input_fd = fileno (ui->instream); + + ui->m_gdb_stdin = stdio_fileopen (ui->instream); + ui->m_gdb_stdout = stdio_fileopen (ui->outstream); + ui->m_gdb_stderr = stderr_fileopen (ui->errstream); + ui->m_gdb_stdlog = ui->m_gdb_stderr; + + ui->prompt_state = PROMPT_NEEDED; + + if (ui_list == NULL) + ui_list = ui; + else + { + struct ui *last; + + for (last = ui_list; last->next != NULL; last = last->next) + ; + last->next = ui; + } + + return ui; +} + /* Handler for SIGHUP. */ #ifdef SIGHUP diff --git a/gdb/top.h b/gdb/top.h index 29deb3f..df76204 100644 --- a/gdb/top.h +++ b/gdb/top.h @@ -56,6 +56,9 @@ struct ui { struct ui *next; + /* Convenient handle (UI number). Unique across all UIs. */ + int num; + /* The UI's command line buffer. This is to used to accumulate input until we have a whole command line. */ struct buffer line_buffer; @@ -157,6 +160,8 @@ extern void switch_thru_all_uis_next (struct switch_thru_all_uis *state); #define ALL_UIS(UI) \ for (UI = ui_list; UI; UI = UI->next) \ +extern struct ui *new_ui (FILE *instream, FILE *outstream, FILE *errstream); + extern void restore_ui_cleanup (void *data); /* From top.c. */