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

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