diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b7a6351162b..a06b860b9ff 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2016-05-17 Simon Marchi + + 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 * std-operator.def (OP_RANGE): Rename from OP_F90_RANGE. diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index dd5a6d7afd4..d53bcc7758b 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -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); } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index afe1e9e1dfc..6f930441a27 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-05-17 Simon Marchi + + PR gdb/18077 + * gdb.mi/mi-async-run.exp: New file. + * gdb.mi/mi-async-run.c: New file. + 2016-05-17 Tom Tromey Manish Goregaokar diff --git a/gdb/testsuite/gdb.mi/mi-async-run.c b/gdb/testsuite/gdb.mi/mi-async-run.c new file mode 100644 index 00000000000..00ed35c444b --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-async-run.c @@ -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 . */ + +#include + +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 index 00000000000..c08a4a6db47 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-async-run.exp @@ -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 . + +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