From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17178 invoked by alias); 15 Jun 2008 21:06:29 -0000 Received: (qmail 17157 invoked by uid 22791); 15 Jun 2008 21:06:26 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 15 Jun 2008 21:06:07 +0000 Received: (qmail 3792 invoked from network); 15 Jun 2008 21:06:05 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 15 Jun 2008 21:06:05 -0000 From: Pedro Alves Date: Sun, 15 Jun 2008 21:35:00 -0000 User-Agent: KMail/1.9.9 MIME-Version: 1.0 Content-Disposition: inline Subject: [non-stop] 09/10 Add "continue -a" and "interrupt -a" To: gdb-patches@sourceware.org Content-Type: Multipart/Mixed; boundary="Boundary-00=_BRYVI8Et7HaEd3S" Message-Id: <200806152206.09031.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-06/txt/msg00287.txt.bz2 --Boundary-00=_BRYVI8Et7HaEd3S Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 254 This adds "continue -a" and "interrupt -a" for non-stop mode, since in non-stop, execution commands apply only to the selected thread by default. The -a variants allow to resume all stopped thread, and to interrupt all running threads. -- Pedro Alves --Boundary-00=_BRYVI8Et7HaEd3S Content-Type: text/x-diff; charset="utf-8"; name="009-continue_all.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="009-continue_all.diff" Content-length: 6577 2008-06-15 Pedro Alves Add "continue -a" and "interrupt -a" options for non-stop mode. * infcmd.c (proceed_thread_callback, do_context_switch_to): New. (continue_command): Add "-a" option. (interrupt_target_command): Add "-a" option. (_initialize_infcmd): Add extend help of continue and interrupt command to mention the new "-a" option. Mark "continue" async ok. --- gdb/infcmd.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 100 insertions(+), 15 deletions(-) Index: src/gdb/infcmd.c =================================================================== --- src.orig/gdb/infcmd.c 2008-06-15 16:26:02.000000000 +0100 +++ src/gdb/infcmd.c 2008-06-15 16:26:09.000000000 +0100 @@ -608,16 +608,29 @@ 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; + + context_switch_to (thread->ptid); + clear_proceed_status (); + proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0); + return 0; +} + +/* continue [-a] [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. */ @@ -632,9 +645,27 @@ continue_command (char *proc_count_exp, async_disable_stdin (); } - /* If have argument (besides '&'), set proceed count of breakpoint - we stopped at. */ - if (proc_count_exp != NULL) + if (args != NULL) + { + if (strncmp (args, "-a", sizeof ("-a") - 1) == 0) + { + all_threads = 1; + args += sizeof ("-a") - 1; + if (*args == '\0') + args = NULL; + } + } + + if (!non_stop && all_threads) + error (_("`-a' is meaningless in all-stop mode.")); + + if (args != NULL && all_threads) + error (_("\ +Can't resume all threads and specify proceed count simultaneously.")); + + /* If we have an argument left, set proceed count of breakpoint we + stopped at. */ + if (args != NULL) { bpstat bs = stop_bpstat; int num, stat; @@ -644,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.". */ @@ -663,9 +694,32 @@ continue_command (char *proc_count_exp, if (from_tty) printf_filtered (_("Continuing.\n")); - clear_proceed_status (); + if (non_stop && all_threads) + { + struct cleanup *old_chain; + struct frame_id saved_frame_id; - proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0); + /* Don't error out if the current thread is running, because + there may be other stopped threads. */ + + /* Backup current thread and selected frame. */ + if (!is_running (inferior_ptid)) + saved_frame_id = get_frame_id (get_selected_frame (NULL)); + else + saved_frame_id = null_frame_id; + + old_chain = make_cleanup_restore_current_thread (inferior_ptid, saved_frame_id); + iterate_over_threads (proceed_thread_callback, NULL); + + /* Restore selected ptid. */ + do_cleanups (old_chain); + } + else + { + ensure_not_running (); + clear_proceed_status (); + proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0); + } } /* Step until outside of current statement. */ @@ -2097,16 +2151,38 @@ disconnect_command (char *args, int from } /* Stop the execution of the target while running in async mode, in - the backgound. */ + the backgound. In all-stop, stop the whole process. In non-stop + mode, stop the current thread only by default, or stop all threads + if the `-a' switch is used. */ + +/* interrupt [-a] */ void interrupt_target_command (char *args, int from_tty) { if (target_can_async_p ()) { + int all_threads = 0; + dont_repeat (); /* Not for the faint of heart */ + if (args != NULL + && strncmp (args, "-a", sizeof ("-a") - 1) == 0) + all_threads = 1; + + if (!non_stop && all_threads) + error (_("-a is meaningless in all-stop mode.")); + if (non_stop) - target_stop_ptid (inferior_ptid); + { + ptid_t ptid; + + if (all_threads) + ptid = minus_one_ptid; + else + ptid = inferior_ptid; + + target_stop_ptid (ptid); + } else target_stop (); } @@ -2311,13 +2387,19 @@ This command is a combination of tbreak if (xdb_commands) add_com_alias ("g", "go", class_run, 1); - add_com ("continue", class_run, continue_command, _("\ + c = add_com ("continue", class_run, continue_command, _("\ Continue program being debugged, after signal or breakpoint.\n\ If proceeding from breakpoint, a number N may be used as an argument,\n\ which means to set the ignore count of that breakpoint to N - 1 (so that\n\ -the breakpoint won't break until the Nth time it is reached).")); +the breakpoint won't break until the Nth time it is reached).\n\ +\n\ +If non-stop mode is enabled, continue only the current thread,\n\ +otherwise all the threads in the program are continued. To \n\ +continue all stopped threads in non-stop mode, use the -a option.\n\ +Specifying -a and an ignore count simultaneously is an error.")); add_com_alias ("c", "cont", class_run, 1); add_com_alias ("fg", "cont", class_run, 1); + set_cmd_async_ok (c); c = add_com ("run", class_run, run_command, _("\ Start debugged program. You may specify arguments to give it.\n\ @@ -2339,7 +2421,10 @@ You may specify arguments to give to you set_cmd_completer (c, filename_completer); c = add_com ("interrupt", class_run, interrupt_target_command, - _("Interrupt the execution of the debugged program.")); + _("Interrupt the execution of the debugged program.\n\ +If non-stop mode is enabled, interrupt only the current thread,\n\ +otherwise all the threads in the program are stopped. To \n\ +interrupt all running threads in non-stop mode, use the -a option.")); set_cmd_async_ok (c); add_info ("registers", nofp_registers_info, _("\ --Boundary-00=_BRYVI8Et7HaEd3S--