Fix for spurious prompts in secondary UIs
authorPedro Alves <palves@redhat.com>
Tue, 21 Jun 2016 00:11:52 +0000 (01:11 +0100)
committerPedro Alves <palves@redhat.com>
Tue, 21 Jun 2016 00:11:52 +0000 (01:11 +0100)
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.

gdb/ChangeLog
gdb/infcmd.c
gdb/infrun.c
gdb/infrun.h

index edef298a6d4da8bb4b0086709a11761c6fb18f45..bc681d9d01f12748761ea16d1c27fab330d5d563 100644 (file)
@@ -1,3 +1,10 @@
+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.
index 5c3f212bfe51b57b872405997cc3df65f0e2d15b..e229d03d9ffd3a670e42c13ad96427d920e6bff3 100644 (file)
@@ -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 ();
     }
 }
 
index 25313b476a9f20df7b36daa1b4efcfe0f8130e55..06ec00fce3af5d12c1950635598f4b7236528090 100644 (file)
@@ -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.  */
 
index 01eff9a1dbd082c5da663eca61dcb923b23b7df0..39be375fbe90e7a8bd4702150ec0bb6cedf1550d 100644 (file)
@@ -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 */