enable target async by default; separate MI and target notions of async
authorPedro Alves <palves@redhat.com>
Thu, 29 May 2014 18:58:57 +0000 (19:58 +0100)
committerPedro Alves <palves@redhat.com>
Thu, 29 May 2014 13:38:02 +0000 (14:38 +0100)
This finally makes background execution commands possible by default.

However, in order to do that, there's one last thing we need to do --
we need to separate the MI and target notions of "async".  Unlike the
CLI, where the user explicitly requests foreground vs background
execution in the execution command itself (c vs c&), MI chose to treat
"set target-async" specially -- setting it changes the default
behavior of execution commands.

So, we can't simply "set target-async" default to on, as that would
affect MI frontends.  Instead we have to make the setting MI-specific,
and teach MI about sync commands on top of an async target.

Because the "target" word in "set target-async" ends up as a potential
source of confusion, the patch adds a "set mi-async" option, and makes
"set target-async" a deprecated alias.

Rather than make the targets always async, this patch introduces a new
"maint set target-async" option so that the GDB developer can control
whether the target is async.  This makes it simpler to debug issues
arising only in the synchronous mode; important because sync mode
seems unlikely to go away.

Unlike in previous revisions, "set target-async" does not affect this
new maint parameter.  The rationale for this is that then one can
easily run the test suite in the "maint set target-async off" mode and
have tests that enable mi-async fail just like they fail on
non-async-capable targets.  This emulation is exactly the point of the
maint option.

I had asked Tom in a previous iteration to split the actual change of
the target async default to a separate patch, but it turns out that
that is quite awkward in this version of the patch, because with MI
async and target async decoupled (unlike in previous versions), if we
don't flip the default at the same time, then just "set target-async
on" alone never actually manages to do anything.  It's best to not
have that transitory state in the tree.

Given "set target-async on" now only has effect for MI, the patch goes
through the testsuite removing it from non-MI tests.  MI tests are
adjusted to use the new and less confusing "mi-async" spelling.

2014-05-29  Pedro Alves  <palves@redhat.com>
    Tom Tromey  <tromey@redhat.com>

* NEWS: Mention "maint set target-async", "set mi-async", and that
background execution commands are now always available.
* target.h (target_async_permitted): Update comment.
* target.c (target_async_permitted, target_async_permitted_1):
Default to 1.
(set_target_async_command): Rename to ...
(maint_set_target_async_command): ... this.
(show_target_async_command): Rename to ...
(maint_show_target_async_command): ... this.
(_initialize_target): Adjust.
* infcmd.c (prepare_execution_command): Make extern.
* inferior.h (prepare_execution_command): Declare.
* infrun.c (set_observer_mode): Leave target async alone.
* mi/mi-interp.c (mi_interpreter_init): Install
mi_on_sync_execution_done as sync_execution_done observer.
(mi_on_sync_execution_done): New function.
(mi_execute_command_input_handler): Don't print the prompt if we
just started a synchronous command with an async target.
(mi_on_resume): Check sync_execution before printing prompt.
* mi/mi-main.h (mi_async_p): Declare.
* mi/mi-main.c: Include gdbcmd.h.
(mi_async_p): New function.
(mi_async, mi_async_1): New globals.
(set_mi_async_command, show_mi_async_command, mi_async): New
functions.
(exec_continue): Call prepare_execution_command.
(run_one_inferior, mi_cmd_exec_run, mi_cmd_list_target_features)
(mi_execute_async_cli_command): Use mi_async_p.
(_initialize_mi_main): Install "set mi-async".  Make
"target-async" a deprecated alias.

2014-05-29  Pedro Alves  <palves@redhat.com>
    Tom Tromey  <tromey@redhat.com>

* gdb.texinfo (Non-Stop Mode): Remove "set target-async 1"
from example.
(Asynchronous and non-stop modes): Document '-gdb-set mi-async'.
Mention that target-async is now deprecated.
(Maintenance Commands): Document maint set/show target-async.

2014-05-29  Pedro Alves  <palves@redhat.com>
    Tom Tromey  <tromey@redhat.com>

* gdb.base/async-shell.exp: Don't enable target-async.
* gdb.base/async.exp
* gdb.base/corefile.exp (corefile_test_attach): Remove 'async'
parameter.  Adjust.
(top level): Don't test with "target-async".
* gdb.base/dprintf-non-stop.exp: Don't enable target-async.
* gdb.base/gdb-sigterm.exp: Don't test with "target-async".
* gdb.base/inferior-died.exp: Don't enable target-async.
* gdb.base/interrupt-noterm.exp: Likewise.
* gdb.mi/mi-async.exp: Use "mi-async" instead of "target-async".
* gdb.mi/mi-nonstop-exit.exp: Likewise.
* gdb.mi/mi-nonstop.exp: Likewise.
* gdb.mi/mi-ns-stale-regcache.exp: Likewise.
* gdb.mi/mi-nsintrall.exp: Likewise.
* gdb.mi/mi-nsmoribund.exp: Likewise.
* gdb.mi/mi-nsthrexec.exp: Likewise.
* gdb.mi/mi-watch-nonstop.exp: Likewise.
* gdb.multi/watchpoint-multi.exp: Adjust comment.
* gdb.python/py-evsignal.exp: Don't enable target-async.
* gdb.python/py-evthreads.exp: Likewise.
* gdb.python/py-prompt.exp: Likewise.
* gdb.reverse/break-precsave.exp: Don't test with "target-async".
* gdb.server/solib-list.exp: Don't enable target-async.
* gdb.threads/thread-specific-bp.exp: Likewise.
* lib/mi-support.exp: Adjust to use mi-async.

36 files changed:
gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/infcmd.c
gdb/inferior.h
gdb/infrun.c
gdb/mi/mi-interp.c
gdb/mi/mi-main.c
gdb/mi/mi-main.h
gdb/target.c
gdb/target.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/async-shell.exp
gdb/testsuite/gdb.base/async.exp
gdb/testsuite/gdb.base/corefile.exp
gdb/testsuite/gdb.base/dprintf-non-stop.exp
gdb/testsuite/gdb.base/gdb-sigterm.exp
gdb/testsuite/gdb.base/inferior-died.exp
gdb/testsuite/gdb.base/interrupt-noterm.exp
gdb/testsuite/gdb.mi/mi-async.exp
gdb/testsuite/gdb.mi/mi-nonstop-exit.exp
gdb/testsuite/gdb.mi/mi-nonstop.exp
gdb/testsuite/gdb.mi/mi-ns-stale-regcache.exp
gdb/testsuite/gdb.mi/mi-nsintrall.exp
gdb/testsuite/gdb.mi/mi-nsmoribund.exp
gdb/testsuite/gdb.mi/mi-nsthrexec.exp
gdb/testsuite/gdb.mi/mi-watch-nonstop.exp
gdb/testsuite/gdb.multi/watchpoint-multi.exp
gdb/testsuite/gdb.python/py-evsignal.exp
gdb/testsuite/gdb.python/py-evthreads.exp
gdb/testsuite/gdb.python/py-prompt.exp
gdb/testsuite/gdb.reverse/break-precsave.exp
gdb/testsuite/gdb.server/solib-list.exp
gdb/testsuite/gdb.threads/thread-specific-bp.exp
gdb/testsuite/lib/mi-support.exp

index f270c618d1b45a0e82c70cae7ed0f1cd4a2ab747..341698b4805fd27a95e269aba9cb7f61a2ed183c 100644 (file)
@@ -1,3 +1,37 @@
+2014-05-29  Pedro Alves  <palves@redhat.com>
+           Tom Tromey  <tromey@redhat.com>
+
+       * NEWS: Mention "maint set target-async", "set mi-async", and that
+       background execution commands are now always available.
+       * target.h (target_async_permitted): Update comment.
+       * target.c (target_async_permitted, target_async_permitted_1):
+       Default to 1.
+       (set_target_async_command): Rename to ...
+       (maint_set_target_async_command): ... this.
+       (show_target_async_command): Rename to ...
+       (maint_show_target_async_command): ... this.
+       (_initialize_target): Adjust.
+       * infcmd.c (prepare_execution_command): Make extern.
+       * inferior.h (prepare_execution_command): Declare.
+       * infrun.c (set_observer_mode): Leave target async alone.
+       * mi/mi-interp.c (mi_interpreter_init): Install
+       mi_on_sync_execution_done as sync_execution_done observer.
+       (mi_on_sync_execution_done): New function.
+       (mi_execute_command_input_handler): Don't print the prompt if we
+       just started a synchronous command with an async target.
+       (mi_on_resume): Check sync_execution before printing prompt.
+       * mi/mi-main.h (mi_async_p): Declare.
+       * mi/mi-main.c: Include gdbcmd.h.
+       (mi_async_p): New function.
+       (mi_async, mi_async_1): New globals.
+       (set_mi_async_command, show_mi_async_command, mi_async): New
+       functions.
+       (exec_continue): Call prepare_execution_command.
+       (run_one_inferior, mi_cmd_exec_run, mi_cmd_list_target_features)
+       (mi_execute_async_cli_command): Use mi_async_p.
+       (_initialize_mi_main): Install "set mi-async".  Make
+       "target-async" a deprecated alias.
+
 2014-05-29  Pedro Alves  <palves@redhat.com>
 
        * cli/cli-interp.c (cli_interpreter_display_prompt_p): Delete.
index 6683bc0e969d0a0a8d68c32f68919f4a85d5c8a0..8b57bd9ad619d52169ecf65f69da3dd8dea17279 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -71,6 +71,26 @@ set record btrace replay-memory-access (read-only|read-write)
 show record btrace replay-memory-access
   Control what memory accesses are allowed during replay.
 
+maint set target-async (on|off)
+maint show target-async
+  This controls whether GDB targets operate in syncronous or
+  asyncronous mode.  Normally the default is asyncronous, if it is
+  available; but this can be changed to more easily debug problems
+  occurring only in syncronous mode.
+
+set mi-async (on|off)
+show mi-async
+  Control whether MI asynchronous mode is preferred.  This supersedes
+  "set target-async" of previous GDB versions.
+
+* "set target-async" is deprecated as a CLI option and is now an alias
+  for "set mi-async" (only puts MI into async mode).
+
+* Background execution commands (e.g., "c&", "s&", etc.) are now
+  possible ``out of the box'' if the target supports them.  Previously
+  the user would need to explicitly enable the possibility with the
+  "set target-async on" command.
+
 * New features in the GDB remote stub, GDBserver
 
   ** New option --debug-format=option1[,option2,...] allows one to add
@@ -145,6 +165,17 @@ PowerPC64 GNU/Linux little-endian  powerpc64le-*-linux*
   supported.  Use "set serial baud" and "show serial baud" (respectively)
   instead.
 
+* MI changes
+
+  ** A new option "-gdb-set mi-async" replaces "-gdb-set
+     target-async".  The latter is left as a deprecated alias of the
+     former for backward compatibility.  If the target supports it,
+     CLI background execution commands are now always possible by
+     default, independently of whether the frontend stated a
+     preference for asynchronous execution with "-gdb-set mi-async".
+     Previously "-gdb-set target-async off" affected both MI execution
+     commands and CLI execution commands.
+
 *** Changes in GDB 7.7
 
 * Improved support for process record-replay and reverse debugging on
index f0e58045d68e391411b87ab7c982538c5d5c6e02..18fb24186974b93d17830796cac5b35a38c2e73f 100644 (file)
@@ -1,3 +1,12 @@
+2014-05-29  Pedro Alves  <palves@redhat.com>
+           Tom Tromey  <tromey@redhat.com>
+
+       * gdb.texinfo (Non-Stop Mode): Remove "set target-async 1"
+       from example.
+       (Asynchronous and non-stop modes): Document '-gdb-set mi-async'.
+       Mention that target-async is now deprecated.
+       (Maintenance Commands): Document maint set/show target-async.
+
 2014-05-29  Pedro Alves  <palves@redhat.com>
 
        * observer.texi (sync_execution_done, command_error): New
index 1ee62e05b5c2758f31161a1365b37334646c97b8..9f7fa18a6c3400273de89d3a2884a783f3bdc1d0 100644 (file)
@@ -5778,9 +5778,6 @@ To enter non-stop mode, use this sequence of commands before you run
 or attach to your program:
 
 @smallexample
-# Enable the async interface.
-set target-async 1
-
 # If using the CLI, pagination breaks non-stop.
 set pagination off
 
@@ -5850,21 +5847,6 @@ the program to report that some thread has stopped before prompting for
 another command.  In background execution, @value{GDBN} immediately gives
 a command prompt so that you can issue other commands while your program runs.
 
-You need to explicitly enable asynchronous mode before you can use
-background execution commands.  You can use these commands to
-manipulate the asynchronous mode setting:
-
-@table @code
-@kindex set target-async
-@item set target-async on
-Enable asynchronous mode.
-@item set target-async off
-Disable asynchronous mode.
-@kindex show target-async
-@item show target-async
-Show the current target-async setting.
-@end table
-
 If the target doesn't support async mode, @value{GDBN} issues an error
 message if you attempt to use the background execution commands.
 
@@ -24818,12 +24800,37 @@ On some targets, @value{GDBN} is capable of processing MI commands
 even while the target is running.  This is called @dfn{asynchronous
 command execution} (@pxref{Background Execution}).  The frontend may
 specify a preferrence for asynchronous execution using the
-@code{-gdb-set target-async 1} command, which should be emitted before
+@code{-gdb-set mi-async 1} command, which should be emitted before
 either running the executable or attaching to the target.  After the
 frontend has started the executable or attached to the target, it can
 find if asynchronous execution is enabled using the
 @code{-list-target-features} command.
 
+@table @code
+@item -gdb-set mi-async on
+@item -gdb-set mi-async off
+Set whether MI is in asynchronous mode.
+
+When @code{off}, which is the default, MI execution commands (e.g.,
+@code{-exec-continue}) are foreground commands, and @value{GDBN} waits
+for the program to stop before processing further commands.
+
+When @code{on}, MI execution commands are background execution
+commands (e.g., @code{-exec-continue} becomes the equivalent of the
+@code{c&} CLI command), and so @value{GDBN} is capable of processing
+MI commands even while the target is running.
+
+@item -gdb-show mi-async
+Show whether MI asynchronous mode is enabled.
+@end table
+
+Note: In @value{GDBN} version 7.7 and earlier, this option was called
+@code{target-async} instead of @code{mi-async}, and it had the effect
+of both putting MI in asynchronous mode and making CLI background
+commands possible.  CLI background commands are now always possible
+``out of the box'' if the target supports them.  The old spelling is
+kept as a deprecated alias for backwards compatibility.
+
 Even if @value{GDBN} can accept a command while target is running,
 many commands that access the target do not work when the target is
 running.  Therefore, asynchronous command execution is most useful
@@ -33532,6 +33539,15 @@ Control whether to show all non zero areas within a 1k block starting
 at thread local base, when using the @samp{info w32 thread-information-block}
 command.
 
+@kindex maint set target-async
+@kindex maint show target-async
+@item maint set target-async
+@itemx maint show target-async
+This controls whether @value{GDBN} targets operate in synchronous or
+asynchronous mode (@pxref{Background Execution}).  Normally the
+default is asynchronous, if it is available; but this can be changed
+to more easily debug problems occurring only in synchronous mode.
+
 @kindex maint set per-command
 @kindex maint show per-command
 @item maint set per-command
index 6511d642cb7e0b25ba0c0bbae589e974fd5ec5e8..df4fd407b4449fb245d6af227f67eccb15b38961 100644 (file)
@@ -497,11 +497,9 @@ Start it from the beginning? ")))
     }
 }
 
-/* Prepare for execution command.  TARGET is the target that will run
-   the command.  BACKGROUND determines whether this is a foreground
-   (synchronous) or background (asynchronous) command.  */
+/* See inferior.h.  */
 
-static void
+void
 prepare_execution_command (struct target_ops *target, int background)
 {
   /* If we get a request for running in the bg but the target
index 14f4ec833e60edde78e8b76dd0f015d96f6d24ac..668c888b8cac42f335c9f51fe380250804a2aba0 100644 (file)
@@ -164,6 +164,13 @@ extern void notice_new_inferior (ptid_t, int, int);
 extern struct value *get_return_value (struct value *function,
                                        struct type *value_type);
 
+/* Prepare for execution command.  TARGET is the target that will run
+   the command.  BACKGROUND determines whether this is a foreground
+   (synchronous) or background (asynchronous) command.  */
+
+extern void prepare_execution_command (struct target_ops *target,
+                                      int background);
+
 /* Whether to start up the debuggee under a shell.
 
    If startup-with-shell is set, GDB's "run" will attempt to start up
index 9086cd2fb7fae20c6b1b70a6d376469cb1d2f148..e6540ad412b0aec21415649dc2a942a0aa85ea14 100644 (file)
@@ -235,7 +235,6 @@ set_observer_mode (char *args, int from_tty,
      going out we leave it that way.  */
   if (observer_mode)
     {
-      target_async_permitted = 1;
       pagination_enabled = 0;
       non_stop = non_stop_1 = 1;
     }
index e1dd97f668f2851918a004e7865e51450d0b4649..52a3a626e4d1027b7cda4f5d513022010404d196 100644 (file)
@@ -85,6 +85,7 @@ static void mi_breakpoint_modified (struct breakpoint *b);
 static void mi_command_param_changed (const char *param, const char *value);
 static void mi_memory_changed (struct inferior *inf, CORE_ADDR memaddr,
                               ssize_t len, const bfd_byte *myaddr);
+static void mi_on_sync_execution_done (void);
 
 static int report_initial_inferior (struct inferior *inf, void *closure);
 
@@ -158,6 +159,7 @@ mi_interpreter_init (struct interp *interp, int top_level)
       observer_attach_breakpoint_modified (mi_breakpoint_modified);
       observer_attach_command_param_changed (mi_command_param_changed);
       observer_attach_memory_changed (mi_memory_changed);
+      observer_attach_sync_execution_done (mi_on_sync_execution_done);
 
       /* The initial inferior is created before this function is
         called, so we need to report it explicitly.  Use iteration in
@@ -304,6 +306,28 @@ mi_execute_command_wrapper (const char *cmd)
   mi_execute_command (cmd, stdin == instream);
 }
 
+/* Observer for the synchronous_command_done notification.  */
+
+static void
+mi_on_sync_execution_done (void)
+{
+  /* MI generally prints a prompt after a command, indicating it's
+     ready for further input.  However, due to an historical wart, if
+     MI async, and a (CLI) synchronous command was issued, then we
+     will print the prompt right after printing "^running", even if we
+     cannot actually accept any input until the target stops.  See
+     mi_on_resume.  However, if the target is async but MI is sync,
+     then we need to output the MI prompt now, to replicate gdb's
+     behavior when neither the target nor MI are async.  (Note this
+     observer is only called by the asynchronous target event handling
+     code.)  */
+  if (!mi_async_p ())
+    {
+      fputs_unfiltered ("(gdb) \n", raw_stdout);
+      gdb_flush (raw_stdout);
+    }
+}
+
 /* mi_execute_command_wrapper wrapper suitable for INPUT_HANDLER.  */
 
 static void
@@ -311,8 +335,24 @@ mi_execute_command_input_handler (char *cmd)
 {
   mi_execute_command_wrapper (cmd);
 
-  fputs_unfiltered ("(gdb) \n", raw_stdout);
-  gdb_flush (raw_stdout);
+  /* MI generally prints a prompt after a command, indicating it's
+     ready for further input.  However, due to an historical wart, if
+     MI is async, and a synchronous command was issued, then we will
+     print the prompt right after printing "^running", even if we
+     cannot actually accept any input until the target stops.  See
+     mi_on_resume.
+
+     If MI is not async, then we print the prompt when the command
+     finishes.  If the target is sync, that means output the prompt
+     now, as in that case executing a command doesn't return until the
+     command is done.  However, if the target is async, we go back to
+     the event loop and output the prompt in the
+     'synchronous_command_done' observer.  */
+  if (!target_is_async_p () || !sync_execution)
+    {
+      fputs_unfiltered ("(gdb) \n", raw_stdout);
+      gdb_flush (raw_stdout);
+    }
 }
 
 static void
@@ -928,10 +968,10 @@ mi_on_resume (ptid_t ptid)
       running_result_record_printed = 1;
       /* This is what gdb used to do historically -- printing prompt even if
         it cannot actually accept any input.  This will be surely removed
-        for MI3, and may be removed even earler.  */
-      /* FIXME: review the use of target_is_async_p here -- is that
-        what we want? */
-      if (!target_is_async_p ())
+        for MI3, and may be removed even earlier.  SYNC_EXECUTION is
+        checked here because we only need to emit a prompt if a
+        synchronous command was issued when the target is async.  */
+      if (!target_is_async_p () || sync_execution)
        fputs_unfiltered ("(gdb) \n", raw_stdout);
     }
   gdb_flush (raw_stdout);
index 9ab4886fb1fd3aef7724c00980c84b2549079db2..96dfc711c2e4890c710ffa364352ca646d2d9ad8 100644 (file)
@@ -54,6 +54,7 @@
 #include "ada-lang.h"
 #include "linespec.h"
 #include "extension.h"
+#include "gdbcmd.h"
 
 #include <ctype.h>
 #include <sys/time.h>
@@ -105,6 +106,45 @@ static int register_changed_p (int regnum, struct regcache *,
 static void output_register (struct frame_info *, int regnum, int format,
                             int skip_unavailable);
 
+/* Controls whether the frontend wants MI in async mode.  */
+static int mi_async = 0;
+
+/* The set command writes to this variable.  If the inferior is
+   executing, mi_async is *not* updated.  */
+static int mi_async_1 = 0;
+
+static void
+set_mi_async_command (char *args, int from_tty,
+                     struct cmd_list_element *c)
+{
+  if (have_live_inferiors ())
+    {
+      mi_async_1 = mi_async;
+      error (_("Cannot change this setting while the inferior is running."));
+    }
+
+  mi_async = mi_async_1;
+}
+
+static void
+show_mi_async_command (struct ui_file *file, int from_tty,
+                      struct cmd_list_element *c,
+                      const char *value)
+{
+  fprintf_filtered (file,
+                   _("Whether MI is in asynchronous mode is %s.\n"),
+                   value);
+}
+
+/* A wrapper for target_can_async_p that takes the MI setting into
+   account.  */
+
+int
+mi_async_p (void)
+{
+  return mi_async && target_can_async_p ();
+}
+
 /* Command implementations.  FIXME: Is this libgdb?  No.  This is the MI
    layer that calls libgdb.  Any operation used in the below should be
    formalized.  */
@@ -229,6 +269,8 @@ proceed_thread_callback (struct thread_info *thread, void *arg)
 static void
 exec_continue (char **argv, int argc)
 {
+  prepare_execution_command (&current_target, mi_async_p ());
+
   if (non_stop)
     {
       /* In non-stop mode, 'resume' always resumes a single thread.
@@ -395,8 +437,8 @@ run_one_inferior (struct inferior *inf, void *arg)
       switch_to_thread (null_ptid);
       set_current_program_space (inf->pspace);
     }
-  mi_execute_cli_command (run_cmd, target_can_async_p (),
-                         target_can_async_p () ? "&" : NULL);
+  mi_execute_cli_command (run_cmd, mi_async_p (),
+                         mi_async_p () ? "&" : NULL);
   return 0;
 }
 
@@ -450,8 +492,8 @@ mi_cmd_exec_run (char *command, char **argv, int argc)
     {
       const char *run_cmd = start_p ? "start" : "run";
 
-      mi_execute_cli_command (run_cmd, target_can_async_p (),
-                             target_can_async_p () ? "&" : NULL);
+      mi_execute_cli_command (run_cmd, mi_async_p (),
+                             mi_async_p () ? "&" : NULL);
     }
 }
 
@@ -1838,11 +1880,10 @@ mi_cmd_list_target_features (char *command, char **argv, int argc)
       struct ui_out *uiout = current_uiout;
 
       cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");
-      if (target_can_async_p ())
+      if (mi_async_p ())
        ui_out_field_string (uiout, NULL, "async");
       if (target_can_execute_reverse)
        ui_out_field_string (uiout, NULL, "reverse");
-
       do_cleanups (cleanup);
       return;
     }
@@ -2269,7 +2310,7 @@ mi_execute_async_cli_command (char *cli_command, char **argv, int argc)
   struct cleanup *old_cleanups;
   char *run;
 
-  if (target_can_async_p ())
+  if (mi_async_p ())
     run = xstrprintf ("%s %s&", cli_command, argc ? *argv : "");
   else
     run = xstrprintf ("%s %s", cli_command, argc ? *argv : "");
@@ -2920,3 +2961,25 @@ mi_cmd_trace_frame_collected (char *command, char **argv, int argc)
 
   do_cleanups (old_chain);
 }
+
+void
+_initialize_mi_main (void)
+{
+  struct cmd_list_element *c;
+
+  add_setshow_boolean_cmd ("mi-async", class_run,
+                          &mi_async_1, _("\
+Set whether MI asynchronous mode is enabled."), _("\
+Show whether MI asynchronous mode is enabled."), _("\
+Tells GDB whether MI should be in asynchronous mode."),
+                          set_mi_async_command,
+                          show_mi_async_command,
+                          &setlist,
+                          &showlist);
+
+  /* Alias old "target-async" to "mi-async".  */
+  c = add_alias_cmd ("target-async", "mi-async", class_run, 0, &setlist);
+  deprecate_cmd (c, "set mi-async");
+  c = add_alias_cmd ("target-async", "mi-async", class_run, 0, &showlist);
+  deprecate_cmd (c, "show mi-async");
+}
index c32845d264ffdea850d9f703b3e28439be05be0f..530aeb719cb8cce4dd8f62b92b59ece5ae462fe6 100644 (file)
@@ -28,6 +28,10 @@ extern void mi_load_progress (const char *section_name,
 
 extern void mi_print_timing_maybe (void);
 
+/* Whether MI is in async mode.  */
+
+extern int mi_async_p (void);
+
 extern char *current_token;
 
 extern int running_result_record_printed;
index 6a1a2ffb4274f7a070da1157e6a77799f008a12f..cb154ab409b7623a14201ec951d10981b78e8f11 100644 (file)
@@ -4105,16 +4105,17 @@ maintenance_print_target_stack (char *cmd, int from_tty)
     }
 }
 
-/* Controls if async mode is permitted.  */
-int target_async_permitted = 0;
+/* Controls if targets can report that they can/are async.  This is
+   just for maintainers to use when debugging gdb.  */
+int target_async_permitted = 1;
 
 /* The set command writes to this variable.  If the inferior is
    executing, target_async_permitted is *not* updated.  */
-static int target_async_permitted_1 = 0;
+static int target_async_permitted_1 = 1;
 
 static void
-set_target_async_command (char *args, int from_tty,
-                         struct cmd_list_element *c)
+maint_set_target_async_command (char *args, int from_tty,
+                               struct cmd_list_element *c)
 {
   if (have_live_inferiors ())
     {
@@ -4126,9 +4127,9 @@ set_target_async_command (char *args, int from_tty,
 }
 
 static void
-show_target_async_command (struct ui_file *file, int from_tty,
-                          struct cmd_list_element *c,
-                          const char *value)
+maint_show_target_async_command (struct ui_file *file, int from_tty,
+                                struct cmd_list_element *c,
+                                const char *value)
 {
   fprintf_filtered (file,
                    _("Controlling the inferior in "
@@ -4233,10 +4234,10 @@ result in significant performance improvement for remote targets."),
 Set whether gdb controls the inferior in asynchronous mode."), _("\
 Show whether gdb controls the inferior in asynchronous mode."), _("\
 Tells gdb whether to control the inferior in asynchronous mode."),
-                          set_target_async_command,
-                          show_target_async_command,
-                          &setlist,
-                          &showlist);
+                          maint_set_target_async_command,
+                          maint_show_target_async_command,
+                          &maintenance_set_cmdlist,
+                          &maintenance_show_cmdlist);
 
   add_setshow_boolean_cmd ("may-write-registers", class_support,
                           &may_write_registers_1, _("\
index 937152902aea40ad0b9fd64dbe1bc490a51ee1c2..face2107fbaa51f46b2982c57d255d5c6b074730 100644 (file)
@@ -1619,8 +1619,7 @@ extern int default_child_has_execution (struct target_ops *ops,
 #define target_can_lock_scheduler \
      (current_target.to_has_thread_control & tc_schedlock)
 
-/* Should the target enable async mode if it is supported?  Temporary
-   cludge until async mode is a strict superset of sync mode.  */
+/* Controls whether async mode is permitted.  */
 extern int target_async_permitted;
 
 /* Can the target support asynchronous execution?  */
index 3dc8f5f3ce0858403547404fe694e192d1a05cbb..0297ec6bb67524d16b39022cdf26c3e4e1565d9c 100644 (file)
@@ -1,3 +1,32 @@
+2014-05-29  Pedro Alves  <palves@redhat.com>
+           Tom Tromey  <tromey@redhat.com>
+
+       * gdb.base/async-shell.exp: Don't enable target-async.
+       * gdb.base/async.exp
+       * gdb.base/corefile.exp (corefile_test_attach): Remove 'async'
+       parameter.  Adjust.
+       (top level): Don't test with "target-async".
+       * gdb.base/dprintf-non-stop.exp: Don't enable target-async.
+       * gdb.base/gdb-sigterm.exp: Don't test with "target-async".
+       * gdb.base/inferior-died.exp: Don't enable target-async.
+       * gdb.base/interrupt-noterm.exp: Likewise.
+       * gdb.mi/mi-async.exp: Use "mi-async" instead of "target-async".
+       * gdb.mi/mi-nonstop-exit.exp: Likewise.
+       * gdb.mi/mi-nonstop.exp: Likewise.
+       * gdb.mi/mi-ns-stale-regcache.exp: Likewise.
+       * gdb.mi/mi-nsintrall.exp: Likewise.
+       * gdb.mi/mi-nsmoribund.exp: Likewise.
+       * gdb.mi/mi-nsthrexec.exp: Likewise.
+       * gdb.mi/mi-watch-nonstop.exp: Likewise.
+       * gdb.multi/watchpoint-multi.exp: Adjust comment.
+       * gdb.python/py-evsignal.exp: Don't enable target-async.
+       * gdb.python/py-evthreads.exp: Likewise.
+       * gdb.python/py-prompt.exp: Likewise.
+       * gdb.reverse/break-precsave.exp: Don't test with "target-async".
+       * gdb.server/solib-list.exp: Don't enable target-async.
+       * gdb.threads/thread-specific-bp.exp: Likewise.
+       * lib/mi-support.exp: Adjust to use mi-async.
+
 2014-05-29  Pedro Alves  <palves@redhat.com>
 
        PR gdb/13860
index 4890a59ed104f936cd067434ee64010b35868bb1..f0550bc5acd3d8cc2ff7efc6dbb90506b045fe5d 100644 (file)
@@ -31,7 +31,6 @@ if { [prepare_for_testing ${testfile}.exp ${testfile} $srcfile] } {
 
 set gdbindex_warning_re "warning: Skipping \[^\r\n\]+ \\.gdb_index section \[^\r\n\]*\r\nDo \"set use-deprecated-index-sections on\" before the file is read\r\nto use the section anyway\\."
 
-gdb_test_no_output "set target-async on "
 gdb_test_no_output "set non-stop on"
 gdb_test "run &" "Starting program: \[^\r\n\]*(\r\n$gdbindex_warning_re)?"
 
index f0a18e89193fdfdc7e71bb2b6a9f26daa11e0660..0f99b0119315c809dddcdd61b28400960fed1481 100644 (file)
@@ -25,8 +25,6 @@ if {[prepare_for_testing $testfile.exp $testfile $srcfile debug]} {
     return -1
 }
 
-gdb_test_no_output "set target-async on"
-
 #
 # set it up at a breakpoint so we can play with it
 #
index 6eb1f02857c607a66c1d54ac2b131db0c16cd6f7..bde2de85fe81c47976176c6630ff1e61e2692154 100644 (file)
@@ -241,7 +241,7 @@ gdb_exit
 
 # Test an attach command will clear any loaded core file.
 
-proc corefile_test_attach {{async 0}} {
+proc corefile_test_attach {} {
     global binfile corefile gdb_prompt
 
     if ![is_remote target] {
@@ -257,11 +257,6 @@ proc corefile_test_attach {{async 0}} {
 
        gdb_start
 
-       if {$async} {
-           gdb_test_no_output "set target-async on" \
-               "enable target-async for attach tests"
-       }
-
        gdb_test "core-file $corefile" "Core was generated by .*" "attach: load core again"
        gdb_test "info files" "\r\nLocal core dump file:\r\n.*" "attach: sanity check we see the core file"
 
@@ -298,13 +293,3 @@ gdb_test_multiple "core-file $corefile" $test {
        pass $test
     }
 }
-
-
-# Try a couple tests again with target-async.
-with_test_prefix "target-async" {
-    clean_restart ${testfile}
-
-    gdb_test_no_output "set target-async on"
-    corefile_test_run
-    corefile_test_attach 1
-}
index fdaa5c1758a5d84fdb00415a06a6a1cef8519012..df1e27081cd6558bf3564ce242a1f2ebf80b4834 100644 (file)
@@ -26,7 +26,6 @@ if [prepare_for_testing "failed to prepare for dprintf with non-stop" \
     return -1
 }
 
-gdb_test_no_output "set target-async on"
 gdb_test_no_output "set non-stop on"
 
 if ![runto main] {
index f52517cdfa9e4a328bbcd64091e4822c4b36d2e0..df0de42267a8a636149c3d3ab6dc9236a52f4bd1 100644 (file)
@@ -79,17 +79,7 @@ proc do_test { pass } {
 # 50 runs should be approx. a safe number to be sure it is fixed now.
 
 for {set pass 0} {$pass < 50} {incr pass} {
-
     clean_restart ${testfile}
-    gdb_test_no_output "set target-async off" ""
-    with_test_prefix "sync" {
-        do_test $pass
-    }
-
-    clean_restart ${testfile}
-    gdb_test_no_output "set target-async on" ""
-    with_test_prefix "async" {
-        do_test $pass
-    }
+    do_test $pass
 }
 pass "$pass SIGTERM passes"
index 33f92e9c25ecec5d4882dce595e5f8bdff80ca7f..152bdd875cd5c4016854048e7fa15a637d7d64f3 100644 (file)
@@ -38,7 +38,6 @@ if { [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.c] } {
 }
 
 gdb_test_no_output "set detach-on-fork off"
-gdb_test_no_output "set target-async on"
 gdb_test_no_output "set non-stop on"
 
 if ![runto_main] {
index a22acd22957aa64e091609d027d3727031dc545b..5c92b9722ddb4a20a11f4f3b60c207f6bf22ca4b 100644 (file)
@@ -22,7 +22,6 @@ if [prepare_for_testing "failed to prepare for testing" \
 
 # Pretend there's no terminal.
 gdb_test_no_output "set interactive-mode off"
-gdb_test_no_output "set target-async on"
 
 if ![runto main] {
     fail "Can't run to main"
index e41701d8a132069977cb44ab41935d1658393067..0df4c98010c710d83b0b0909de00e2092ce43332 100644 (file)
@@ -27,7 +27,7 @@ if { !([isnative] && [istarget *-linux*]) } then {
 
 # The plan is for async mode to become the default but toggle for now.
 set saved_gdbflags $GDBFLAGS
-set GDBFLAGS [concat $GDBFLAGS " -ex \"set target-async on\""]
+set GDBFLAGS [concat $GDBFLAGS " -ex \"set mi-async on\""]
 
 load_lib mi-support.exp
 
index 3727d81b746f60f464bff6f39d60154177260995..5187b405e2041c55741f277d1cab5ed7b204c42f 100644 (file)
@@ -40,7 +40,7 @@ mi_gdb_reinitialize_dir $srcdir/$subdir
 mi_gdb_load $binfile
 
 mi_gdb_test "-gdb-set non-stop 1" ".*"
-mi_gdb_test "-gdb-set target-async 1" ".*"
+mi_gdb_test "-gdb-set mi-async 1" ".*"
 mi_detect_async
 
 if { [mi_run_to_main] < 0 } {
index 5ef74ed1ea276799932b112c3f0981e1b95f0d0b..ba7dfd4002aead6df8ce83632d4594bc20db9c0e 100644 (file)
@@ -50,7 +50,7 @@ mi_gdb_reinitialize_dir $srcdir/$subdir
 mi_gdb_load $binfile
 
 mi_gdb_test "-gdb-set non-stop 1" ".*"
-mi_gdb_test "-gdb-set target-async 1" ".*"
+mi_gdb_test "-gdb-set mi-async 1" ".*"
 mi_detect_async
 
 if { [mi_run_to_main] < 0 } {
index 754689ca7f2e2c7d35817b7410c93ad4bf59e59d..ae9e5f2e4f120330dafeeb12dbc570074b6ce5f3 100644 (file)
@@ -53,7 +53,7 @@ mi_gdb_reinitialize_dir $srcdir/$subdir
 mi_gdb_load $binfile
 
 mi_gdb_test "-gdb-set non-stop 1" ".*"
-mi_gdb_test "-gdb-set target-async 1" ".*"
+mi_gdb_test "-gdb-set mi-async 1" ".*"
 mi_detect_async
 
 if { [mi_run_to_main] < 0 } {
index f613e7f3eb7d3c0405a1334d1e5bd5fbd9c5378a..ac1209ef8795a1ec7a74bf6c4f1f2c5cbc03c841 100644 (file)
@@ -40,7 +40,7 @@ mi_gdb_reinitialize_dir $srcdir/$subdir
 mi_gdb_load $binfile
 
 mi_gdb_test "-gdb-set non-stop 1" ".*"
-mi_gdb_test "-gdb-set target-async 1" ".*"
+mi_gdb_test "-gdb-set mi-async 1" ".*"
 mi_detect_async
 
 if { [mi_run_to_main] < 0 } {
index 350c06080aa085534ac0dd98b032b780b2f86a0f..0ff04ca68e2e0b76d2748d5e64263c07a319387b 100644 (file)
@@ -40,7 +40,7 @@ mi_gdb_reinitialize_dir $srcdir/$subdir
 mi_gdb_load $binfile
 
 mi_gdb_test "-gdb-set non-stop 1" ".*"
-mi_gdb_test "-gdb-set target-async 1" ".*"
+mi_gdb_test "-gdb-set mi-async 1" ".*"
 mi_detect_async
 
 if { [mi_run_to_main] < 0 } {
index 85617d0e1ff8f0e7d913f15992135dfa1b47014d..008a83132f4df1a14c8bd855604cf054e1caa3aa 100644 (file)
@@ -50,7 +50,7 @@ mi_gdb_reinitialize_dir $srcdir/$subdir
 mi_gdb_load $binfile
 
 mi_gdb_test "-gdb-set non-stop 1" ".*"
-mi_gdb_test "-gdb-set target-async 1" ".*"
+mi_gdb_test "-gdb-set mi-async 1" ".*"
 mi_detect_async
 
 if { [mi_run_to_main] < 0 } {
index 3dbf4c7a237eacf11f1432501dc8e5c49c0f8480..44371c811d9c6bdc2955ec69c6ceb05f7de78881 100644 (file)
@@ -52,7 +52,7 @@ mi_gdb_reinitialize_dir $srcdir/$subdir
 mi_gdb_load $binfile
 
 mi_gdb_test "-gdb-set non-stop 1" ".*"
-mi_gdb_test "-gdb-set target-async 1" ".*"
+mi_gdb_test "-gdb-set mi-async 1" ".*"
 mi_detect_async
 
 if { [mi_run_to_main] < 0 } {
index b7fb0a9db237fb0ecf9ba615d5d883c16b8e13b6..e6a89579a36a60506d0e3d7209ddaaf3077bcbd2 100644 (file)
@@ -37,7 +37,7 @@ if { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executa
 
 clean_restart $executable
 
-# Simulate non-stop+target-async which also uses breakpoint always-inserted.
+# Simulate non-stop which also uses breakpoint always-inserted.
 gdb_test_no_output "set breakpoint always-inserted on"
 # displaced-stepping is also needed as other GDB sometimes still removes the
 # breakpoints, even with always-inserted on.
index af3d53c65c9a94fb5b1f52ae3935789cf109f4d8..530fd07a6ef2d1ec85ca8e221c31121190ac3424 100644 (file)
@@ -35,7 +35,6 @@ gdb_test_no_output "python exec (open ('${pyfile}').read ())" ""
 
 gdb_test "test-events" "Event testers registered."
 gdb_test_no_output "set non-stop on"
-gdb_test_no_output "set target-async on"
 
 gdb_run_cmd
 gdb_test_multiple "" "Signal Thread 3"  {
index ffa322f2931e1ae43e63ba7bd07ee7b2e6556b8f..d62624e8f1da6c0c40729a8f8f17ea0b36f82cd4 100644 (file)
@@ -40,7 +40,6 @@ gdb_test_no_output "python exec (open ('${pyfile}').read ())" ""
 
 gdb_test "test-events" "Event testers registered."
 gdb_test_no_output "set non-stop on"
-gdb_test_no_output "set target-async on"
 
 gdb_breakpoint "main"
 gdb_breakpoint "thread2"
index e376c05bd00fbee458d25bfc0092a206f0300375..ebe4cb69d81d5e8b3b8a231ac016a349b6bfb849 100644 (file)
@@ -90,8 +90,7 @@ if { [istarget "*-*-cygwin*"] } {
     set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
 }
 
-set GDBFLAGS [concat $tmp_gdbflags " -ex \"set target-async on\""]
-set GDBFLAGS [concat $GDBFLAGS " -ex \"set pagination off\""]
+set GDBFLAGS [concat $tmp_gdbflags " -ex \"set pagination off\""]
 set GDBFLAGS [concat $GDBFLAGS " -ex \"set editing on\""]
 set GDBFLAGS [concat $GDBFLAGS " -ex \"attach $testpid\""]
 set GDBFLAGS [concat $GDBFLAGS " -ex \"continue&\""]
@@ -107,8 +106,7 @@ gdb_test "python print (\"'\" + str(p\[0\]) + \"'\")" "'$gdb_prompt_fail '" \
         "prompt_hook argument is default prompt. 3"
 gdb_exit
 
-set GDBFLAGS [concat $tmp_gdbflags " -ex \"set target-async on\""]
-set GDBFLAGS [concat $GDBFLAGS " -ex \"set pagination off\""]
+set GDBFLAGS [concat $tmp_gdbflags " -ex \"set pagination off\""]
 set GDBFLAGS [concat $GDBFLAGS " -ex \"set editing on\""]
 set GDBFLAGS [concat $GDBFLAGS " -ex \"attach $testpid\""]
 set GDBFLAGS [concat $GDBFLAGS " -ex \"interrupt\""]
index f1e6c6953830cb6f315907f72bc704eb8fcdda97..3206e3c144be111664e92aefcde20a13598576e6 100644 (file)
@@ -110,9 +110,3 @@ proc precsave_tests {} {
 }
 
 precsave_tests
-
-with_test_prefix "target-async" {
-    clean_restart $testfile
-    gdb_test_no_output "set target-async on"
-    precsave_tests
-}
index 8cc3edc5382649b8e6e9c838ae5b88983be92807..4504a23cfa602a96f9b8f40e395b2153766dbd78 100644 (file)
@@ -66,7 +66,6 @@ foreach nonstop { 0 1 } { with_test_prefix "non-stop $nonstop" {
     gdb_test "disconnect" ".*"
 
     gdb_test "set non-stop $nonstop"
-    gdb_test "set target-async $nonstop"
 
     # It is required for the non-stop mode, GDB would try to step over
     # _dl_debug_state breakpoint will still only ld.so loaded in gdbserver.
index b8416d75113ec257a25b2084a2e6a775fea1aee1..4273e1d738612bd6f6fc22a207a1c7d476cdb8fc 100644 (file)
@@ -122,6 +122,5 @@ check_thread_specific_breakpoint "all-stop"
 clean_restart ${binfile}
 
 # Test non-stop mode.
-gdb_test_no_output "set target-async on" "set async mode"
 gdb_test_no_output "set non-stop on" "set non-stop mode"
 check_thread_specific_breakpoint "non-stop"
index 9f07cdab793466939ffe8806096d6a4e8260f832..f1b5749731220cc9637250d64dec1f79e7615c8c 100644 (file)
@@ -1014,10 +1014,10 @@ proc mi_detect_async {} {
     global async
     global mi_gdb_prompt
 
-    send_gdb "show target-async\n"
+    send_gdb "show mi-async\n"
 
     gdb_expect {
-       -re ".*Controlling the inferior in asynchronous mode is on...*$mi_gdb_prompt$" {
+       -re "asynchronous mode is on...*$mi_gdb_prompt$" {
            set async 1
        }
        -re ".*$mi_gdb_prompt$" {