Fix -exec-run not running asynchronously with mi-async on (PR gdb/18077)
authorSimon Marchi <simon.marchi@ericsson.com>
Tue, 17 May 2016 20:44:57 +0000 (16:44 -0400)
committerSimon Marchi <simon.marchi@ericsson.com>
Tue, 17 May 2016 20:46:18 +0000 (16:46 -0400)
When doing -exec-run on a freshly started GDB, the only target on the
target stack at the time the dummy one.  When mi_async_p is called to
know whether the run should be async, it queries whether the current
target (dummy) supports async, and the answer is no.  The fix is to make
the code query the target that will be used for the run, which is not
necessarily the current target.

No regressions in the gdb.mi directory using the unix, native-gdbserver
and native-extended-gdbserver boards.  The test doesn't pass when
forcing maint set target-async off, obviously, since it makes mi-async
have no effect.  It doesn't seem like other tests are checking for that
eventuality, so I didn't in the new test.

gdb/ChangeLog:

* mi/mi-main.c (run_one_inferior): Use run target to determine
whether to run async or not.
(mi_cmd_exec_run): Likewise.

gdb/testsuite/ChangeLog:

* gdb.mi/mi-async-run.exp: New file.
* gdb.mi/mi-async-run.c: New file.

gdb/ChangeLog
gdb/mi/mi-main.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.mi/mi-async-run.c [new file with mode: 0644]
gdb/testsuite/gdb.mi/mi-async-run.exp [new file with mode: 0644]

index b7a6351162bca2d2398157243cc083cbece7fac9..a06b860b9ffce89ff693cf5510ce8f190e60c731 100644 (file)
@@ -1,3 +1,10 @@
+2016-05-17  Simon Marchi  <simon.marchi@ericsson.com>
+
+       PR gdb/18077
+       * mi/mi-main.c (run_one_inferior): Use run target to determine
+       whether to run async or not.
+       (mi_cmd_exec_run): Likewise.
+
 2016-05-17  Tom Tromey  <tom@tromey.com>
 
        * std-operator.def (OP_RANGE): Rename from OP_F90_RANGE.
index dd5a6d7afd45fa061a4c513312c20a23dc052ba0..d53bcc7758bea599e7d96a82f73cae2c20d8f100 100644 (file)
@@ -415,6 +415,8 @@ run_one_inferior (struct inferior *inf, void *arg)
 {
   int start_p = *(int *) arg;
   const char *run_cmd = start_p ? "start" : "run";
+  struct target_ops *run_target = find_run_target ();
+  int async_p = mi_async && run_target->to_can_async_p (run_target);
 
   if (inf->pid != 0)
     {
@@ -435,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, mi_async_p (),
-                         mi_async_p () ? "&" : NULL);
+  mi_execute_cli_command (run_cmd, async_p,
+                         async_p ? "&" : NULL);
   return 0;
 }
 
@@ -488,9 +490,11 @@ mi_cmd_exec_run (char *command, char **argv, int argc)
   else
     {
       const char *run_cmd = start_p ? "start" : "run";
+      struct target_ops *run_target = find_run_target ();
+      int async_p = mi_async && run_target->to_can_async_p (run_target);
 
-      mi_execute_cli_command (run_cmd, mi_async_p (),
-                             mi_async_p () ? "&" : NULL);
+      mi_execute_cli_command (run_cmd, async_p,
+                             async_p ? "&" : NULL);
     }
 }
 
index afe1e9e1dfcf57cb94271cadecf4e6cca5dbc1b0..6f930441a27df7b61a36eeea5198235d964b798b 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-17  Simon Marchi  <simon.marchi@ericsson.com>
+
+       PR gdb/18077
+       * gdb.mi/mi-async-run.exp: New file.
+       * gdb.mi/mi-async-run.c: New file.
+
 2016-05-17  Tom Tromey  <tom@tromey.com>
            Manish Goregaokar <manishsmail@gmail.com>
 
diff --git a/gdb/testsuite/gdb.mi/mi-async-run.c b/gdb/testsuite/gdb.mi/mi-async-run.c
new file mode 100644 (file)
index 0000000..00ed35c
--- /dev/null
@@ -0,0 +1,31 @@
+/* Copyright 2016 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <unistd.h>
+
+int
+main ()
+{
+  int i;
+
+  for (i = 0; i < 30; i++)
+    {
+      sleep (1);
+    }
+
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.mi/mi-async-run.exp b/gdb/testsuite/gdb.mi/mi-async-run.exp
new file mode 100644 (file)
index 0000000..c08a4a6
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright 2016 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib mi-support.exp
+
+standard_testfile
+
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+     untested "mi-async-run.exp"
+     return -1
+}
+
+# Test the resolution of PR 18077
+#
+# When doing an -exec-run with a fresh copy of GDB, it would result in
+# synchronous execution, even though mi-async was on.
+
+proc test_async_run {} {
+    global GDBFLAGS
+
+    save_vars { GDBFLAGS } {
+       global binfile
+
+       set GDBFLAGS [concat $GDBFLAGS " -ex \"set mi-async on\""]
+
+       gdb_exit
+       if [mi_gdb_start] {
+           continue
+       }
+
+       mi_gdb_load ${binfile}
+       mi_run_cmd
+       mi_gdb_test "123-exec-interrupt --all" "123\\^done" "send interrupt command"
+       mi_expect_interrupt "expect interrupt"
+    }
+}
+
+test_async_run