2008-05-06 Pedro Alves * infcmd.c (proceed_thread_callback, do_context_switch_to): New. (continue_command): In non-stop mode, if user passes "--all", resume all running threads. * inferior.h (proceed_ptid): Declare. * infrun.c (proceed_ptid): New. --- gdb/infcmd.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++-------- gdb/inferior.h | 2 + gdb/infrun.c | 9 ++++++++ 3 files changed, 62 insertions(+), 8 deletions(-) Index: src/gdb/infcmd.c =================================================================== --- src.orig/gdb/infcmd.c 2008-05-06 12:15:51.000000000 +0100 +++ src/gdb/infcmd.c 2008-05-06 12:17:35.000000000 +0100 @@ -607,16 +607,37 @@ start_command (char *args, int from_tty) run_command_1 (args, from_tty, 1); } +static int +proceed_thread_callback (struct thread_info *thread, void *arg) +{ + if (is_running (thread->ptid)) + return 0; + if (thread == arg) + return 0; + + proceed_ptid (thread->ptid); + return 0; +} + +static void +do_context_switch_to (void *arg) +{ + ptid_t *ptid = arg; + context_switch_to (*ptid); +} + +/* continue [--all] [proceed count] [&] */ void -continue_command (char *proc_count_exp, int from_tty) +continue_command (char *args, int from_tty) { int async_exec = 0; + int all_threads = 0; ERROR_NO_INFERIOR; ensure_not_running (); /* Find out whether we must run in the background. */ - if (proc_count_exp != NULL) - async_exec = strip_bg_char (&proc_count_exp); + if (args != NULL) + async_exec = strip_bg_char (&args); /* If we must run in the background, but the target can't do it, error out. */ @@ -631,9 +652,20 @@ continue_command (char *proc_count_exp, async_disable_stdin (); } + if (args != NULL) + { + if (strncmp (args, "--all", 5) == 0) + { + all_threads = 1; + args += sizeof ("--all") - 1; + if (*args == '\0') + args = NULL; + } + } + /* If have argument (besides '&'), set proceed count of breakpoint we stopped at. */ - if (proc_count_exp != NULL) + if (args != NULL) { bpstat bs = stop_bpstat; int num, stat; @@ -643,7 +675,7 @@ continue_command (char *proc_count_exp, if (stat > 0) { set_ignore_count (num, - parse_and_eval_long (proc_count_exp) - 1, + parse_and_eval_long (args) - 1, from_tty); /* set_ignore_count prints a message ending with a period. So print two spaces before "Continuing.". */ @@ -662,9 +694,20 @@ continue_command (char *proc_count_exp, if (from_tty) printf_filtered (_("Continuing.\n")); - clear_proceed_status (); - - proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0); + if (non_stop && all_threads) + { + ptid_t current_ptid = inferior_ptid; + struct cleanup *old_chain + = make_cleanup (do_context_switch_to, ¤t_ptid); + iterate_over_threads (proceed_thread_callback, NULL); + /* Restore selected ptid. */ + do_cleanups (old_chain); + } + else + { + clear_proceed_status (); + proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0); + } } /* Step until outside of current statement. */ Index: src/gdb/inferior.h =================================================================== --- src.orig/gdb/inferior.h 2008-05-06 12:15:51.000000000 +0100 +++ src/gdb/inferior.h 2008-05-06 12:15:55.000000000 +0100 @@ -132,6 +132,8 @@ extern void clear_proceed_status (void); extern void proceed (CORE_ADDR, enum target_signal, int); +extern void proceed_ptid (ptid_t); + extern ptid_t context_switch_to (ptid_t ptid); /* When set, stop the 'step' command if we enter a function which has Index: src/gdb/infrun.c =================================================================== --- src.orig/gdb/infrun.c 2008-05-06 12:15:51.000000000 +0100 +++ src/gdb/infrun.c 2008-05-06 12:15:55.000000000 +0100 @@ -1317,6 +1317,15 @@ proceed (CORE_ADDR addr, enum target_sig normal_stop (); } } + +/* Proceed thread PTID. */ +void +proceed_ptid (ptid_t ptid) +{ + context_switch_to (ptid); + clear_proceed_status (); + proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0); +} /* Start remote-debugging of a machine over a serial link. */