diff options
author | Tom Tromey <tom@tromey.com> | 2019-11-03 14:47:55 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-12-12 15:50:56 -0700 |
commit | 7d7167ce1b93f8bb151daa2572314987eaeb9e3c (patch) | |
tree | 6380ce122f3651660f3df3ac30be6b01daf743be /gdb/progspace.c | |
parent | 343cc95202fce70383551053f2efab09c5e02366 (diff) | |
download | binutils-7d7167ce1b93f8bb151daa2572314987eaeb9e3c.zip binutils-7d7167ce1b93f8bb151daa2572314987eaeb9e3c.tar.gz binutils-7d7167ce1b93f8bb151daa2572314987eaeb9e3c.tar.bz2 |
Manage objfiles with shared_ptr
This changes objfiles to be managed using a shared_ptr. shared_ptr is
chosen because it enables the use of objfiles in background threads.
The simplest way to do this was to introduce a new iterator that will
return the underlying objfile, rather than a shared_ptr. (I also
tried changing the rest of gdb to use shared_ptr, but this was quite
large; and to using intrusive reference counting, but this also was
tricky.)
gdb/ChangeLog
2019-12-12 Tom Tromey <tom@tromey.com>
* progspace.h (objfile_list): New typedef.
(class unwrapping_objfile_iterator)
(struct unwrapping_objfile_range): Newl
(struct program_space) <objfiles_range>: Change type.
<objfiles>: Change return type.
<add_objfile>: Change type of "objfile" parameter.
<objfiles_list>: Now a list of shared_ptr.
* progspace.c (program_space::add_objfile): Change type of
"objfile". Update.
(program_space::remove_objfile): Update.
* objfiles.h (struct objfile) <~objfile>: Make public.
* objfiles.c (objfile::make): Update.
(objfile::unlink): Don't call delete.
Change-Id: I6fb7fbf06efb7cb7474c525908365863eae27eb3
Diffstat (limited to 'gdb/progspace.c')
-rw-r--r-- | gdb/progspace.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/gdb/progspace.c b/gdb/progspace.c index 3cb0d4c..1d8aaea 100644 --- a/gdb/progspace.c +++ b/gdb/progspace.c @@ -175,16 +175,20 @@ program_space::free_all_objfiles () /* See progspace.h. */ void -program_space::add_objfile (struct objfile *objfile, struct objfile *before) +program_space::add_objfile (std::shared_ptr<objfile> &&objfile, + struct objfile *before) { if (before == nullptr) - objfiles_list.push_back (objfile); + objfiles_list.push_back (std::move (objfile)); else { - auto iter = std::find (objfiles_list.begin (), objfiles_list.end (), - before); + auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (), + [=] (const std::shared_ptr<::objfile> &objf) + { + return objf.get () == before; + }); gdb_assert (iter != objfiles_list.end ()); - objfiles_list.insert (iter, objfile); + objfiles_list.insert (iter, std::move (objfile)); } } @@ -193,8 +197,11 @@ program_space::add_objfile (struct objfile *objfile, struct objfile *before) void program_space::remove_objfile (struct objfile *objfile) { - auto iter = std::find (objfiles_list.begin (), objfiles_list.end (), - objfile); + auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (), + [=] (const std::shared_ptr<::objfile> &objf) + { + return objf.get () == objfile; + }); gdb_assert (iter != objfiles_list.end ()); objfiles_list.erase (iter); |