[6/6] gdb: Remove cleanup from linux_nat_target::follow_fork

Message ID 97a0b30452b34e2859f345b0afeab1fbb586b087.1546382416.git.andrew.burgess@embecosm.com
State New, archived
Headers

Commit Message

Andrew Burgess Jan. 1, 2019, 10:45 p.m. UTC
  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   |  8 ++++++++
 gdb/linux-nat.c | 27 ++++++++++++++++-----------
 2 files changed, 24 insertions(+), 11 deletions(-)
  

Comments

Tom Tromey Jan. 2, 2019, 3:18 p.m. UTC | #1
>>>>> "Andrew" == Andrew Burgess <andrew.burgess@embecosm.com> writes:

Andrew> Remove cleanup from linux_nat_target::follow_fork, instead add a new
Andrew> unique_ptr specialisation for holding lwp_info pointers and use this
Andrew> to ensure the pointer is cleaned up when needed.

Andrew> gdb/ChangeLog:

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

Thanks, this is ok.

Tom
  

Patch

diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 7286207dd49..73d4fd193ae 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -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
 	{