Make "checkpoint" not rely on inferior_ptid
authorPedro Alves <palves@redhat.com>
Wed, 6 Mar 2019 18:29:17 +0000 (18:29 +0000)
committerPedro Alves <palves@redhat.com>
Wed, 6 Mar 2019 18:29:17 +0000 (18:29 +0000)
Don't rely on "inferior_ptid" deep within add_fork.  In the
multi-target branch, I'm forcing inferior_ptid to null_ptid early in
infrun event handling to make sure we don't inadvertently rely on the
current thread/target when we shouldn't, and that caught some bad or
unnecessary assumptions throughout.

gdb/ChangeLog:
2019-03-06  Pedro Alves  <palves@redhat.com>

* linux-fork.c (new_fork): New, split out of ...
(add_fork): ... this.  Return void.  Move "first fork" special
case from here, to ...
(checkpoint_command): ... here.
* linux-linux.h (add_fork): Return void.

gdb/ChangeLog
gdb/linux-fork.c
gdb/linux-fork.h

index 8866756ff04e3bd0fbf27bc82aaf5d43e55c4000..3aaa5ed13706d9406072f8e723912f3648e96fe3 100644 (file)
@@ -1,3 +1,11 @@
+2019-03-06  Pedro Alves  <palves@redhat.com>
+
+       * linux-fork.c (new_fork): New, split out of ...
+       (add_fork): ... this.  Return void.  Move "first fork" special
+       case from here, to ...
+       (checkpoint_command): ... here.
+       * linux-linux.h (add_fork): Return void.
+
 2019-03-06  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * f-exp.y (direct_abs_decl): Handle TYPE*SIZE type names.
index b1b390c5c6e0dc52e9b516bf22f59e219667ea46..a748deaa3a2084921ac60148a81e2aed80d3e372 100644 (file)
@@ -76,29 +76,30 @@ find_last_fork (void)
   return last;
 }
 
-/* Add a fork to the internal fork list.  */
+/* Allocate a new fork.  */
 
-struct fork_info *
-add_fork (pid_t pid)
+static struct fork_info *
+new_fork (pid_t pid)
 {
   struct fork_info *fp;
 
-  if (fork_list == NULL && pid != inferior_ptid.pid ())
-    {
-      /* Special case -- if this is the first fork in the list
-        (the list is hitherto empty), and if this new fork is
-        NOT the current inferior_ptid, then add inferior_ptid
-        first, as a special zeroeth fork id.  */
-      highest_fork_num = -1;
-      add_fork (inferior_ptid.pid ()); /* safe recursion */
-    }
-
   fp = XCNEW (struct fork_info);
   fp->ptid = ptid_t (pid, pid, 0);
-  fp->num = ++highest_fork_num;
+  return fp;
+}
+
+/* Add a new fork to the internal fork list.  */
+
+void
+add_fork (pid_t pid)
+{
+  struct fork_info *fp = new_fork (pid);
 
   if (fork_list == NULL)
-    fork_list = fp;
+    {
+      fork_list = fp;
+      highest_fork_num = 0;
+    }
   else
     {
       struct fork_info *last = find_last_fork ();
@@ -106,7 +107,7 @@ add_fork (pid_t pid)
       last->next = fp;
     }
 
-  return fp;
+  fp->num = ++highest_fork_num;
 }
 
 static void
@@ -760,6 +761,17 @@ checkpoint_command (const char *args, int from_tty)
 
   if (!fp)
     error (_("Failed to find new fork"));
+
+  if (fork_list->next == NULL)
+    {
+      /* Special case -- if this is the first fork in the list (the
+        list was hitherto empty), then add inferior_ptid first, as a
+        special zeroeth fork id.  */
+      fork_info *first = new_fork (inferior_ptid.pid ());
+      first->next = fork_list;
+      fork_list = first;
+    }
+
   fork_save_infrun_state (fp, 1);
   fp->parent_ptid = last_target_ptid;
 }
index e6f130438cf5ffa14cbab31bd2a8bfbc343fd70f..f918bcb3d9eb688f0d0f28801af122f451aef1ce 100644 (file)
@@ -21,7 +21,7 @@
 #define LINUX_FORK_H
 
 struct fork_info;
-extern struct fork_info *add_fork (pid_t);
+extern void add_fork (pid_t);
 extern struct fork_info *find_fork_pid (pid_t);
 extern void linux_fork_killall (void);
 extern void linux_fork_mourn_inferior (void);