aboutsummaryrefslogtreecommitdiff
path: root/gdb/mi/mi-main.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@ericsson.com>2016-05-17 16:44:57 -0400
committerSimon Marchi <simon.marchi@ericsson.com>2016-05-17 16:46:18 -0400
commit61c6156df6e3c638eb3bdb4a6e3d418a43a6eb70 (patch)
tree6933e658997e4d545c575efc90d9dddf19519904 /gdb/mi/mi-main.c
parent01739a3b6a564f6552acf6c01617aa21ab4d8833 (diff)
downloadgdb-61c6156df6e3c638eb3bdb4a6e3d418a43a6eb70.zip
gdb-61c6156df6e3c638eb3bdb4a6e3d418a43a6eb70.tar.gz
gdb-61c6156df6e3c638eb3bdb4a6e3d418a43a6eb70.tar.bz2
Fix -exec-run not running asynchronously with mi-async on (PR gdb/18077)
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.
Diffstat (limited to 'gdb/mi/mi-main.c')
-rw-r--r--gdb/mi/mi-main.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index dd5a6d7..d53bcc7 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);
}
}