From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12575 invoked by alias); 13 Jul 2008 05:50:30 -0000 Received: (qmail 12566 invoked by uid 22791); 13 Jul 2008 05:50:29 -0000 X-Spam-Check-By: sourceware.org Received: from main.gmane.org (HELO ciao.gmane.org) (80.91.229.2) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sun, 13 Jul 2008 05:50:10 +0000 Received: from root by ciao.gmane.org with local (Exim 4.43) id 1KHuTC-0005pv-6A for gdb-patches@sources.redhat.com; Sun, 13 Jul 2008 05:50:06 +0000 Received: from 78.158.192.230 ([78.158.192.230]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 13 Jul 2008 05:50:02 +0000 Received: from vladimir by 78.158.192.230 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 13 Jul 2008 05:50:02 +0000 To: gdb-patches@sources.redhat.com From: Vladimir Prus Subject: Re: [MI non-stop 05/11, RFA] -exec-continue/-exec-interrupt --all Date: Sun, 13 Jul 2008 05:50:00 -0000 Message-ID: References: <200806282045.39438.vladimir@codesourcery.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="nextPart1256999.R5pCR7VBfU" Content-Transfer-Encoding: 7Bit User-Agent: KNode/0.10.9 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-07/txt/msg00257.txt.bz2 --nextPart1256999.R5pCR7VBfU Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8Bit Content-length: 320 Vladimir Prus wrote: > > Per MI non-stop spec, continue and interrupt need --all option > to resume every thread. Implemented thusly. OK? Here's what went in. There were mechanical adjustments since the continue and interrupt code was revised by Pedro per review comments. No functional changes, though. - Volodya --nextPart1256999.R5pCR7VBfU Content-Type: text/x-diff; name="all.diff" Content-Transfer-Encoding: 8Bit Content-Disposition: attachment; filename="all.diff" Content-length: 5182 commit 426f984015cb596e6119e41a3daa2a4785ed5974 Author: Vladimir Prus Date: Fri Jun 6 21:26:14 2008 +0400 -exec-continue/-exec-interrupt --all * infcmd.c (continue_1): New, extracted from (continue_command): ...here. (interrupt_target_1): New, extracted from (interrupt_target_command): ...here. * inferior.h (continue_1, interrupt_target_1): New. * mi/mi-main.c (mi_cmd_exec_continue) (mi_cmd_exec_interrupt): Handle --all. diff --git a/gdb/infcmd.c b/gdb/infcmd.c index f5fd018..0a40564 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -620,6 +620,31 @@ proceed_thread_callback (struct thread_info *thread, void *arg) return 0; } +void +continue_1 (int all_threads) +{ + if (non_stop && all_threads) + { + /* Don't error out if the current thread is running, because + there may be other stopped threads. */ + struct cleanup *old_chain; + + /* Backup current thread and selected frame. */ + old_chain = make_cleanup_restore_current_thread (); + + 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); + } +} + /* continue [-a] [proceed-count] [&] */ void continue_command (char *args, int from_tty) @@ -694,26 +719,7 @@ Can't resume all threads and specify proceed count simultaneously.")); if (from_tty) printf_filtered (_("Continuing.\n")); - if (non_stop && all_threads) - { - /* Don't error out if the current thread is running, because - there may be other stopped threads. */ - struct cleanup *old_chain; - - /* Backup current thread and selected frame. */ - old_chain = make_cleanup_restore_current_thread (); - - 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); - } + continue_1 (all_threads); } /* Step until outside of current statement. */ @@ -2146,6 +2152,17 @@ disconnect_command (char *args, int from_tty) deprecated_detach_hook (); } +void +interrupt_target_1 (int all_threads) +{ + ptid_t ptid; + if (all_threads) + ptid = minus_one_ptid; + else + ptid = inferior_ptid; + target_stop (ptid); +} + /* Stop the execution of the target while running in async mode, in the backgound. In all-stop, stop the whole process. In non-stop mode, stop the current thread only by default, or stop all threads @@ -2157,7 +2174,6 @@ interrupt_target_command (char *args, int from_tty) { if (target_can_async_p ()) { - ptid_t ptid; int all_threads = 0; dont_repeat (); /* Not for the faint of heart */ @@ -2169,12 +2185,7 @@ interrupt_target_command (char *args, int from_tty) if (!non_stop && all_threads) error (_("-a is meaningless in all-stop mode.")); - if (all_threads) - ptid = minus_one_ptid; - else - ptid = inferior_ptid; - - target_stop (ptid); + interrupt_target_1 (all_threads); } } diff --git a/gdb/inferior.h b/gdb/inferior.h index 60d0352..f53af8b 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -271,10 +271,14 @@ extern void nexti_command (char *, int); extern void stepi_command (char *, int); +extern void continue_1 (int all_threads); + extern void continue_command (char *, int); extern void interrupt_target_command (char *args, int from_tty); +extern void interrupt_target_1 (int all_threads); + /* Last signal that the inferior received (why it stopped). */ extern enum target_signal stop_signal; diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index f829a93..43f3a5f 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -163,8 +163,12 @@ mi_cmd_exec_return (char *command, char **argv, int argc) void mi_cmd_exec_continue (char *command, char **argv, int argc) { - /* FIXME: Should call a libgdb function, not a cli wrapper. */ - return mi_execute_async_cli_command ("continue", argv, argc); + if (argc == 0) + continue_1 (0); + else if (argc == 1 && strcmp (argv[0], "--all") == 0) + continue_1 (1); + else + error ("Usage: -exec-continue [--all]"); } /* Interrupt the execution of the target. Note how we must play around @@ -175,10 +179,22 @@ mi_cmd_exec_continue (char *command, char **argv, int argc) void mi_cmd_exec_interrupt (char *command, char **argv, int argc) { - if (!is_running (inferior_ptid)) - error ("mi_cmd_exec_interrupt: Inferior not running."); + if (argc == 0) + { + if (!is_running (inferior_ptid)) + error ("Current thread is not running."); - interrupt_target_command (NULL, 0); + interrupt_target_1 (0); + } + else if (argc == 1 && strcmp (argv[0], "--all") == 0) + { + if (!any_running ()) + error ("Inferior not running."); + + interrupt_target_1 (1); + } + else + error ("Usage: -exec-interrupt [--all]"); } void --nextPart1256999.R5pCR7VBfU--