Implement '-target-detach pid'.
authorVladimir Prus <vladimir@codesourcery.com>
Mon, 17 Nov 2008 16:37:35 +0000 (16:37 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Mon, 17 Nov 2008 16:37:35 +0000 (16:37 +0000)
        * infcmd.c (detach_command): Make nonstatic.
        * inferior.h (detach_command): Declare.
        * mi/mi-cmds.c (mi_cmds): Don't route -target-detach via CLI.
        * mi/mi-cmds.h (mi_cmd_target_detach): Declare.
        * mi/mi-main.c (find_thread_of_process, mi_cmd_target_detach): New.

gdb/ChangeLog
gdb/infcmd.c
gdb/inferior.h
gdb/mi/mi-cmds.c
gdb/mi/mi-cmds.h
gdb/mi/mi-main.c

index b32b96ceeea5dc027bdf33b0505d92e9f5b0a606..64e8eeeda5073a4e93777a22dc7de9d29382016f 100644 (file)
@@ -1,3 +1,13 @@
+2008-11-17  Vladimir Prus  <vladimir@codesourcery.com>
+
+       Implement '-target-detach pid'.
+
+        * infcmd.c (detach_command): Make nonstatic.
+        * inferior.h (detach_command): Declare.
+        * mi/mi-cmds.c (mi_cmds): Don't route -target-detach via CLI.
+        * mi/mi-cmds.h (mi_cmd_target_detach): Declare.
+        * mi/mi-main.c (find_thread_of_process, mi_cmd_target_detach): New.
+
 2008-11-17  Vladimir Prus  <vladimir@codesourcery.com>
 
        Include group-id in thread-created notification.
index b3af31fc171a2fbf04edc1b5633a76289dfbacd3..810b3b706fcb814b04650bf8dfea0c91a1e3a9e5 100644 (file)
@@ -86,8 +86,6 @@ static void unset_command (char *, int);
 
 static void float_info (char *, int);
 
-static void detach_command (char *, int);
-
 static void disconnect_command (char *, int);
 
 static void unset_environment_command (char *, int);
@@ -2344,7 +2342,7 @@ attach_command (char *args, int from_tty)
  * started via the normal ptrace (PTRACE_TRACEME).
  */
 
-static void
+void
 detach_command (char *args, int from_tty)
 {
   dont_repeat ();              /* Not for the faint of heart.  */
index 1be6cc5c11ad701edd0192fdf4a2032500926b82..f004d44ecf40965bf08e62547ade1d9c73f64dcb 100644 (file)
@@ -269,6 +269,8 @@ extern void interrupt_target_command (char *args, int from_tty);
 
 extern void interrupt_target_1 (int all_threads);
 
+extern void detach_command (char *, int);
+
 /* Address at which inferior stopped.  */
 
 extern CORE_ADDR stop_pc;
index d38de35da40addd226ff42c6ab67278e0d662672..51c720e22dd067b0957c3134f8f13837112baaca 100644 (file)
@@ -121,7 +121,7 @@ struct mi_cmd mi_cmds[] =
   { "symbol-type", { NULL, 0 }, NULL },
   { "target-attach", { "attach", 1 }, NULL },
   { "target-compare-sections", { NULL, 0 }, NULL },
-  { "target-detach", { "detach", 0 }, 0 },
+  { "target-detach", { NULL, 0 }, mi_cmd_target_detach },
   { "target-disconnect", { "disconnect", 0 }, 0 },
   { "target-download", { "load", 1 }, NULL},
   { "target-exec-status", { NULL, 0 }, NULL },
index a9bb1e0978b5c29a741f1f5a5d5bb52b34e51c19..a399b9e141c0379fe152e75f76ca6482b06f5e72 100644 (file)
@@ -75,6 +75,7 @@ extern mi_cmd_argv_ftype mi_cmd_stack_list_frames;
 extern mi_cmd_argv_ftype mi_cmd_stack_list_locals;
 extern mi_cmd_argv_ftype mi_cmd_stack_select_frame;
 extern mi_cmd_argv_ftype mi_cmd_symbol_list_lines;
+extern mi_cmd_argv_ftype mi_cmd_target_detach;
 extern mi_cmd_argv_ftype mi_cmd_target_file_get;
 extern mi_cmd_argv_ftype mi_cmd_target_file_put;
 extern mi_cmd_argv_ftype mi_cmd_target_file_delete;
index f739bbb85334a46f708919f7b6a2f39beea0773c..ad4ed0c268023360ef409e477e230e2fd716375b 100644 (file)
@@ -199,6 +199,42 @@ mi_cmd_exec_interrupt (char *command, char **argv, int argc)
     error ("Usage: -exec-interrupt [--all]");
 }
 
+static int
+find_thread_of_process (struct thread_info *ti, void *p)
+{
+  int pid = *(int *)p;
+  if (PIDGET (ti->ptid) == pid && !is_exited (ti->ptid))
+    return 1;
+
+  return 0;
+}
+
+void
+mi_cmd_target_detach (char *command, char **argv, int argc)
+{
+  if (argc != 0 && argc != 1)
+    error ("Usage: -target-detach [thread-group]");
+
+  if (argc == 1)
+    {
+      struct thread_info *tp;
+      char *end = argv[0];
+      int pid = strtol (argv[0], &end, 10);
+      if (*end != '\0')
+       error (_("Cannot parse thread group id '%s'"), argv[0]);
+
+      /* Pick any thread in the desired process.  Current
+        target_detach deteches from the parent of inferior_ptid.  */
+      tp = iterate_over_threads (find_thread_of_process, &pid);
+      if (!tp)
+       error (_("Thread group is empty"));
+
+      switch_to_thread (tp->ptid);
+    }
+
+  detach_command (NULL, 0);
+}
+
 void
 mi_cmd_thread_select (char *command, char **argv, int argc)
 {