Skip to content

Commit

Permalink
[lldb] Remove orphaned modules in a loop
Browse files Browse the repository at this point in the history
Summary:

When modules reference each other (which happens for example with the different
modules LLDB loads when debugging -gmodules-compiled binaries), just iterating
over the module list once isn't good enough to find all orphans. Any removed
modules in the module list will also clear up the shared pointers they hold to
other modules, so after any module was removed from the list, LLDB should
iterate again and check if any additional modules can no be safely deleted.

This is currently causing that many gmodules tests are not cleaning up all
allocated modules which causes cleanup asserts to fail (right now these asserts
just mark the test as unsupported, but after D83865 the tests will start
failing).

Reviewers: aprantl, clayborg, JDevlieghere

Reviewed By: JDevlieghere

Differential Revision: https://reviews.llvm.org/D84015
  • Loading branch information
Teemperor committed Jul 20, 2020
1 parent 256aea8 commit 139e2a3
Showing 1 changed file with 17 additions and 7 deletions.
24 changes: 17 additions & 7 deletions lldb/source/Core/ModuleList.cpp
Expand Up @@ -291,14 +291,24 @@ size_t ModuleList::RemoveOrphans(bool mandatory) {
if (!lock.try_lock())
return 0;
}
collection::iterator pos = m_modules.begin();
size_t remove_count = 0;
while (pos != m_modules.end()) {
if (pos->unique()) {
pos = RemoveImpl(pos);
++remove_count;
} else {
++pos;
// Modules might hold shared pointers to other modules, so removing one
// module might make other other modules orphans. Keep removing modules until
// there are no further modules that can be removed.
bool made_progress = true;
while (made_progress) {
// Keep track if we make progress this iteration.
made_progress = false;
collection::iterator pos = m_modules.begin();
while (pos != m_modules.end()) {
if (pos->unique()) {
pos = RemoveImpl(pos);
++remove_count;
// We did make progress.
made_progress = true;
} else {
++pos;
}
}
}
return remove_count;
Expand Down

0 comments on commit 139e2a3

Please sign in to comment.