public inbox for gdb-cvs@sourceware.org help / color / mirror / Atom feed
From: Tom Tromey <tromey@sourceware.org> To: gdb-cvs@sourceware.org Subject: [binutils-gdb] Change registry to use less memory Date: Thu, 28 Jul 2022 20:44:21 +0000 (GMT) [thread overview] Message-ID: <20220728204421.DE5633857C45@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8126c055e453a494a72a44c9cce39fa8ddf14607 commit 8126c055e453a494a72a44c9cce39fa8ddf14607 Author: Tom Tromey <tom@tromey.com> Date: Sat May 28 09:08:47 2022 -0600 Change registry to use less memory The registry code creates "registry_data" objects that hold the free function and the index; then the registry keys refer to this object. However, only the index is really useful, and now that registries have a private implementation, just the index can be stored and we can reduce the memory use of registries a little bit. This also simplifies the code somewhat. Diff: --- gdb/registry.h | 47 ++++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/gdb/registry.h b/gdb/registry.h index cab9f44e3ba..54aad6b7c4d 100644 --- a/gdb/registry.h +++ b/gdb/registry.h @@ -160,7 +160,7 @@ public: } /* The underlying key. */ - const typename registry<T>::registry_data *m_key; + const unsigned m_key; }; /* Clear all the data associated with this container. This is @@ -168,13 +168,16 @@ public: void clear_registry () { /* Call all the free functions. */ - for (const auto &datum : get_registrations ()) + std::vector<registry_data_callback> ®istrations + = get_registrations (); + unsigned last = registrations.size (); + for (unsigned i = 0; i < last; ++i) { - void *elt = m_fields[datum->index]; + void *elt = m_fields[i]; if (elt != nullptr) { - datum->free (elt); - m_fields[datum->index] = nullptr; + registrations[i] (elt); + m_fields[i] = nullptr; } } } @@ -184,50 +187,40 @@ private: /* Registry callbacks have this type. */ typedef void (*registry_data_callback) (void *); - /* The type of a key. */ - struct registry_data - { - unsigned index; - registry_data_callback free; - }; - /* Get a new key for this particular registry. FREE is a callback. When the container object is destroyed, all FREE functions are called. The data associated with the container object is passed to the callback. */ - static const registry_data *new_key (registry_data_callback free) + static unsigned new_key (registry_data_callback free) { - std::unique_ptr<registry_data> result (new registry_data); - std::vector<std::unique_ptr<registry_data>> ®istrations + std::vector<registry_data_callback> ®istrations = get_registrations (); - result->index = registrations.size (); - result->free = free; - registrations.emplace_back (std::move (result)); - return registrations.back ().get (); + unsigned result = registrations.size (); + registrations.push_back (free); + return result; } /* Set the datum associated with KEY in this container. */ - void set (const registry_data *key, void *datum) + void set (unsigned key, void *datum) { - m_fields[key->index] = datum; + m_fields[key] = datum; } /* Fetch the datum associated with KEY in this container. If 'set' has not been called for this key, nullptr is returned. */ - void *get (const registry_data *key) + void *get (unsigned key) { - return m_fields[key->index]; + return m_fields[key]; } /* The data stored in this instance. */ std::vector<void *> m_fields; /* Return a reference to the vector of all the registrations that - have been made. We do separate allocations here so that the - addresses are stable and can be used as keys. */ - static std::vector<std::unique_ptr<registry_data>> &get_registrations () + have been made. */ + static std::vector<registry_data_callback> &get_registrations () { - static std::vector<std::unique_ptr<registry_data>> registrations; + static std::vector<registry_data_callback> registrations; return registrations; } };
reply other threads:[~2022-07-28 20:44 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=20220728204421.DE5633857C45@sourceware.org \ --to=tromey@sourceware.org \ --cc=gdb-cvs@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: linkBe 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).