public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb/remote: remove some manual reference count handling
@ 2022-12-14 13:57 Andrew Burgess
  0 siblings, 0 replies; only message in thread
From: Andrew Burgess @ 2022-12-14 13:57 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=45664f164a0a46612d06e7a91b0b0454f670f8db

commit 45664f164a0a46612d06e7a91b0b0454f670f8db
Author: Andrew Burgess <aburgess@redhat.com>
Date:   Thu Sep 22 18:57:27 2022 +0100

    gdb/remote: remove some manual reference count handling
    
    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.

Diff:
---
 gdb/remote.c | 38 ++++++++++++++++++++++----------------
 1 file changed, 22 insertions(+), 16 deletions(-)

diff --git a/gdb/remote.c b/gdb/remote.c
index 53c4f19c5a4..614ee069a31 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -4702,7 +4702,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.  */
@@ -4712,26 +4712,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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-12-14 13:57 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-14 13:57 [binutils-gdb] gdb/remote: remove some manual reference count handling Andrew Burgess

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).