From patchwork Mon Mar 21 15:21:15 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 11444 Received: (qmail 1620 invoked by alias); 21 Mar 2016 15:30:10 -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 1591 invoked by uid 89); 21 Mar 2016 15:30:09 -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= 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:30:03 +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 50D6290251 for ; Mon, 21 Mar 2016 15:21:41 +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 u2LFLGPr019569 for ; Mon, 21 Mar 2016 11:21:40 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH v2 25/25] Add command to list UIs Date: Mon, 21 Mar 2016 15:21:15 +0000 Message-Id: <1458573675-15478-26-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> Mainly a convenience at this point: $ gdb -q -ex "new-ui mi /dev/pts/7" (...) New UI allocated (gdb) info uis Num Interpreter TTY * 1 tui 2 mi /dev/pts/7 (gdb) --- gdb/interps.c | 20 +++++++++++++++----- gdb/interps.h | 1 + gdb/top.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/top.h | 3 +++ 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/gdb/interps.c b/gdb/interps.c index c9de292..c211587 100644 --- a/gdb/interps.c +++ b/gdb/interps.c @@ -54,15 +54,19 @@ struct ui_interp_info }; static struct ui_interp_info * -get_current_interp_info (void) +get_ui_interp_info (struct ui *ui) { - struct ui *ui = current_ui; - if (ui->interp_info == NULL) ui->interp_info = XCNEW (struct ui_interp_info); return ui->interp_info; } +static struct ui_interp_info * +get_current_interp_info (void) +{ + return get_ui_interp_info (current_ui); +} + struct interp { /* This is the name in "-i=" and set interpreter. */ @@ -577,13 +581,19 @@ interpreter_completer (struct cmd_list_element *ignore, } struct interp * -top_level_interpreter (void) +ui_top_level_interpreter (struct ui *ui) { - struct ui_interp_info *ui_interp = get_current_interp_info (); + struct ui_interp_info *ui_interp = get_ui_interp_info (ui); return ui_interp->top_level_interpreter_ptr; } +struct interp * +top_level_interpreter (void) +{ + return ui_top_level_interpreter (current_ui); +} + void * top_level_interpreter_data (void) { diff --git a/gdb/interps.h b/gdb/interps.h index 3f9f010..e752cdd 100644 --- a/gdb/interps.h +++ b/gdb/interps.h @@ -107,6 +107,7 @@ extern int current_interp_set_logging (int start_log, struct ui_file *out, /* Returns opaque data associated with the top-level interpreter. */ extern void *top_level_interpreter_data (void); extern struct interp *top_level_interpreter (void); +extern struct interp *ui_top_level_interpreter (struct ui *ui); extern struct interp *command_interp (void); diff --git a/gdb/top.c b/gdb/top.c index d74af46..b05efc6 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -368,6 +368,7 @@ new_ui_command (char *args, int from_tty) initialize_stdin_serial (ui); ui->async = 1; + ui->tty_name = xstrdup (tty_name); make_cleanup (restore_ui_cleanup, current_ui); current_ui = ui; @@ -382,6 +383,56 @@ new_ui_command (char *args, int from_tty) printf_unfiltered ("New UI allocated\n"); } +/* "info ui" command. */ + +static void +info_uis_command (char *args, int from_tty) +{ + struct inferior *inf; + struct cleanup *old_chain; + int count = 0; + struct ui *ui = current_ui; + struct ui_out *uiout = current_uiout; + + for (ui = ui_list; ui != NULL; ui = ui->next) + count++; + + gdb_assert (count != 0); + + old_chain = make_cleanup_ui_out_table_begin_end (uiout, 4, count, "UIs"); + ui_out_table_header (uiout, 1, ui_left, "current", ""); + ui_out_table_header (uiout, 4, ui_left, "number", "Num"); + ui_out_table_header (uiout, 11, ui_left, "interp", "Interpreter"); + ui_out_table_header (uiout, 17, ui_left, "tty", "TTY"); + + ui_out_table_body (uiout); + for (ui = ui_list; ui != NULL; ui = ui->next) + { + struct cleanup *chain2; + + chain2 = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); + + if (ui == current_ui) + ui_out_field_string (uiout, "current", "*"); + else + ui_out_field_skip (uiout, "current"); + + ui_out_field_int (uiout, "number", ui->num); + + ui_out_field_string (uiout, "interp", + interp_name (ui_top_level_interpreter (ui))); + if (ui->tty_name != NULL) + ui_out_field_string (uiout, "tty", ui->tty_name); + else + ui_out_field_skip (uiout, "tty"); + + ui_out_text (uiout, "\n"); + do_cleanups (chain2); + } + + do_cleanups (old_chain); +} + /* Handler for SIGHUP. */ #ifdef SIGHUP @@ -2078,6 +2129,9 @@ Create a new UI. It takes two arguments:\n\ The first argument is the name of the interpreter to run.\n\ The second argument is the terminal the UI runs on.\n"), &cmdlist); set_cmd_completer (c, interpreter_completer); + + add_info ("uis", info_uis_command, + _("IDs of specified UIs (all interfaces if no argument).")); } void diff --git a/gdb/top.h b/gdb/top.h index bac5a33..81ef466 100644 --- a/gdb/top.h +++ b/gdb/top.h @@ -59,6 +59,9 @@ struct ui /* Convenient handle (UI number). Unique across all UIs. */ int num; + /* The TTY as passed to the "new-ui" command. */ + const char *tty_name; + /* The UI's command line buffer. This is to used to accumulate input until we have a whole command line. */ struct buffer line_buffer;