aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2018-12-31 22:20:56 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2019-01-03 21:24:02 +0000
commit169bb27bce3dc43b2bb5f6abf7fc21c19de5454a (patch)
tree53d44279a7d4e81306d70eea2c0234eece5f2eaa /gdb
parenta07c88800e88e26fc3a746739f0d2cc8abd30c5d (diff)
downloadgdb-169bb27bce3dc43b2bb5f6abf7fc21c19de5454a.zip
gdb-169bb27bce3dc43b2bb5f6abf7fc21c19de5454a.tar.gz
gdb-169bb27bce3dc43b2bb5f6abf7fc21c19de5454a.tar.bz2
gdb: Remove cleanup from linux_nat_target::follow_fork
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/linux-nat.c27
2 files changed, 24 insertions, 11 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e1bd349..da92e3f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 7286207..73d4fd1 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
{