From: Pedro Alves <palves@redhat.com>
To: Tom Tromey <tromey@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH 2/4] Suppress repeated annotations until GDB is ready to accept input.
Date: Mon, 26 Nov 2012 18:28:00 -0000 [thread overview]
Message-ID: <50B3B4BC.2010108@redhat.com> (raw)
In-Reply-To: <87vccsics1.fsf@fleche.redhat.com>
On 11/26/2012 03:50 PM, Tom Tromey wrote:
>>>>>> "Pedro" == Pedro Alves <palves@redhat.com> 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 <palves@redhat.com>
* 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"
\f
/* 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 (("-"));
}
\f
+
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 ();
next prev parent reply other threads:[~2012-11-26 18:28 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <50ACF672.7060607@redhat.com>
2012-11-21 20:14 ` [PATCH 0/4] Misc annotations changes Pedro Alves
2012-11-21 20:14 ` [PATCH 4/4] Skip breakpoints-invalid annotations for internal|momentary breakpoints Pedro Alves
2012-11-21 20:14 ` [PATCH 3/4] Fully move the breakpoints-invalid annotation to observers Pedro Alves
2012-11-26 15:23 ` Tom Tromey
2012-11-21 20:14 ` [PATCH 1/4] Remove (alleged) "breakpoints-changed" annotation suppression on ignore count changes Pedro Alves
2012-11-21 20:14 ` [PATCH 2/4] Suppress repeated annotations until GDB is ready to accept input Pedro Alves
2012-11-26 15:50 ` Tom Tromey
2012-11-26 18:28 ` Pedro Alves [this message]
2012-11-27 18:48 ` Tom Tromey
2012-11-27 23:53 ` Pedro Alves
2013-01-22 19:59 ` Pedro Alves
2012-11-27 18:56 ` Eli Zaretskii
2012-11-26 15:42 ` [PATCH 0/4] Misc annotations changes Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50B3B4BC.2010108@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=tromey@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox