2007-07-23 Michael Snyder <msnyder@access-company.com>
[deliverable/binutils-gdb.git] / gdb / linux-fork.c
index 88bea6169ba94de41a7b9d1fd83b6cf0d348958c..9f0c0d11277eced146b911e91a5c5b61fbdd6b99 100644 (file)
@@ -1,6 +1,6 @@
 /* GNU/Linux native-dependent code for debugging multiple forks.
 
-   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -27,6 +27,7 @@
 #include "gdb_assert.h"
 #include "gdb_string.h"
 #include "linux-fork.h"
+#include "linux-nat.h"
 
 #include <sys/ptrace.h>
 #include <sys/wait.h>
@@ -84,7 +85,7 @@ add_fork (pid_t pid)
     }
 
   fp = XZALLOC (struct fork_info);
-  fp->ptid = pid_to_ptid (pid);
+  fp->ptid = ptid_build (pid, pid, 0);
   fp->num = ++highest_fork_num;
   fp->next = fork_list;
   fork_list = fp;
@@ -241,16 +242,14 @@ fork_load_infrun_state (struct fork_info *fp)
 
   inferior_ptid = fp->ptid;
 
+  linux_nat_switch_fork (inferior_ptid);
+
   if (fp->savedregs && fp->clobber_regs)
-    regcache_cpy (current_regcache, fp->savedregs);
+    regcache_cpy (get_current_regcache (), fp->savedregs);
 
   registers_changed ();
   reinit_frame_cache ();
 
-  /* We must select a new frame before making any inferior calls to
-     avoid warnings.  */
-  select_frame (get_current_frame ());
-
   stop_pc = read_pc ();
   nullify_last_target_wait_ptid ();
 
@@ -279,7 +278,7 @@ fork_save_infrun_state (struct fork_info *fp, int clobber_regs)
   if (fp->savedregs)
     regcache_xfree (fp->savedregs);
 
-  fp->savedregs = regcache_dup (current_regcache);
+  fp->savedregs = regcache_dup (get_current_regcache ());
   fp->clobber_regs = clobber_regs;
   fp->pc = read_pc ();
 
@@ -445,9 +444,18 @@ info_forks_command (char *arg, int from_tty)
   struct fork_info *fp;
   int cur_line;
   ULONGEST pc;
+  int requested = -1;
+  struct fork_info *printed = NULL;
+
+  if (arg && *arg)
+    requested = (int) parse_and_eval_long (arg);
 
   for (fp = fork_list; fp; fp = fp->next)
     {
+      if (requested > 0 && fp->num != requested)
+       continue;
+
+      printed = fp;
       if (ptid_equal (fp->ptid, inferior_ptid))
        {
          printf_filtered ("* ");
@@ -487,6 +495,13 @@ info_forks_command (char *arg, int from_tty)
 
       putchar_filtered ('\n');
     }
+  if (printed == NULL)
+    {
+      if (requested > 0)
+       printf_filtered (_("No fork number %d.\n"), requested);
+      else
+       printf_filtered (_("No forks.\n"));
+    }
 }
 
 /* Save/restore mode variable 'detach_fork':
@@ -667,17 +682,19 @@ Fork a duplicate process (experimental)."));
 restart <n>: restore program context from a checkpoint.\n\
 Argument 'n' is checkpoint ID, as displayed by 'info checkpoints'."));
 
-  /* Delete-checkpoint command: kill the process and remove it from
+  /* Delete checkpoint command: kill the process and remove it from
      fork list.  */
 
-  add_com ("delete-checkpoint", class_obscure, delete_fork_command, _("\
-Delete a fork/checkpoint (experimental)."));
+  add_cmd ("checkpoint", class_obscure, delete_fork_command, _("\
+Delete a fork/checkpoint (experimental)."),
+          &deletelist);
 
-  /* Detach-checkpoint command: release the process to run independantly, 
+  /* Detach checkpoint command: release the process to run independently, 
      and remove it from the fork list.  */
 
-  add_com ("detach-checkpoint", class_obscure, detach_fork_command, _("\
-Detach from a fork/checkpoint (experimental)."));
+  add_cmd ("checkpoint", class_obscure, detach_fork_command, _("\
+Detach from a fork/checkpoint (experimental)."),
+          &detachlist);
 
   /* Info checkpoints command: list all forks/checkpoints 
      currently under gdb's control.  */
@@ -688,8 +705,8 @@ Detach from a fork/checkpoint (experimental)."));
   /* Command aliases (let "fork" and "checkpoint" be used 
      interchangeably).  */
 
-  add_com_alias ("delete-fork", "delete-checkpoint", class_obscure, 1);
-  add_com_alias ("detach-fork", "detach-checkpoint", class_obscure, 1);
+  add_alias_cmd ("fork", "checkpoint", class_obscure, 1, &deletelist);
+  add_alias_cmd ("fork", "checkpoint", class_obscure, 1, &detachlist);
   add_info_alias ("forks", "checkpoints", 0);
 
   /* "fork <n>" (by analogy to "thread <n>").  */
This page took 0.027316 seconds and 4 git commands to generate.