aboutsummaryrefslogtreecommitdiff
path: root/gdb/objfiles.h
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-11-03 14:47:55 -0700
committerTom Tromey <tom@tromey.com>2019-12-12 15:50:56 -0700
commit7d7167ce1b93f8bb151daa2572314987eaeb9e3c (patch)
tree6380ce122f3651660f3df3ac30be6b01daf743be /gdb/objfiles.h
parent343cc95202fce70383551053f2efab09c5e02366 (diff)
downloadgdb-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.h13
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);