Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Pedro Alves <pedro@codesourcery.com>
To: gdb-patches@sourceware.org
Subject: Re: [non-stop] 09/10 Add "continue -a" and "interrupt -a"
Date: Wed, 02 Jul 2008 03:35:00 -0000	[thread overview]
Message-ID: <200807020435.32010.pedro@codesourcery.com> (raw)
In-Reply-To: <20080625202451.GI25575@caradoc.them.org>

[-- Attachment #1: Type: text/plain, Size: 724 bytes --]

A Wednesday 25 June 2008 21:24:51, Daniel Jacobowitz wrote:
> On Sun, Jun 15, 2008 at 10:06:08PM +0100, Pedro Alves wrote:
> > 2008-06-15  Pedro Alves  <pedro@codesourcery.com>
> >
> > 	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.
>
> With documentation, this is OK.

Ack.

Here is the same patch refreshed against HEAD.  Mainly to ease
the review of the next patch in the series.

-- 
Pedro Alves

[-- Attachment #2: 009-continue_all.diff --]
[-- Type: text/x-diff, Size: 6519 bytes --]

2008-07-01  Pedro Alves  <pedro@codesourcery.com>

	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 |  112 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 97 insertions(+), 15 deletions(-)

Index: src/gdb/infcmd.c
===================================================================
--- src.orig/gdb/infcmd.c	2008-06-30 16:31:23.000000000 +0100
+++ src/gdb/infcmd.c	2008-06-30 22:30:42.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);
+    }
 }
 \f
 /* Step until outside of current statement.  */
@@ -2097,15 +2151,34 @@ 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 ())
     {
+      ptid_t ptid;
+      int all_threads = 0;
+
       dont_repeat ();		/* Not for the faint of heart */
 
-      target_stop (inferior_ptid);
+      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 (all_threads)
+	ptid = minus_one_ptid;
+      else
+	ptid = inferior_ptid;
+
+      target_stop (ptid);
     }
 }
 
@@ -2308,13 +2381,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\
@@ -2336,7 +2415,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, _("\

      reply	other threads:[~2008-07-02  3:35 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-15 21:35 Pedro Alves
2008-06-15 22:19 ` Eli Zaretskii
2008-06-25 21:23 ` Daniel Jacobowitz
2008-07-02  3:35   ` Pedro Alves [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200807020435.32010.pedro@codesourcery.com \
    --to=pedro@codesourcery.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox