This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC] 09/10 Add "continue --all"


In non-stop mode, exec commands apply only to the current thread.
We can add a mechanism to resume all threads.  In a frontend
perpective, I'm not clear if we should implement
-exec-continue --all, -exec-continue --thread="all", or just
require the frontend to do the:

for each thread in stopped threads
  resume thread
done

In CLI,  "thread apply all continue&" works too, but it feels
to longuish to type?

Opinions?  Import mi-getopt into common code and use it in CLI?

-- 
Pedro Alves
2008-05-06  Pedro Alves  <pedro@codesourcery.com>

	* 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, &current_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.  */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]