This is the mail archive of the gdb-cvs@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]

[binutils-gdb] Fix for spurious prompts in secondary UIs


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a8836c9358a11055a08d11ecacc5d7c8f6d5e7a8

commit a8836c9358a11055a08d11ecacc5d7c8f6d5e7a8
Author: Pedro Alves <palves@redhat.com>
Date:   Tue Jun 21 01:11:52 2016 +0100

    Fix for spurious prompts in secondary UIs
    
    Running mi-break.exp with MI on a secondary UI reveals that MI emits
    spurious prompts compared MI running as primary UI:
    
       -exec-continue
       ^running
       *running,thread-id="all"
       (gdb)
       =breakpoint-modified,bkpt={number="9",type="breakpoint",disp="keep",enabled="y",func="callee2",line="39",script={"set $i=0","while $i<10","print $i","set $i=$i+1","end","continue"}}
       ~"\n"
       ~"Breakpoint 9, callee2 (intarg=2, strarg=0x400730 \"A string argument.\") at ...src/gdb/testsuite/gdb.mi/basics.c:39\n"
       ~"39\t  callee3 (strarg);\n"
       *stopped,reason="breakpoint-hit",disp="keep",bkptno="9",frame={addr="0x00000000004005dd",func="callee2",...
       *running,thread-id="all"
    >> (gdb)
       =breakpoint-modified,bkpt={number="9",...
       ~"\n"
       ~"Breakpoint 9, callee2 (intarg=2, strarg=0x400730 \"A string argument.\") at ...src/gdb/testsuite/gdb.mi/basics.c:39\n"
       ~"39\t  callee3 (strarg);\n"
       *stopped,reason="breakpoint-hit",disp="keep",bkptno="9",...
       *running,thread-id="all"
       ~"[Inferior 1 (process 12639) exited normally]\n"
       =thread-exited,id="1",group-id="i1"
       =thread-group-exited,id="i1",exit-code="0"
       *stopped,reason="exited-normally"
       FAIL: gdb.mi/mi-break.exp: intermediate stop and continue
       FAIL: gdb.mi/mi-break.exp: test hitting breakpoint with commands (timeout)
    
    Note the line marked >> above.
    
    The test sets a breakpoint that runs "continue", a foreground command.
    When we get to run the "continue", we've already emitted the *stopped
    event on the MI UI, and set its prompt state to PROMPT_NEEDED (this is
    done from within normal_stop).  Since inferior events are always
    handled with the main UI as current UI, breakpoint commands always run
    with the main UI as current UI too.  This means that the "continue"
    ends up always disabling the prompt on the main UI, instead of the UI
    that had just been done with synchronous execution.
    
    I think we'll want to extend this with a concept of "set of
    threads/inferiors a UI/interpreter is blocked waiting on", but I'm
    leaving that for a separate series.
    
    gdb/ChangeLog:
    2016-06-21  Pedro Alves  <palves@redhat.com>
    
    	* infcmd.c (prepare_execution_command): Use
    	all_uis_on_sync_execution_starting.
    	* infrun.c (all_uis_on_sync_execution_starting): New function.
    	* infrun.h (all_uis_on_sync_execution_starting): Declare.

Diff:
---
 gdb/ChangeLog |  7 +++++++
 gdb/infcmd.c  |  2 +-
 gdb/infrun.c  | 14 ++++++++++++++
 gdb/infrun.h  |  5 +++++
 4 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index edef298..bc681d9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
 2016-06-21  Pedro Alves  <palves@redhat.com>
 
+	* infcmd.c (prepare_execution_command): Use
+	all_uis_on_sync_execution_starting.
+	* infrun.c (all_uis_on_sync_execution_starting): New function.
+	* infrun.h (all_uis_on_sync_execution_starting): Declare.
+
+2016-06-21  Pedro Alves  <palves@redhat.com>
+
 	* annotate.c: Include top.h.
 	(async_background_execution_p): Delete.
 	(print_value_flags): Check the UI's prompt state rather then
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 5c3f212..e229d03 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -510,7 +510,7 @@ prepare_execution_command (struct target_ops *target, int background)
 	 simulate synchronous (fg) execution.  Note no cleanup is
 	 necessary for this.  stdin is re-enabled whenever an error
 	 reaches the top level.  */
-      async_disable_stdin ();
+      all_uis_on_sync_execution_starting ();
     }
 }
 
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 25313b4..06ec00f 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -3873,6 +3873,20 @@ all_uis_check_sync_execution_done (void)
     }
 }
 
+/* See infrun.h.  */
+
+void
+all_uis_on_sync_execution_starting (void)
+{
+  struct switch_thru_all_uis state;
+
+  SWITCH_THRU_ALL_UIS (state)
+    {
+      if (current_ui->prompt_state == PROMPT_NEEDED)
+	async_disable_stdin ();
+    }
+}
+
 /* A cleanup that restores the execution direction to the value saved
    in *ARG.  */
 
diff --git a/gdb/infrun.h b/gdb/infrun.h
index 01eff9a..39be375 100644
--- a/gdb/infrun.h
+++ b/gdb/infrun.h
@@ -238,4 +238,9 @@ extern void maybe_remove_breakpoints (void);
    ready for input).  */
 extern void all_uis_check_sync_execution_done (void);
 
+/* If a UI was in sync execution mode, and hasn't displayed the prompt
+   yet, re-disable its prompt (a synchronous execution command was
+   started or re-started).  */
+extern void all_uis_on_sync_execution_starting (void);
+
 #endif /* INFRUN_H */


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