This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 2/4] Suppress repeated annotations until GDB is ready to accept input.


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"
 

 /* 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 ();



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]