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:
parent
343cc95202
commit
7d7167ce1b
5 changed files with 123 additions and 17 deletions
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue