From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17317 invoked by alias); 26 Nov 2012 18:28:29 -0000 Received: (qmail 17296 invoked by uid 22791); 26 Nov 2012 18:28:27 -0000 X-SWARE-Spam-Status: No, hits=-7.8 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 26 Nov 2012 18:28:16 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id qAQISFkD028944 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 26 Nov 2012 13:28:15 -0500 Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id qAQISDc6018970; Mon, 26 Nov 2012 13:28:14 -0500 Message-ID: <50B3B4BC.2010108@redhat.com> Date: Mon, 26 Nov 2012 18:28:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Tom Tromey CC: gdb-patches@sourceware.org Subject: Re: [PATCH 2/4] Suppress repeated annotations until GDB is ready to accept input. References: <20121121201416.1015.36832.stgit@brno.lan> <20121121201429.1015.6037.stgit@brno.lan> <87vccsics1.fsf@fleche.redhat.com> In-Reply-To: <87vccsics1.fsf@fleche.redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-11/txt/msg00678.txt.bz2 On 11/26/2012 03:50 PM, Tom Tromey wrote: >>>>>> "Pedro" == Pedro Alves writes: > > Pedro> Non-stop or async would complicate this, but no frontend will be > Pedro> using annotations in those modes (one of goes of emacs switching > Pedro> to MI was non-stop mode support, AFAIK). > > I've used these modes in Emacs (using M-x gud-gdb) before, and it has > worked ok-enough. Can you say if these patches make it noticeably > worse, or will it be pretty much like it was before? Hmm. There's potential for making it worse. The patch suppresses duplicate annotations until the next prompt is displayed. With background commands, events can be reported without re-displaying a prompt [*]. In that case, emacs might miss annotations. With this version, we don't do annotation suppression if a background command is in progress. This means that define twobreaks > b foo > b bar >end twobreaks triggers two annotations in async mode if the target is not running, or isn't running the foreground, while always just one in sync mode. I don't think that's a real problem. If it turns out more complicated than this, I can just drop this one. This is most useful for the case of forcing single-stepping for everything (even "continue"). The same as installing a software watchpoint, but without the software watchpoint. That triggers a huge number of -frames-invalid annotations. I could work around that in the tests themselves. The repeated breakpoints-invalid annotations for sss breakpoints go away with patch 4. [*] - though that could itself be considered a bug, the CLI output is less than ideal here. We should be able to keep the bottom line reserved for the prompt, and scroll the rest of the output without visually interfering with the prompt line. E.g., we could be able to unwind the cursor to column 0, print whatever while handling the event, and then redisplay the prompt as it was, without the user noticing. Or perhaps there's cleaner ways even. Is there any way to force emacs 24 to do full annotations? It actually hadn't realized that "--fullname" was annotate=1, not 2, so my previous emacs testing was useless, as these notifications only happen with annotate=2... -- Pedro Alves 2012-11-26 Pedro Alves * annotate.c: Include "inferior.h". (frames_invalid_emitted) (breakpoints_invalid_emitted): New globals. (async_background_execution_p): New function. (annotate_breakpoints_changed, annotate_frames_invalid): Skip emitting the annotation if it has already been emitted. (annotate_display_prompt): New function. * annotate.h (annotate_display_prompt): New declaration. * event-top.c: Include annotate.h. (display_gdb_prompt): Call annotate_display_prompt. --- gdb/annotate.c | 40 ++++++++++++++++++++++++++++++++++++++-- gdb/annotate.h | 2 ++ gdb/event-top.c | 3 +++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/gdb/annotate.c b/gdb/annotate.c index a222736..a3b70da 100644 --- a/gdb/annotate.c +++ b/gdb/annotate.c @@ -24,6 +24,7 @@ #include "gdbtypes.h" #include "breakpoint.h" #include "observer.h" +#include "inferior.h" /* Prototypes for local functions. */ @@ -38,6 +39,23 @@ static void breakpoint_changed (struct breakpoint *b); void (*deprecated_annotate_signalled_hook) (void); void (*deprecated_annotate_signal_hook) (void); +/* Booleans indicating whether we've emitted certain notifications. + Used to suppress useless repeated notifications until the next time + we're ready to accept more commands. Reset whenever a prompt is + displayed. */ +static int frames_invalid_emitted; +static int breakpoints_invalid_emitted; + +/* True if the target can async, and a synchronous execution command + is not in progress. If true, input is accepted, so don't suppress + annotations. */ + +static int +async_background_execution_p (void) +{ + return (target_can_async_p () && !sync_execution); +} + static void print_value_flags (struct type *t) { @@ -47,13 +65,17 @@ print_value_flags (struct type *t) printf_filtered (("-")); } + void annotate_breakpoints_changed (void) { - if (annotation_level == 2) + if (annotation_level == 2 + && (!breakpoints_invalid_emitted + || async_background_execution_p ())) { target_terminal_ours (); printf_unfiltered (("\n\032\032breakpoints-invalid\n")); + breakpoints_invalid_emitted = 1; } } @@ -185,10 +207,13 @@ annotate_breakpoints_table_end (void) void annotate_frames_invalid (void) { - if (annotation_level == 2) + if (annotation_level == 2 + && (!frames_invalid_emitted + || async_background_execution_p ())) { target_terminal_ours (); printf_unfiltered (("\n\032\032frames-invalid\n")); + frames_invalid_emitted = 1; } } @@ -538,6 +563,17 @@ annotate_array_section_end (void) printf_filtered (("\n\032\032array-section-end\n")); } +/* Called when GDB is about to display the prompt. Used to reset + annotation suppression whenever we're ready to accept new + frontend/user commands. */ + +void +annotate_display_prompt (void) +{ + frames_invalid_emitted = 0; + breakpoints_invalid_emitted = 0; +} + static void breakpoint_changed (struct breakpoint *b) { diff --git a/gdb/annotate.h b/gdb/annotate.h index 443d892..15064b1 100644 --- a/gdb/annotate.h +++ b/gdb/annotate.h @@ -45,6 +45,8 @@ extern void annotate_frames_invalid (void); extern void annotate_new_thread (void); extern void annotate_thread_changed (void); +extern void annotate_display_prompt (void); + struct type; extern void annotate_field_begin (struct type *); diff --git a/gdb/event-top.c b/gdb/event-top.c index 5c533e4..2f0bbf7 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -36,6 +36,7 @@ #include "observer.h" #include "continuations.h" #include "gdbcmd.h" /* for dont_repeat() */ +#include "annotate.h" /* readline include files. */ #include "readline/readline.h" @@ -232,6 +233,8 @@ display_gdb_prompt (char *new_prompt) char *actual_gdb_prompt = NULL; struct cleanup *old_chain; + annotate_display_prompt (); + /* Reset the nesting depth used when trace-commands is set. */ reset_command_nest_depth ();