From 7d7167ce1b93f8bb151daa2572314987eaeb9e3c Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 3 Nov 2019 14:47:55 -0700 Subject: 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 * progspace.h (objfile_list): New typedef. (class unwrapping_objfile_iterator) (struct unwrapping_objfile_range): Newl (struct program_space) : Change type. : Change return type. : Change type of "objfile" parameter. : 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 --- gdb/progspace.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'gdb/progspace.c') diff --git a/gdb/progspace.c b/gdb/progspace.c index 3cb0d4c..1d8aaea 100644 --- a/gdb/progspace.c +++ b/gdb/progspace.c @@ -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, + 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); -- cgit v1.1