gdb: Remove cleanup from linux_nat_target::follow_fork
authorAndrew Burgess <andrew.burgess@embecosm.com>
Mon, 31 Dec 2018 22:20:56 +0000 (22:20 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 3 Jan 2019 21:24:02 +0000 (21:24 +0000)
Remove cleanup from linux_nat_target::follow_fork, instead add a new
unique_ptr specialisation for holding lwp_info pointers and use this
to ensure the pointer is cleaned up when needed.

gdb/ChangeLog:

* linux-nat.c (delete_lwp_cleanup): Delete.
(struct lwp_deleter): New struct.
(lwp_info_up): New typedef.
(linux_nat_target::follow_fork): Delete cleanup, and make use of
lwp_info_up.

gdb/ChangeLog
gdb/linux-nat.c

index e1bd349..da92e3f 100644 (file)
@@ -1,5 +1,13 @@
 2019-01-03  Andrew Burgess  <andrew.burgess@embecosm.com>
 
+       * linux-nat.c (delete_lwp_cleanup): Delete.
+       (struct lwp_deleter): New struct.
+       (lwp_info_up): New typedef.
+       (linux_nat_target::follow_fork): Delete cleanup, and make use of
+       lwp_info_up.
+
+2019-01-03  Andrew Burgess  <andrew.burgess@embecosm.com>
+
        * linux-fork.c (class scoped_switch_fork_info): New class.
        (inferior_call_waitpid): Update to use scoped_switch_fork_info.
 
index 7286207..73d4fd1 100644 (file)
@@ -425,15 +425,19 @@ num_lwps (int pid)
   return count;
 }
 
-/* Call delete_lwp with prototype compatible for make_cleanup.  */
+/* Deleter for lwp_info unique_ptr specialisation.  */
 
-static void
-delete_lwp_cleanup (void *lp_voidp)
+struct lwp_deleter
 {
-  struct lwp_info *lp = (struct lwp_info *) lp_voidp;
+  void operator() (struct lwp_info *lwp) const
+  {
+    delete_lwp (lwp->ptid);
+  }
+};
 
-  delete_lwp (lp->ptid);
-}
+/* A unique_ptr specialisation for lwp_info.  */
+
+typedef std::unique_ptr<struct lwp_info, lwp_deleter> lwp_info_up;
 
 /* Target hook for follow_fork.  On entry inferior_ptid must be the
    ptid of the followed inferior.  At return, inferior_ptid will be
@@ -466,10 +470,13 @@ linux_nat_target::follow_fork (int follow_child, int detach_fork)
        {
          int child_stop_signal = 0;
          bool detach_child = true;
-         struct cleanup *old_chain = make_cleanup (delete_lwp_cleanup,
-                                                   child_lp);
 
-         linux_target->low_prepare_to_resume (child_lp);
+         /* Move CHILD_LP into a unique_ptr and clear the source pointer
+            to prevent us doing anything stupid with it.  */
+         lwp_info_up child_lp_ptr (child_lp);
+         child_lp = nullptr;
+
+         linux_target->low_prepare_to_resume (child_lp_ptr.get ());
 
          /* When debugging an inferior in an architecture that supports
             hardware single stepping on a kernel without commit
@@ -508,8 +515,6 @@ linux_nat_target::follow_fork (int follow_child, int detach_fork)
                signo = 0;
              ptrace (PTRACE_DETACH, child_pid, 0, signo);
            }
-
-         do_cleanups (old_chain);
        }
       else
        {