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
This commit is contained in:
Tom Tromey 2019-11-03 14:47:55 -07:00
parent 343cc95202
commit 7d7167ce1b
5 changed files with 123 additions and 17 deletions

View file

@ -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);