diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2018-12-31 22:20:56 +0000 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2019-01-03 21:24:02 +0000 |
commit | 169bb27bce3dc43b2bb5f6abf7fc21c19de5454a (patch) | |
tree | 53d44279a7d4e81306d70eea2c0234eece5f2eaa /gdb/linux-nat.c | |
parent | a07c88800e88e26fc3a746739f0d2cc8abd30c5d (diff) | |
download | gdb-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/linux-nat.c')
-rw-r--r-- | gdb/linux-nat.c | 27 |
1 files changed, 16 insertions, 11 deletions
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 { |