From: Andrew Burgess <aburgess@redhat.com>
To: gdb-patches@sourceware.org
Subject: [PATCHv2 1/7] gdb/remote: remove some manual reference count handling
Date: Sun, 2 Oct 2022 18:04:42 +0100 [thread overview]
Message-ID: <5c946ed5f149bc1a1491bf30750ae1d61e9c81ea.1664729721.git.aburgess@redhat.com> (raw)
In-Reply-To: <cover.1664729721.git.aburgess@redhat.com>
While working on some other target_ops reference count related code, I
spotted that in remote.c we do some manual reference count handling,
i.e. we call target_ops::incref and decref_target (which wraps
target_ops::decref).
I think it would be better to make use of gdb::ref_ptr to automate the
reference count management.
So, this commit updates scoped_mark_target_starting in two ways,
first, I use gdb::ref_ptr to handle the reference counts. Then,
instead of using the scoped_mark_target_starting constructor and
destructor to set and reset the starting_up flag, I now use a
scoped_restore_tmpl object to set and restore the flag.
The above changes mean that the scoped_mark_target_starting destructor
can be completely removed, and the constructor body is now empty.
I've also fixed a typo in the class comment.
The only change in behaviour after this commit is that previously we
didn't care what the value of starting_up was, we just set it to true
in the constructor and false in the destructor.
Now, I assert that the flag is initially false, then set the flag true
when the scoped_mark_target_starting is created.
As the starting_up flag is initialized to false then, for the assert
to fire, we would need to recursively enter
remote_target::start_remote_1, which I don't think is something we
should be doing, so I think the new assert is an improvement.
---
gdb/remote.c | 38 ++++++++++++++++++++++----------------
1 file changed, 22 insertions(+), 16 deletions(-)
diff --git a/gdb/remote.c b/gdb/remote.c
index 2f6cb2d01ee..5a71c41d61e 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -4706,7 +4706,7 @@ remote_target::process_initial_stop_replies (int from_tty)
}
}
-/* Mark a remote_target as marking (by setting the starting_up flag within
+/* Mark a remote_target as starting (by setting the starting_up flag within
its remote_state) for the lifetime of this object. The reference count
on the remote target is temporarily incremented, to prevent the target
being deleted under our feet. */
@@ -4716,26 +4716,32 @@ struct scoped_mark_target_starting
/* Constructor, TARGET is the target to be marked as starting, its
reference count will be incremented. */
scoped_mark_target_starting (remote_target *target)
- : m_remote_target (target)
- {
- m_remote_target->incref ();
- remote_state *rs = m_remote_target->get_remote_state ();
- rs->starting_up = true;
- }
+ : m_remote_target (remote_target_ref::new_reference (target)),
+ m_restore_starting_up (set_starting_up_flag (target))
+ { /* Nothing. */ }
+
+private:
- /* Destructor, mark the target being worked on as no longer starting, and
- decrement the reference count. */
- ~scoped_mark_target_starting ()
+ /* Helper function, set the starting_up flag on TARGET and return an
+ object which, when it goes out of scope, will restore the previous
+ value of the starting_up flag. */
+ static scoped_restore_tmpl<bool>
+ set_starting_up_flag (remote_target *target)
{
- remote_state *rs = m_remote_target->get_remote_state ();
- rs->starting_up = false;
- decref_target (m_remote_target);
+ remote_state *rs = target->get_remote_state ();
+ gdb_assert (!rs->starting_up);
+ return make_scoped_restore (&rs->starting_up, true);
}
-private:
+ /* A gdb::ref_ptr pointer to a remote_target. */
+ using remote_target_ref = gdb::ref_ptr<remote_target, target_ops_ref_policy>;
+
+ /* A reference to the target on which we are operating. */
+ remote_target_ref m_remote_target;
- /* The target on which we are operating. */
- remote_target *m_remote_target;
+ /* An object which restores the previous value of the starting_up flag
+ when it goes out of scope. */
+ scoped_restore_tmpl<bool> m_restore_starting_up;
};
/* Helper for remote_target::start_remote, start the remote connection and
--
2.25.4
next prev parent reply other threads:[~2022-10-02 17:04 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-21 13:12 [PATCH] gdb: fix target_ops reference count for some cases Andrew Burgess
2022-09-21 15:30 ` Simon Marchi
2022-09-22 14:21 ` Andrew Burgess
2022-09-22 14:52 ` Simon Marchi
2022-09-22 15:00 ` Simon Marchi
2022-09-22 17:24 ` Andrew Burgess
2022-09-26 14:16 ` Simon Marchi
2022-10-01 20:58 ` Andrew Burgess
2022-10-02 17:04 ` [PATCHv2 0/7] " Andrew Burgess
2022-10-02 17:04 ` Andrew Burgess [this message]
2022-10-02 17:04 ` [PATCHv2 2/7] gdb: remove decref_target Andrew Burgess
2022-10-02 17:04 ` [PATCHv2 3/7] gdb: have target_stack automate reference count handling Andrew Burgess
2022-10-02 17:04 ` [PATCHv2 4/7] gdb: remove the pop_all_targets (and friends) global functions Andrew Burgess
2022-10-05 20:49 ` Lancelot SIX
2022-10-06 11:14 ` Andrew Burgess
2022-10-02 17:04 ` [PATCHv2 5/7] gdb: ensure all targets are popped before an inferior is destructed Andrew Burgess
2022-10-02 17:04 ` [PATCHv2 6/7] gdb/maint: add core file name to 'maint info program-spaces' output Andrew Burgess
2022-10-02 17:21 ` Eli Zaretskii
2022-10-02 17:04 ` [PATCHv2 7/7] gdb: some process_stratum_target should not be shared Andrew Burgess
2022-10-02 17:21 ` Eli Zaretskii
2022-10-05 21:15 ` Lancelot SIX
2022-10-06 11:44 ` Andrew Burgess
2022-11-18 16:42 ` [PATCHv3 0/7] gdb: fix target_ops reference count for some cases Andrew Burgess
2022-11-18 16:42 ` [PATCHv3 1/7] gdb/remote: remove some manual reference count handling Andrew Burgess
2022-11-18 16:42 ` [PATCHv3 2/7] gdb: remove decref_target Andrew Burgess
2022-11-18 17:22 ` Tom Tromey
2022-11-18 16:42 ` [PATCHv3 3/7] gdb: have target_stack automate reference count handling Andrew Burgess
2022-11-18 17:25 ` Tom Tromey
2022-11-18 16:42 ` [PATCHv3 4/7] gdb: remove the pop_all_targets (and friends) global functions Andrew Burgess
2022-11-18 17:29 ` Tom Tromey
2022-11-18 16:42 ` [PATCHv3 5/7] gdb: ensure all targets are popped before an inferior is destructed Andrew Burgess
2022-11-18 16:42 ` [PATCHv3 6/7] gdb/maint: add core file name to 'maint info program-spaces' output Andrew Burgess
2022-11-18 17:03 ` Eli Zaretskii
2022-11-18 16:42 ` [PATCHv3 7/7] gdb: some process_stratum_target should not be shared Andrew Burgess
2022-11-18 17:02 ` Eli Zaretskii
2022-11-18 18:04 ` Tom Tromey
2022-12-14 13:57 ` Andrew Burgess
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5c946ed5f149bc1a1491bf30750ae1d61e9c81ea.1664729721.git.aburgess@redhat.com \
--to=aburgess@redhat.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).