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.h | |
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.h')
-rw-r--r-- | gdb/objfiles.h | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 3424055..f0ee803 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -28,12 +28,14 @@ #include "registry.h" #include "gdb_bfd.h" #include "psymtab.h" +#include <atomic> #include <bitset> #include <vector> #include "gdbsupport/next-iterator.h" #include "gdbsupport/safe-iterator.h" #include "bcache.h" #include "gdbarch.h" +#include "gdbsupport/refcounted-object.h" struct htab; struct objfile_data; @@ -399,11 +401,16 @@ private: /* The only way to create an objfile is to call objfile::make. */ objfile (bfd *, const char *, objfile_flags); - /* The only way to free an objfile is via 'unlink'. */ - ~objfile (); - public: + /* Normally you should not call delete. Instead, call 'unlink' to + remove it from the program space's list. In some cases, you may + need to hold a reference to an objfile that is independent of its + existence on the program space's list; for this case, the + destructor must be public so that shared_ptr can reference + it. */ + ~objfile (); + /* Create an objfile. */ static objfile *make (bfd *bfd_, const char *name_, objfile_flags flags_, objfile *parent = nullptr); |