]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* target.h (struct target_ops) <to_supports_multi_process>: New
authorPedro Alves <palves@redhat.com>
Mon, 27 Oct 2008 12:43:24 +0000 (12:43 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 27 Oct 2008 12:43:24 +0000 (12:43 +0000)
field.
(target_supports_multi_process): New define.
* target.c (update_current_target): Inherit and de_fault
to_supports_multi_process.
* infcmd.c (attach_command): Allow attaching to multiple processes
if the target supports it.
(detach_command): If the target claims there is still execution,
don't clear the thread list.
* remote.c (remote_supports_multi_process): New.
(init_remote_ops): Register remote_supports_multi_process.

gdb/ChangeLog
gdb/infcmd.c
gdb/remote.c
gdb/target.c
gdb/target.h

index 93a81e58565baf026fb6a4ac95a88cd4a8a3d2e9..9744041f0581be0e819b7c4ed5df51e2d9fe0db5 100644 (file)
@@ -1,3 +1,17 @@
+2008-10-27  Pedro Alves  <pedro@codesourcery.com>
+
+       * target.h (struct target_ops) <to_supports_multi_process>: New
+       field.
+       (target_supports_multi_process): New define.
+       * target.c (update_current_target): Inherit and de_fault
+       to_supports_multi_process.
+       * infcmd.c (attach_command): Allow attaching to multiple processes
+       if the target supports it.
+       (detach_command): If the target claims there is still execution,
+       don't clear the thread list.
+       * remote.c (remote_supports_multi_process): New.
+       (init_remote_ops): Register remote_supports_multi_process.
+
 2008-10-27  Pedro Alves  <pedro@codesourcery.com>
 
        * Makefile.in (.y.c, .l.c): sed free to xfree.
index 1854985d47f4353fd758088a62a4a745acde2258..28ce813869b0006459311cc1812383a8624327e0 100644 (file)
@@ -2201,7 +2201,10 @@ attach_command (char *args, int from_tty)
 
   dont_repeat ();              /* Not for the faint of heart */
 
-  if (target_has_execution)
+  if (target_supports_multi_process ())
+    /* Don't complain if we can be attached to multiple processes.  */
+    ;
+  else if (target_has_execution)
     {
       if (query ("A program is being debugged already.  Kill it? "))
        target_kill ();
@@ -2311,7 +2314,12 @@ detach_command (char *args, int from_tty)
   dont_repeat ();              /* Not for the faint of heart.  */
   target_detach (args, from_tty);
   no_shared_libraries (NULL, from_tty);
-  init_thread_list ();
+
+  /* If the current target interface claims there's still execution,
+     then don't mess with threads of other processes.  */
+  if (!target_has_execution)
+    init_thread_list ();
+
   if (deprecated_detach_hook)
     deprecated_detach_hook ();
 }
index da0a429aed09d7f102d984ab3eec33a55334222e..6af826783737be3082f01df9522bcf9bd6fa2b13 100644 (file)
@@ -8554,6 +8554,13 @@ remote_supports_non_stop (void)
   return 1;
 }
 
+static int
+remote_supports_multi_process (void)
+{
+  struct remote_state *rs = get_remote_state ();
+  return remote_multi_process_p (rs);
+}
+
 static void
 init_remote_ops (void)
 {
@@ -8616,6 +8623,7 @@ Specify the serial device it is connected to\n\
   remote_ops.to_terminal_inferior = remote_terminal_inferior;
   remote_ops.to_terminal_ours = remote_terminal_ours;
   remote_ops.to_supports_non_stop = remote_supports_non_stop;
+  remote_ops.to_supports_multi_process = remote_supports_multi_process;
 }
 
 /* Set up the extended remote vector by making a copy of the standard
index b5cad3599a5e32bd580ffd64422b01875fd5305c..0976ad1bf56f4b1ef10bb51deb37159cfebf8662 100644 (file)
@@ -471,6 +471,7 @@ update_current_target (void)
       /* Do not inherit to_read_description.  */
       INHERIT (to_get_ada_task_ptid, t);
       /* Do not inherit to_search_memory.  */
+      INHERIT (to_supports_multi_process, t);
       INHERIT (to_magic, t);
       /* Do not inherit to_memory_map.  */
       /* Do not inherit to_flash_erase.  */
@@ -638,6 +639,9 @@ update_current_target (void)
   de_fault (to_get_ada_task_ptid,
             (ptid_t (*) (long, long))
             default_get_ada_task_ptid);
+  de_fault (to_supports_multi_process,
+           (int (*) (void))
+           return_zero);
 #undef de_fault
 
   /* Finally, position the target-stack beneath the squashed
index 9ec8f5d79542944d7697e5b6d276e1aece531a8a..a010d2d165d3549165a7817cb40a64e2bf858d4f 100644 (file)
@@ -536,6 +536,10 @@ struct target_ops
     /* Can target execute in reverse?  */
     int (*to_can_execute_reverse) ();
 
+    /* Does this target support debugging multiple processes
+       simultaneously?  */
+    int (*to_supports_multi_process) (void);
+
     int to_magic;
     /* Need sub-structure for target machine related rather than comm related?
      */
@@ -647,6 +651,12 @@ extern void target_resume (ptid_t ptid, int step, enum target_signal signal);
 #define        target_prepare_to_store(regcache)       \
      (*current_target.to_prepare_to_store) (regcache)
 
+/* Returns true if this target can debug multiple processes
+   simultaneously.  */
+
+#define        target_supports_multi_process() \
+     (*current_target.to_supports_multi_process) ()
+
 extern DCACHE *target_dcache;
 
 extern int target_read_string (CORE_ADDR, char **, int, int *);