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/objfiles.c | |
parent | 343cc95202fce70383551053f2efab09c5e02366 (diff) | |
download | gdb-7d7167ce1b93f8bb151daa2572314987eaeb9e3c.zip gdb-7d7167ce1b93f8bb151daa2572314987eaeb9e3c.tar.gz gdb-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/objfiles.c')
-rw-r--r-- | gdb/objfiles.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 56854cc..81e8212 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -486,7 +486,10 @@ objfile::make (bfd *bfd_, const char *name_, objfile_flags flags_, if (parent != nullptr) add_separate_debug_objfile (result, parent); - current_program_space->add_objfile (result, parent); + /* Using std::make_shared might be a bit nicer here, but that would + require making the constructor public. */ + current_program_space->add_objfile (std::shared_ptr<objfile> (result), + parent); /* Rebuild section map next time we need it. */ get_objfile_pspace_data (current_program_space)->new_objfiles_available = 1; @@ -500,7 +503,6 @@ void objfile::unlink () { current_program_space->remove_objfile (this); - delete this; } /* Free all separate debug objfile of OBJFILE, but don't free OBJFILE |